119
Introdução ao NASM e a programação em ambiente Linux Linux Boot Time Programming – Uma Primeira Visão • Modos de Operação dos Processadores da família x86 atuais: • Modo Real • Modo Protegido • Modo Virtual Modo de Gerenciamento

Ass Linux 4

Embed Size (px)

Citation preview

Page 1: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Modos de Operação dos Processadores da família

x86 atuais:

• Modo Real• Modo Protegido• Modo Virtual• Modo de Gerenciamento

Page 2: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Modos de Operação dos Processadores da família

x86 atuais:

• Modo Real• Modo Protegido• Modo Virtual• Modo de Gerenciamento

• Na inicialização, o processador está no Modo Real

Page 3: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Armazenar código em local apropriado, pois quandohouver a mudança para o modo protegido os endereçosfísicos serão gerados de maneira completamente diferente.

• Prepara a Interrupt Descriptor Table(IDT), pois osvetores da IDT são de 8 bytes e os vetores da tabela de vetores de interrupção do DOS são de apenas 4 bytes.

• Executar o código de mudança para o modo protegido.

Page 4: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• O Processador tem um registrador de base e um de limitepara a Global Descriptor Table.Estes registradores sãocarregados com a instrução LGDT mem.

• mem é o endereço base de uma região de 6 bytes quearmazena: 2 bytes de limite + 4 bytes de endereço baseparaGlobal Descriptor Table.

Page 5: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Suponha que queiramos definir umaGlobal Descriptor Tablecom 10 descritores e que o endereço base da GDT é 10000H.

• Como cada descritor tem 4 palavras (8 bytes), a GDT terá80 bytes (50H). Portanto, o limite é 80-1= 79 (50H – 1H = 4FH).

Page 6: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table• Desta forma, usaremos uma área de memória para

armazenar estas informações (limite e endereço base).MOV AX,2000HMOV DS,AXMOV AX,4FHMOV [DS:0],AX ;armazena o limiteMOV EAX,100000HMOV [DS:2],EAX ; armazena o endereço baseLGDT [DS:0] ; carrega os rgistradores de base e de limite

Page 7: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Executa código de mudança para o modo protegido.• Os processadores da família x86 têm um registrador de

controle denominado CR0. Quando o bit 0 desteregistrador é feito 1, o processador muda para o ModoProtegido.

MOV EAX,CR0OR EAX,1MOV CR0,EAX ; muda para o modo protegido

Page 8: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Linux Boot Time Programming –Uma PrimeiraVisão• Preparação para mudar para Modo Protegido:

• Ao mudar para o Modo Protegido o processador nãoinicia a paginação. Tornando o bit 31 do CR0 igual a 1, faz com que se inicie o processo de paginação.

• 31 - PG = Paginação habilitada• 30 - CD = Cache Desabilitada• 29 - NW = No Writethrough• 15 - WP = Write Protection• 2 - EM = Emulate Math chip• 1 - MP = Math chip Present • 0 - PE = Protect Mode Enable

Page 9: Ass Linux 4

Programação de Baixo Nível em Linux

• Programas de Usuário• Pentium suporta segmentação e paginação

• As versões atuais do Linux suportam apenaspaginação.

Aplicaçãodo Usuário

SOMemória

eI/O

Page 10: Ass Linux 4

Programação de Baixo Nível em Linux

• Task State Segment

CR3 (PDBR)EIP

EFLAGSEAXECXEDXEBXESPEBPESIEDI

...

242832364044485256606468

Task register (TR)aponta para o TSS da tarefa executada no momento.

CR3 = Control registerPDBR = Page DiretoryBase Register

Page 11: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação

Não é usada nas operações de acesso a I/O.

� Memória Virtual no Linux

Espaço de endereçamento: 0 – 4Gb

T1

T2

Tn

Sistemade

Paginação

Mem

Disco

0

4Gb0

4Gb

0

4Gb

Page 12: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação

Não é usada nas operações de acesso a I/O.

� Memória Virtual no Linux

Espaço de endereçamento: 0 – 4Gb

Kernel

T1

Tn

Sistemade

Paginação

Mem

Disco

3

4Gb0

3Gb

0

3Gb

Espaçodo

Usuário

Kernel

0

3Gb

4Gb

Visão da Memóriade um processo

Page 13: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• O espaço de endereçamento é dividido em blocos denominados páginas.

• É comum chamar este espaço na memória física (silicio) de page frames.

• Em máquinas x86 as páginas são de 4096 bytes (4Kb)

• Caso a página não se encontre na memória física, um page fault (interrupção) ocorre. O serviço desta interrupção efetua a leitura do disco, o correspondente armazenamento/substituição.

Kernel

T1

Tn

Sistemade

Paginação

Mem

Disco

3

4Gb0

3Gb

0

3Gb

Page 14: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação

• A memória física é dividida empage frames. Dado que cada página tem 4096 byte = 212 =4 Kb = 1000H, toda página inicia em um endereço quetem 3 zeros.

• O espaço virtual de cada tarefa é também dividido em páginas:4Gb ÷ 4Kb = (4 × 230) ÷ (4 × 212) = 220 = 1 Megapáginas.

• A área do disco usada para paginação é também dividida em páginas. Estaárea é denominada área de swap. Dado que a maioria dos discos sãoformatados em setores de 512 bytes, portanto são necessários 8 setorespara armazenar cada página (8 × 512 = 4096).

A área de memória reservada para o kernelserá compartilhada por todasas tarefas.

Page 15: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• Tradução do Endereço (hardwired)

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table 4kb page frame

10 bits 10 bits 12 bits

Page 16: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• Exemplo: enderço virtual 801C3400H

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table

1000000000 0111000011 010000000000

E4000+”000”

01234+”000”

200H1C3H

400H

+ 01234400H

Endereço Físico

Page 17: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

Como cadapage frametem três zeros (000H) na parte inferior do endereço, podemos definir o endereço usando apenas os 20 bitsmais significativos do endereço.

PP – página presente. Quando em 1, significa que a página está na RAMCaso PP=0, podemos ter duas situações: a página pode estar no disco (ocorre page fault)

endereço inválido (ocorre segmentation fault).

Page 18: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

•O fato do espaço de endereçamento do kernel ser compartilhadopor todas as tarefas, pode dar a impressão que a memória do kernel pode ser usada por estas tarefas. Código do usuário só pode ter acessoa esta área via system calls.•O código do usuário é bloqueado por US (user-supervisor) bit.US=1 não bloqueia o acesso. Se US=0, dois bits de pivilégio (do registrador CPL) são analisados. Código do usuáriotem CPL=3.•No Linux: CPL = 0 – tarefas do kernel• CPL = 3 – tarefas do usuário.

Page 19: Ass Linux 4

Programação de Baixo Nível em Linux

• Paginação• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

•Memória onde é próibido a escrita WR =0•Memória onde é possível a escrita WR =1

Page 20: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Segmento de código e dados:• Código

[SECTION] .text• Dados

[SECTION] .data • Exemplo:

global main

[SECTION .text]

main : push ebp

mov ebp,esp

push ebx; Program a dever preservar ebp, ebx, esi, edi

push esi

push edi

MOV AL,[XYZ]

INC AL

MOV [XYZ],AL

pop edi ; Restaura registradores

pop esi

pop ebx

mov esp,ebp

pop ebp

RET

•Definesx db 2y dw 3z dq 4z1 dt 5

byte2 bytes4 bytes10 bytes

[SECTION] .data]

XYZ: db 3

Page 21: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Dados não inicializados

[SECTION .bss]X resb 1Y resb 128Z resq 4

Reservax resb 1y resw 1z resd 1z1 resq 1z2 rest 1

Sintaxe:res(b/w/d/q/t) #de ítens

byte2 bytes4 bytes8 bytes10 bytes

Page 22: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Dados não inicializados[SECTION .text]

global main

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

; sua funcionalidade

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

retABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

[SECTION .bss]X resb 1Y resb 128

Page 23: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Vimos que os programas têm segmentos que devem ser salvos em página diferentes devido aos requisitos de escrita (áreas que podem ser escritas ou não).

• Portanto, estas localizações devem ficar explícitas no arquivo executável para que o SO possa carregar estasáreas em páginas de memória física que respeitem estasrestrições.

• Por estas razões, os arquivos executáveis devem ter um formato definido.

• Desde a versão 2.0 do Linux o formato adotado tem sido o ELF.

Page 24: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Arquivos Executáveis em ELF• ELF –Executable and Linking Format

• SO Unix consideram três formatos paraarquivos executáveis: COFF (Commom Object File Format), a.out (não há relação com o arquivo gerado pelo compilador C) e ELF.

• Nas versões atuais dos SO Unix ELF é o formato mais comum.

Page 25: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Formato ELFELF Header

Segment 1

Segment 2

Segment 3

Segment 4

Program Header Table

Section Header Table

Section 1

Section n

Page 26: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Formato ELF

o Arquivos executáveis do Linux 2.0 tem normalmente pelo menos 5 segmentos (lembrem que estamos falando de áreas e não de segmentação de memória):

o o Segmento 0 é o Program Header. o Os outros são:

o Um para código e informações que não possam/precisem ser alteradasem tempo de execução,

o Um para dados inicializados e que precisam ser alterados ao longo daexecução do programa,

o Um para dados não inicializados eo Um para dados cujo espaço de memória será alocado dinamicamente.

Page 27: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• ELF Headero Identifica o arquivo como um arquivo ELF e especifica o seu tipo.

Também define o tamanho e localização do Program Header Table e daSection Header Table.

o O formato do ELF Headeré:o Primeiro entrada: string de identificação contendo ELF.o Segunda entrada: número que especifica o tipo do arquivo:

1 – arquivo objeto2 – arquivo executável3 – arquivo objecto compartilhado4 – arquivocore

o Terceira entrada: especifica a arquitetura – 3 = arquitetura x86.o Tem-se 11 entradas a mais.

Page 28: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Program Header Tableo O Program Header Tabletem uma entrada para cada segmento.

Cada entrada contém oito ítens de informação.o Type: 1 se o segmento deve ser carregado quando o arquivo é

executado. Os outros tipos não são carregados .o File Offset: fornece a localização do segmento dentro do arquivo –

número de bytes a partir do início do arquivo. o Virtual Address: o endereço onde deve ser armazenado o primeiro

byte do segmento.o Phisical Address: não é considereado na arquitetura x86.o File Size: número de bytes no segmento antes de ser carregado.o Memory Size: número de bytes no segmento depois da carga.o Permissions: este código contém informações relacionadas a

permissões de leitura, escrita e execução.o Aligment: o segmento deve começar em um múltiplo deste número.

Page 29: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Program Header Tableo Permissionsr w x1 1 0 = 6 leitura e escrita1 0 1 = 5 leitura e execução

1 = habilita opção0 = desabilita opção

O programa ob fornece o Program Header Table de um arquivo

Page 30: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Section Header Table• Fornece informações sobre todas as seções do arquivo. As

informações são atibutos sobre permissão (leitura, escrita e execução), tipo (programa, tabela de símbolos, informaçãodinâmica etc)

• Seções• Quando o linker cria segmento de texto/dados (código/dados),

combina seções de texto/dados(código/dados) dos arquivosobjeto.

• Quandolinker liga os arquivos objeto é necessário definir o endereço onde a execução deve ser iniciada. O programador pode faze-lo utilizando o labelmain e tornando-o visível paratodas as seções (linker) através da diretiva global.

Page 31: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Ponto de Entrada[SECTION .text]

global main

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

; sua funcionalidade

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

retABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

[SECTION .bss]X resb 1Y resb 128

Page 32: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Como o gcc constrói arquivos executáveis Linux

gcc

cpp

gas

ld

.c

executável

.c

.s

.o

gcc exe1.c –o exe1

Page 33: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Como usar o gcc em trabalhos com assembly• Evitamos o gas, devido a sintaxe dos mnemonicos

AT&T.

• Usaremos Nasm (assembler) + ferramentas gcc comolinker.

• nasm –f elf exe1.asm - assembler

• gcc exe1.o –o exe1 - linker

Page 34: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Outra informação:• gcc –S nome.c• O comando acima gera um arquivo nome.sque é um assembly

no formato AT&T (você pode investigar este arquivo para compreender como o C “funciona”)

• Exemplo1: no Vmware em /mnt/hgfs/C/teste_pont ,verifique os arquivos

t1.c e t1.s• Exemplo1: no Vmware em /mnt/hgfs/C/teste_pont ,verifique os arquivos

t2.c e t2.s

Page 35: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

sum(a,b,c,d)

Padrão C

Page 36: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

Page 37: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

• Em geral os registradores EBP, EBX, ESI e EDIsão preservados (ou seja, não são usados nas

funções), mas isto não é uma regra.

Page 38: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Retorno de Valores de Funções C

• Valores de 8, 16 e 32 bits são devolvidos em EAX ,

• Valores de 64 bits são devolvidos em EDX:EAX ,

• Valores de ponto flutuante são devolvidos em ST0,

• Endereços (ponteiros) são devolvidos em EAX .

Page 39: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

#include <stdio.h>

extern int increm(int z);

int main(void)

{

int x,y;

x=1;

y=increm(x);

printf("x 'e %d e y e‘ %d\n",x,y);

(0);

}

push ebx ; Program must preserve ebp, ebx, esi, &edipush esipush edi

push dword msg; Push a 32-bit pointer to the message onthe stackcall puts ; Call the C library function for displaying stringsadd esp, 4 ; Clean stack by adjusting esp back 4 bytes

pop edi ; Restore saved registerspop esipop ebx

pop eax ; recovering eax

mov esp,ebp ; Destroy stack frame before returningpop ebpret ; Return control to Linux

[SECTION .data] ; Section containing initialised data

msg: db "Teste!",0

[SECTION .bss] ; Section containing uninitialized data

[SECTION .text] ; Section containing code

extern puts ; Simple "put string" routine from C libraryglobal increm ;Required so linker can find entry point

increm:push ebp ; Set up stack frame for debuggermov ebp,espmov eax,[ebp+8]inc eax ; incrementing the parameter valuepush eax ; pushing the result, since puts might use eax

Não considere o código em vermelho

Page 40: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/teste(teste.c e increm.asm)

no VMWare Mandrake LinuxVeja o arquivo CompilarExecutar:

>mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/teste/increm.asm>gcc -c teste.c -o teste.o>gcc teste.o increm.o -o teste>/mnt/hgfs/C/teste/teste

- c informa ao gcc para para após a compilação (não linkar).

Page 41: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/teste(teste.c e increm.asm)

no VMWare Mandrake LinuxVeja o arquivos makefile:

teste: teste.o increm.ogcc teste.o increm.o -o teste

teste.o: teste.cgcc -c teste.c -o teste.o

increm.o: increm.asm/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/teste/increm.asm

- c informa ao gcc para para após a compilação (não linkar).

Page 42: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução enter

• enter bytes,level• bytes – número de bytes relativos as variáveis locais

da função (procedimento).

• level – nível de aninhamento do procedimento.

Page 43: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução enter

Exemplo:

enter xx,0

Page 44: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução leave

Exemplo:

leave

Page 45: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

Page 46: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Assembly chama bibliotecas C – Escrita em Tela; nasm –f elf exe1.asm

;gcc exe1.o –o exe1

[SECTION .text]

extern puts

global main

main :

push ebp

mov ebp,esp

push ebx

push esi

push edi

push dword mens1

call puts

add esp,4

pop edipop esipop ebxmov esp,ebppop ebpret

[SECTION .data]mens1 db “Bom Teste”,0AH,0

[SECTION .bss]

Page 47: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Assembly chama bibliotecas C –Escrita Formatada em Tela

[SECTION .text]global mainextern printf

main :push epbmov ebp,esppush ebxpush esipush edi

push dword ABCcall printfadd esp,4

mov eax,[XYZ]add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Bom Dia”,0AH,0CDE db “O valor e’ %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4

Page 48: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Inserindo Sub-rotina em Bibliotecas• Crie um arquivo com código fonte e insira a sub-rotina neste

arquivo. O arquivo deve ter a extensão .asm. Este arquivo nãodeve ter ponto de entrada (main).

• Associe o termoglobal a todos oslablesassociados as rotinasque serão chamadas e todos os demaislablesque venha ser utilizados por programas chamadores.

• Caso as sub-rotinas chamem rotinas em bibliotecas C ououtras rotinas em outras bibliotecas que você mesmo tenhacriado, ou ainda usem variáveis ou identificadores definidosfora da rotina, declare tais identificadores comoextern.

Page 49: Ass Linux 4

Introdução ao NASM e a programação em ambiente Linux

• Inserindo Sub-rotina em Bibliotecas• Utlitário makerealiza um conjunto de atividade

descritas no makefile, contudo executando apenas o que foi alterado (verificado pela data de alteração dos arquivos) desde a última execução.

Page 50: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Inserindo Sub-rotina em Bibliotecas• Quando adicionar rotinas de uma biblioteca ao seu programa,

atualize o makefiledeste programa de maneira que o executável tenha as dependências das bibliotecas.

• Exemplo de makefile: textfile: textfile.o linlib.o - dependência

gcc textfile.o linlib.o –o textfile - como obter textfile

textfile.o: testfile.asm -dependência

nasm –f elf textfile.asm - como obter textfile.o

linlib.o: linlib.asm - dependência

nasm –f elf linlib.asm - como obter linlib.o

Page 51: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)no VMWare Mandrake Linux

Veja os arquivos makefile, o fonte ( .asm) e os arquivos CompilarExecutar

Page 52: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

; Build using these commands:

; nasm -f elf eatlinux.asm

; gcc eatlinux.o -o eatlinux

;

[SECTION .text] ; Section containing code

extern puts ; Simple "put string" routine from C library

global main ; Required so linker can find entry point

main:

push ebp ; Set up stack frame for debugger

mov ebp,esp

push ebx ; Program must preserve ebp, ebx, esi, & edi

push esi

push edi

push dword eatmsg ; Push a 32-bit pointer to the message on the stack

call puts ; Call the C library function for displaying strings

add esp, 4 ; Clean stack by adjusting esp back 4bytes

pop edi ; Restore saved registers

pop esi

pop ebx

mov esp,ebp ; Destroy stack frame before returning

pop ebp

ret ; Return control to Linux

[SECTION .data] ; Section containing initialised data

eatmsg: db "Eat at Joe's!",0

[SECTION .bss] ; Section containing uninitialized data

Page 53: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)no VMWare Mandrake Linux

Veja o arquivo CompilarExecutar

>/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/eatlinux/eatlinux.asm>gcc eatlinux.o -o eatlinux>/mnt/hgfs/C/eatlinux/eatlinux

Page 54: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)no VMWare Mandrake Linux

Veja o arquivo makefile:

eatlinux: eatlinux.ogcc eatlinux.o -o eatlinux

eatlinux.o: eatlinux.asm/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/eatlinux/eatlinux.asm

Page 55: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Inserindo Sub-rotina em Bibliotecas• Quando chamar rotinasassemblycontidas em um arquivo de

um programa C (em outro arquivo), atualize o makefilede maneira que o executável tenha as dependências das bibliotecas.

• Exemplo de makefile: textfile: textfile.o linlib.o - dependência

gcc textfile.o linlib.o –o textfile - como obter textfile

textfile.o: testfile.c -dependência

gcc –c textfile.c –o textfile.o - como obter textfile.o

linlib.o: linlib.asm - dependência

nasm –f elf linlib.asm - como obter linlib.o

- c informa ao gcc para para após a compilação (não linkar).

Page 56: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Veja exemplo em:/mnt/hgfs/C/teste(teste.c e increm.asm)

no VMWare Mandrake Linux

Veja os arquivos makefile os fontes (.c e .asm) e os arquivos CompilarExecutar

Page 57: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Assembly chama bibliotecas C – Leitura do Tecladocom fgets

• Manipuladores de Arquivo Padrão:• stdin (teclado)

• stdout (tela)

• stderr (tela)

• Para utilizar um manipulador no seu código assembly, declare-o com externo.

Page 58: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Assembly chama bibliotecas C – Leitura do Tecladocom fgets• Como usar o fgets

• Declare: extern fgetse extern stdin

• Declare um buffer(use a diretivaresb) em uma seção [.bss] de tamanho suficiente para armazenar o dado.

• Empilhe o manipulador, o valor que representa o número máximode carateres a serem lidos e o endereço do bufferonde queremosarmazenar as informações.

Page 59: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Assembly chama bibliotecas C –Leitura do Teclado com fgets

[SECTION .text]global mainextern stdinextern fgets

main :push ebpmov ebp,esppush ebxpush esipush edipush dword [stdin]push dword 72push instringcall fgetsadd esp,12ret

[SECTION .data]

[SECTION .bss]instring resb 96

Page 60: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux Leitura do Teclado com scanf

[SECTION .text]global mainextern printfextern scanf

main :push epbmov ebp,esppush ebxpush esipush edi

push dwordABCcall printfadd esp,4push dwordXYZpush dwordBCDcall scanf

add esp,8mov eax,[XYZ]add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

Page 61: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Chamando C do Assembler[SECTION .text]

global mainextern printfextern scanf

main :push epbmov ebp,esppush ebxpush esipush edi

push dword ABCcall printfadd esp,4

push dword XYZ

push dword BCDcall scanf

add esp,8mov eax,[XYZ]add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

Page 62: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C• Está estabelecido que a “Era” Unix iniciou-

se em 1 de Janeiro de 1970 as 00:00:00 hs• A cada segundo que se passa adiciona-se 1 a

este valor.• Quando você ler o tempo ou uma data

através de bibliotecas do C, você obtêm o número atual desta associado a uma variável.

• Esta variável é denominadatime_t.• Para obter o valor de time_t, chama-se a

funçãotime.

Page 63: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C• A funçãotimepode retornar valores de duas

maneiras:• em EAX• em um bufferque você tenha definido

• Para ter o tempo armazenado no buffervocêtem que passar o ponteiro do endereço inicialdo buffercomo parâmentro (via pilha).

• Se você não quer armazenar o tempo no buffer, você tem que passar um ponteiro nulo(0) como parâmetro.

Page 64: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global mainextern time

main :push epbmov ebp,esp

push ebxpush esipush edi

push dword 0call timeadd esp,4mov [oldtime],eax

pop edipop esipop ebxmov esp,ebp

pop ebpret

[SECTION .data]

…[SECTION .bss]oldtime resb 4

Page 65: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C• Existe uma função que converte o valor

obtido portimeem umastring formatadacomo o exemplo: Thu Dec 2 13:59:20 1999

• Esta função é ctime.

• Para usa-la você deve passar o endereço davariável que tem a informação do tempo.

Page 66: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global mainextern timeextern ctime

main :push epbmov ebp,esp

push ebxpush esipush edi

push dword 0call timeadd esp,4mov [oldtime],eax

push dword oldtime ;empilha-se o endereço; de oldtime

call ctime ; retorna um ponteiro; para a string em EAX

add esp,4…

pop edi pop esipop ebxmov esp,ebp

pop ebpret[SECTION .data]

…[SECTION .bss]oldtime resb 4

Page 67: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C• Há uma estrutura que agrupa nove informações de 32 bits

relacionadas com o tempo: a estruturatm.• Valores contidos na estruturatm:

• offset em bytes C library name Definição0 tm_sec segundos4 tm_min minutos8 tm_hour horas

12 tm_mday dia do mês16 tm_mon mês20 tm_year ano24 tm_wday dia da semana28 tm_yday dia do ano32 tm_isdst flag paradaylight savings

Page 68: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C• Há uma estrutura que agrupa nove informações de 32

bits relacionadas com o tempo: a estruturatm.

• Para obter as informações de tempo através daestruturatm, chama-se a funçãolocaltime.

• Passa-se time_tcomo parâmetro (via pilha).

• localtimeretorna um ponteiro em EAX que apontapara o endereço base da estruturatm.

Page 69: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global mainextern timeextern localtimeextern printf

main :push epbmov ebp,esppush ebxpush esipush edi

push dword 0call timeadd esp,4mov [oldtime],eax

push dword oldtimecall localtimeadd esp,4mov edx, dword[eax+20]push edxpush dword yrmsgcall printfadd esp,8…pop edi pop esipop ebxmov esp,ebp

pop ebpret[SECTION .data]yrmsg db “O ano e’19%d.”,10,0

[SECTION .bss]oldtime resb 4

Page 70: Ass Linux 4

Introdução à Integração C e Assemblyem ambiente Linux

Ponto Flutuante

Page 71: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS:00080000H]Seletor de 16 bits Offsetde 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

Σ32 bitbase address

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

Page 72: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido• Registradores Seletores:

• CS,DS,ES,FS,GS,SS

• Layout do Seletor:

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

Page 73: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido• Layout do Seletor:

• Ex.:MOV AX,33H

MOV DS,AX

MOV EAX,[DS:00080000H]

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

Como cada segment descriptortem 8 bytes, o 3 bits LSB dos seletores são desprezados.

Page 74: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido• Layout do Seletor:

• Ex.:MOV AX,33H

MOV DS,AX

MOV EAX,[DS:00080000H]

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

0 0 3 3 H

0000 0000 0011 0011 b

0000 0000 0011 0000 = 0030 H

Page 75: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS:00080000H]Seletor de 16 bits Offsetde 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

Σ32 bitbase address

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

Page 76: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:

Segment Descriptor Base Address

15 0

Segment limit

Base Address(16-23)

Base Address(24-31)

P DPL Outras Inform.

Outras Inform.

P – segmento presente em memóriaDPL – nível de privilégio

Palavra 0

Palavra 1

Palavra 2

Palavra 3

Page 77: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:Endereço

0000000H

2000000H

20FFFFFH

3FFFFFFH

Base: 2000000HLimite: 00FFFFFH

64Mb RAM

Segmento de 1MB

MOV EAX,[DS:80000H]

Σ 2080000H...

2080003H

80003H < FFFFFH OK

Page 78: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:Endereço

0000000H

2000000H

20FFFFFH

3FFFFFFH

Base: 2000000HLimite: 00FFFFFH

64Mb RAM

Segmento de 1MB

MOV EAX,[DS:180000H]

Σ 2180000H...

2180003H

180003H > FFFFFH General Protection Fault

Page 79: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:• No LINUX atual a base é 0H e o limite é

FFFFFFFFH, ou seja 4GB.

• Na prática: temos um único segmento.

Base: 00000000HLimite: FFFFFFFFH

Page 80: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:

Base: 00000000HLimite: FFFFFFFFH

MOV EAX,[DS:180000H]

Σ 00180000H...

00180003H

180003H < FFFFFFFFH OK

Page 81: Ass Linux 4

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS: 801C3400H]Seletor de 16 bits Offsetde 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

Σ32 bitbase address=00000000H

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

Endereço Virtual= 801C3400H

Page 82: Ass Linux 4

Endereçamento de Memória

• Paginação• Exemplo: enderço virtual 801C3400H

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table

1000000000 0111000011 010000000000

E4000+”000”

01234+”000”

200H1C3H

400H

+ 01234400H

Endereço Físico

Page 83: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido• No Petium o reconhecimento de uma interrupção é

sinalizada por D/C# = 0, M/IO# = 0 e W/R# = 0.

• Após o reconhecimento o Contolador coloca na partemenos significativa do barramento de dados um número de 8 BITS.

• O processador utiliza este número como um índicepara uma tabela denominadaInterrupt Descriptor Table (ITD). Esta tabela contém os endereços para osserviços de interrupção.

Page 84: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido• Dado que o número de uma interrupção é uma

informação de 8 bits, os números válidos de umainterupção variam de 0 a 255.

• A criação e carga desta tabela é responsbilidade do SO. Esta tarefa é executa na inicialização do sistema(boot time)

• Processadores da arquitetura x86 têm um registradorespecífico que armazena o endereço da ITD, o registrador IDT.

Page 85: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido• Existem instruções especiais para manipular o

registrador IDT:• LIDT mem

Carrega o registrador com um enderço.Esta instrução é utilizada na inicialização do sistema,

após a IDT ter sido criada, de maneira que o registrador IDT terá o endereço base da tabela IDT.

• SIDT memArmazena o valor do registrador na memória.

Page 86: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo ProtegidoEndereço

b gate # 0

b+8 gate # 1

b+16 gate # 2

b+24 gate # 3

.

.

.

b+2040 gate # 255

Registrador IDT tem valor igual a b

Page 87: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido• Uma vez obtido o endereço da rotina de serviço de

interrupção (ISR), o processador empilha o endereçoda próxima instrução e o registrador EFLAGS.

• Quando o ISR é finalizada, o que é feito através do IRET, o registrador EFLAGS são desempilhados, assim como o endereço de retorno.

• As solicitações de interrupção só serão aceitas se IF =1. As instruções STI e CLI habilitam e desabilitamas interrupções, respectivamente.

Page 88: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido• No final da execução do serviço de interrupção, no PC – que

usa um PIC 8259 -, o programador envia um comando de fimde interrupção (EOI) para o PIC. Este comando é executadoescrevendo-se no endereço 20h um valor informando a finalização da interrupção de número especificado. Podemosefetuar uma finalização genérica (sem determinar umainterrupção específica). Fazemos isto enviando o valor 20h(ver datasheetdo PIC 8259).

• Ex.: mov dx,20h ; um endereço de controle da 8259 mestre no PC

out dx,20h ; EOI genérica

mov dx,0A0h ;um endereço de controle do 8259 escravo.

out dx,20h ; EOI genérica

Page 89: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido• NMI (non maskable interrupt) é a interrupção de

número 2.• É não mascarável (não considera o IF).• No PC é utilizada para tratar erros de paridade.

• O RESET pode ser considerado uma interrupção.• Quando ocorre, executa-se o código do endereço

FFFFFFF0h, endereço contido na BIOS.

Page 90: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido

Circuito Controlador de Interrupção ISA

8259Mestre 8259

Escravo

IRQ0IRQ1IRQ3IRQ4IRQ5IRQ6IRQ7

IRQ8IRQ9IRQ10IRQ11IRQ12IRQ13IRQ14IRQ15

Page 91: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido

• Interrupções de Software• INT imm

imm é um valor de 8 bits que é usado para obter o enderço da ISR correspondente.

Page 92: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido• Interrupções de Hardware Internas (Exceptions)

• Quando uma interrupção de hardware ou de software é finalizada, a próxima instrução a ser executada é aquela instrução subseqüente a insturção interrompida. Com as Exceptionsnem sempre é assim.

• Quando se encerra a execução da maioria das Exeptions, a instruçãointerrompida é novamente executada. EstasExceptionssãodenominadas de faults.

• Faults: quando uma instrução de movimentação tenta ler umainformação qua não se encontra na memória principal (se encontra no disco), ocorre umafault. Após a execução da ISR correspondente, a instrução de movimentação é novamente executada.

• PoucasExceptionsse comportam com intrrupções ordinárias, ou sejapassam o controle para a próxima instrução. Estas são chamadas de traps.

• Traps: um exemplo típico é a Exception overflow.

Page 93: Ass Linux 4

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

• Interrupções no Modo Protegido• System Calls

• Uma das funções básicas de SO é prover acesso a dispositivos de hardware.

• No UNIX todo acesso a dispositivos de hardware é feitovia chamada a system calls.

• Normalmente, os usuários têm acesso a estes dispositivosatravés de comandos UNIX tais quais ls, cp etc ou via funções C – printf, scanf etc. Contudo, tanto os comandosUNIX, assim como as funções C utilizamsystem callspara se ter acesso ao hardware.

Page 94: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

Funções C

ComandosUNIX

SystemCalls

SO Hardware

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 95: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

os comandos read() e write() são exemplos de system calls, embora pareçam ser funções ordinárias do C.

• Exemplo:

void main(void) {char s[] = “Hello World! \n”;

write(1,s,13);}

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 96: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

void main(void) {

char s[] = “Hello World! \n”;

write(1,s,13);

}

• Como todas as system callsem LINUX, write() usa INT 80hpara transferir o controle para o kernel.

• Toda system callno LINUX tem um número

• A lista destas chamadas e os respectivos números podem ser encontradas em/usr/include/bits/syscall.h

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

syscall unistd

Page 97: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

void main(void) {char s[] = “Hello World! \n”;

write(1,s,13);}

• No LINUX 2.0 a system calls write() tem número 4.• Para executar estasystem callemassemblyo valor 4

deve ser armazenado em EAX antes de chamar INT 80h.

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 98: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

void main(void) {char s[] = “Hello World! \n”;

write(1,s,13);}

• Para usar as system calls em assembly, é necessário conhecer o padrãopara passagem de parâmetros. Este padrão está estabelecido em macroslocalizadas em/usr/include/bits/syscall.h

• De acordo com a norma utilizada no LINUX 2.2, os parâmentros sãoarmazenados, da esquerda para a direita, nos registradoresEBX,ECX,EDX,ESI e EDI.

• Em caso de mais argumentos, um ponteiro em EBX é passado para uma estrutura com os argumentos.

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 99: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

void main(void) {char s[] = “Hello World! \n”;

write(1,s,13); } systemcall\asmtut\quickstart.html

global main systemcall\asmtut\syscalls.htmlmain: …

mov eax,4 Uma lista das macro de chamadasmov ebx,1 das funções pode ser encontrada nomov ecx, dword ABC arquivo /usr/include/bits/syscall.hmov edx,13 (pode ser alterado dependendoint 80h da versão e distribuição).ret

ABC db “Hello World!”,0Ah,0

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Ver exemplos em SysCall:write.coutro1.asm, outro2.asm,outro3.asm eponteiro.asm

Page 100: Ass Linux 4

[section .data]hello db 'Hello, world!',10helloLen equ $ - hello

[section .text]global _start

_start: pop ebxpop ebxpop ebxmov eax,8mov ecx,00644Qint 80htest eax,eaxjs skipWritecall fileWrite

skipWrite: mov ebx,eax

mov eax,1int 80h

; proc fileWrite - write a string to a file fileWrite:

mov ebx,eax mov eax,4 mov ecx,hello mov edx,helloLen int 80h mov eax,6 int 80h ret

; endp fileWrite

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 101: Ass Linux 4

� Acesso ao I/O� int ioperm(unsigned long from,unsigned long num, int turn_on);

� unsigned long from : endereço inicial dos endereços das portas

� unsigned long num : deslocamento

� int turn_on : 1 = habilita e 0 = desabilita

� Faixa de Endereço das portas: até 3FFh

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 102: Ass Linux 4

� Acesso ao I/OC:ioperm(0x378,4,1); // ativa permissão

ioperm(0x378,4,0); // desativa permissão

Assembly:mov eax,101 mov eax,101

mov ebx,0x378 mov ebx,0x378

mov ecx,4 mov ecx,4

mov edx,1 mov edx,0

int 0x80 int 0x80

Ativa permissão Desativa permissão

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 103: Ass Linux 4

� Acesso ao I/OC:ioperm(0x378,4,1); // ativa permissão

outb(0x10,0x378);

ioperm(0x378,4,0); // desativa permissão

Assembly:mov eax,101 mov eax,101

mov ebx,0x378 mov ebx,0x378

mov ecx,4 mov ecx,4

mov edx,1 mov edx,0

int 0x80 int 0x80

mov al,0x10

out 0x378,al

Ativa permissão e escreve Desativa permissão

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 104: Ass Linux 4

� Acesso ao I/O� int ioctl(int level);

� int level = nível

� Endereço das portas: todas as portas (65 535 endereços)

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 105: Ass Linux 4

• Interrupções no Modo Protegido• System Calls

• Quando umasystem callé executada pelo processador é porquê o programa necessita utilizar o kernelpara realizaralguma tarefa que não está habilitado a faze-lo. Porexemplo, ler um arquivo, escrever no monitor etc.

• O programa é incapaz de realizar estas tarefas, pois o processador está bloqueado para realiza-las enquantoestiver executando código de usuário.

• A diferença entre código de usuário e código do kernelé a diferença de nível de privilégio.

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 106: Ass Linux 4

• Interrupções no Modo Protegido• System Calls -Privilégios

• Desde o 286 o sistema de proteção é baseado em 4 níveisde privilégio:

• 0 – privilégio no nível de sitema – usado pelokerneldo LINUX

• 1 – não usado no LINUX• 2 – não usado no LINUX• 3 – privilégio de usuário- usado por programas de

usuário do LINUX.

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 107: Ass Linux 4

• Interrupções no Modo Protegido• System Calls -Privilégios

• O nível de privilégio do código em execução é denominadocurrent privilege level. Esta informação é armazenada em um registrador de 2 bits denominadoregistrado CPL.

• Alterar o valor do registrador CPL para 0 “destroi” a proteção do sistema.

• Atibui-se 0 ao registrador CPL toda vez que umasystem call é executada.

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 108: Ass Linux 4

• Interrupções no Modo Protegido• System Calls -Privilégios

• O uso da instrução LIDT pode alterar o valor do registrador IDT, alterando o acesso a tabela de interrupções para uma outra tabela de interrupções (no novo endereço do registrador IDT). Este é um exemplo de uma instrução privilegiada. Instruções privilegiadas sópodem ser executadas se CPL=0.

• Caso se tente executar uma instrução privilegiada com CPL>0, umaExceptioné gerada (general protection error).

Introdução à Integração C e Assembly e chamadas às System Callsem ambiente Linux

Page 109: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido –Gate LayoutEndereço

b gate # 0

b+8 gate # 1

b+16 gate # 2

b+24 gate # 3

.

.

.

b+2040 gate # 255

Registrador IDT tem valor igual a b

End. ISR 2Bytes MSB

TipoEnd. ISR 2Bytes LSB

Gate Layout

63 48 44 43 40 39 16 15 0

Page 110: Ass Linux 4

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• Valor de 4 bits que define o tipo (bits 40-43)

• Endereço da ISR é obtido nas duas faixas: bits 48-63 e 0-15, totalizando32 bits de endereço.

• Interrupt gatessão usadas para interrupções de hardware. Trap gatessãousadas parasystem calls (INT 80h).

• Os valores do campo tipo podem ser 14 = interrupt gateou 15 = trap gate.

• Se o valor do campo tipo é 14 então IF = 0. Caso o valor do campo tiposeja 15, o IF não é resetado.

End. ISR 2Bytes MSB

TipoEnd. ISR 2Bytes LSB

Gate Layout

63 48 44 43 40 39 16 15 0

Page 111: Ass Linux 4

Interrupções

• Interrupções no Modo Protegido

• O próximo passo no processamento de uma interrupção é armazenar 0 no registrado CPL.

• O valor original do registrador CPL é restaurado quando o IRET for executado.

• Antes de desviar para a ISR, o endereço de retorno é emplilhado. O novo valor de EIP é carregado dos campos de endereço do respectivogate.

Page 112: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Modos de Operação dos Processadores da família

x86 atuais:

• Modo Real

• Modo Protegido• Modo Virtual• Modo de Gerenciamento

Page 113: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Modos de Operação dos Processadores da família

x86 atuais:

• Modo Real

• Modo Protegido• Modo Virtual• Modo de Gerenciamento

• Na inicialização, o processador está no Modo Real

Page 114: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Armazenar código em local apropriado, pois quandohouver a mudança para o modo protegido os endereçosfísicos serão gerados de maneira completamente diferente.

• Prepara a Interrupt Descriptor Table(IDT), pois osvetores da IDT são de 8 bytes e os vetores da tabela de vetores de interrupção do DOS são de apenas 4 bytes.

• Executar o código de mudança para o modo protegido.

Page 115: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• O Processador tem um registrador de base e um de limitepara a Global Descriptor Table.Estes registradores sãocarregados com a instrução LGDT mem.

• mem é o endereço base de uma região de 6 bytes quearmazena: 2 bytes de limite + 4 bytes de endereço baseparaGlobal Descriptor Table.

Page 116: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Suponha que queiramos definir umaGlobal Descriptor Tablecom 10 descritores e que o endereço base da GDT é 10000H.

• Como cada descritor tem 4 palavras (8 bytes), a GDT terá80 bytes (50H). Portanto, o limite é 80-1= 79 (50H – 1H = 4FH).

Page 117: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Desta forma, usaremos uma área de memória paraarmazenar estas informações (limite e endereço base).

MOV AX,2000H

MOV DS,AX

MOV AX,4FH

MOV [DS:0],AX ;armazena o limite

MOV EAX,100000H

MOV [DS:2],EAX ; armazena o endereço base

LGDT [DS:0] ; carrega os rgistradores de base e de limite

Page 118: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Executa código de mudança para o modo protegido.• Os processadores da família x86 têm um registrador de

controle denominado CR0. Quando o bit 0 desteregistrador é feito 1, o processador muda para o ModoProtegido.

MOV EAX,CR0OR EAX,1MOV CR0,EAX ; muda para o modo protegido

Page 119: Ass Linux 4

Linux Boot Time Programming

• Uma Primeira Visão• Preparação para mudar para Modo Protegido:

• Ao mudar para o Modo Protegido o processador nãoinicia a paginação. Tornando o bit 31 do CR0 igual a 1, faz com que se inicie o processo de paginação.

• 31 - PG = Paginação habilitada

• 30 - CD = Cache Desabilitada

• 29 - NW = No Writethrough

• 15 - WP = Write Protection

• 2 - EM = Emulate Math chip

• 1 - MP = Math chip Present

• 0 - PE = Protect Mode Enable