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
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
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.
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.
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).
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
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
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
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
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
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
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
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
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.
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
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
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).
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.
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
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
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
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
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.
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.
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
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.
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.
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.
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
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.
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
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
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
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
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
Introdução à Integração C e Assemblyem ambiente Linux
• Passagem de Parâmetros em Funções C
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.
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 .
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
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).
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).
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.
Introdução à Integração C e Assemblyem ambiente Linux
• Passagem de Parâmetros em Funções C
• Instrução enter
Exemplo:
enter xx,0
Introdução à Integração C e Assemblyem ambiente Linux
• Passagem de Parâmetros em Funções C
• Instrução leave
Exemplo:
leave
Introdução à Integração C e Assemblyem ambiente Linux
•
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]
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
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.
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.
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
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
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
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
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
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).
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
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.
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.
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
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
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
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.
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.
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
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.
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
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
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.
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
Introdução à Integração C e Assemblyem ambiente Linux
Ponto Flutuante
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
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
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.
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
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
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
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
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
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
Endereçamento de Memória
• Segmentação no Modo Protegido:
Base: 00000000HLimite: FFFFFFFFH
MOV EAX,[DS:180000H]
Σ 00180000H...
00180003H
180003H < FFFFFFFFH OK
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
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
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.
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.
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.
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
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.
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
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.
Interrupções
• Interrupções no Modo Protegido
Circuito Controlador de Interrupção ISA
8259Mestre 8259
Escravo
IRQ0IRQ1IRQ3IRQ4IRQ5IRQ6IRQ7
IRQ8IRQ9IRQ10IRQ11IRQ12IRQ13IRQ14IRQ15
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.
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.
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.
• 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
• 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
• 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
• 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
• 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
• 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
[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
� 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
� 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
� 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
� 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
• 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
• 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
• 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
• 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
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
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
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.
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
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
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.
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.
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).
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
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
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