• Modo Real
• Modo Protegido
• Modo Virtual
• Modo de Gerenciamento
Introdução ao NASM e a
programação em ambiente Linux
• 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
• Programas de Usuário
• Pentium suporta segmentação e paginação
• As versões atuais do Linux suportam apenas
paginação.
Memória
Aplicação e
SO
do Usuário I/O
Programação de Baixo Nível em
Linux
• Task State Segment
24
…
28 CR3 (PDBR)
32 EIP Task register (TR)
EFLAGS
36
EAX
aponta para o TSS da
40
44 ECX tarefa executada no
EDX
48
EBX
momento.
52
56 ESP
CR3 = Control register
60 EBP
PDBR = Page Diretory
64 ESI
Base Register
68 EDI
...
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
0
T1 Mem
4Gb
Sistema
0
de
T2 Paginação
4Gb
0 Disco
Tn
4Gb
Programação de Baixo Nível em
Linux
Visão da Memória
• Paginação de um processo
0
Não é usada nas operações de acesso a I/O.
Memória Virtual no Linux Espaço
do
Espaço de endereçamento: 0 – 4Gb
Usuário 3Gb
3
Kernel Mem Kernel
4Gb
4Gb
Sistema
0
de
T1 Paginação
3Gb
0 Disco
Tn
3Gb
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.
3
Kernel Mem
4Gb Sistema
0 de
T1 Paginação
3Gb
0 Disco
Tn
3Gb
Programação de Baixo Nível em
Linux
• Paginação
• A memória física é dividida em page frames. Dado que cada página tem
4096 byte = 212 =4 Kb = 1000H, toda página inicia em um endereço que
tem 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ão
formatados em setores de 512 bytes, portanto são necessários 8 setores
para armazenar cada página (8 × 512 = 4096).
A área de memória reservada para o kernel será compartilhada por todas
as tarefas.
Programação de Baixo Nível em
Linux
• Paginação
• Tradução do Endereço (hardwired)
CR3
Page Table Table (Page Directory) Page Table 4kb page frame
Programação de Baixo Nível em
Linux
• Paginação
• Exemplo: enderço virtual 801C3400H
400H
200H
1C3H
01234+”000”
Endereço Físico
E4000+”000” + 01234400H
CR3
Page Table Table (Page Directory) Page Table
Programação de Baixo Nível em
Linux
• Paginação
• Entradas das Page (Table) Table
31 12 11 2 1 0
U W P
Endereço da página
S R P
Como cada page frame tem três zeros (000H) na parte inferior do
endereço, podemos definir o endereço usando apenas os 20 bits
mais significativos do endereço.
• Paginação
• Entradas das Page (Table) Table
31 12 11 2 1 0
U W P
Endereço da página
S R P
• Paginação
• Entradas das Page (Table) Table
31 12 11 2 1 0
U W P
Endereço da página
S R P
Reserva
x resb 1 byte
y resw 1 2 bytes
z resd 1 4 bytes
z1 resq 1 8 bytes
z2 rest 1 10 bytes
Introdução ao NASM e a
programação em ambiente Linux
• Dados não inicializados
[SECTION .text] ret
global main ABC db “Entre um número”,0AH,0
main : BCD db “%d \x0”, 0AH,0
CDE db “Voce obteve %d. \x0”,0AH,0
push epb
mov ebp,esp [SECTION .data]
push ebx XYZ db 4 * 0
push esi
push edi [SECTION .bss]
X resb 1
; sua funcionalidade Y resb 128
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
Introdução ao NASM e a
programação em ambiente Linux
• Formato ELF
ELF 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
• ELF Header
o 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 da Section 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 objeto
2 – arquivo executável
3 – arquivo objecto compartilhado
4 – arquivo core
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
1 = habilita opção
0 = desabilita opção
cpp
.c
gcc
.s
gas
.o
ld
executável
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 como
linker.
• 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 Assembly
em ambiente Linux
Padrão C
Introdução à Integração C e Assembly
em ambiente Linux
• 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 Assembly
em ambiente Linux
• Instrução enter
Exemplo:
enter xx,0
Introdução à Integração C e Assembly
em ambiente Linux
• Instrução leave
Exemplo:
leave
Introdução à Integração C e Assembly
em ambiente Linux
•
Introdução à Integração C e Assembly
em ambiente Linux
• Assembly chama bibliotecas C – Escrita em Tela
; nasm –f elf exe1.asm
pop edi
;gcc exe1.o –o exe1 pop esi
[SECTION .text] pop ebx
extern puts mov esp,ebp
global main pop ebp
ret
main :
[SECTION .data]
push ebp mens1 db “Bom Teste”,0AH,0
mov ebp,esp
push ebx
push esi [SECTION .bss]
push edi
push dword mens1
call puts
add esp,4
Introdução à Integração C e Assembly
em ambiente Linux
; Build using these commands: add esp, 4 ; Clean stack by adjusting esp back 4
; nasm -f elf eatlinux.asm bytes
; gcc eatlinux.o -o eatlinux
;
pop edi ; Restore saved registers
pop esi
[SECTION .text] ; Section containing code
pop ebx
extern puts ; Simple "put string" routine from C mov esp,ebp ; Destroy stack frame before returning
library pop ebp
global main ; Required so linker can find entry point
ret ; Return control to Linux
main:
push ebp ; Set up stack frame for debugger
mov ebp,esp [SECTION .data] ; Section containing
push ebx ; Program must preserve ebp, ebx, esi, & edi initialised data
push esi
push edi eatmsg: db "Eat at Joe's!",0
push dword eatmsg ; Push a 32-bit pointer to the message on the stack
[SECTION .bss] ; Section containing
call puts ; Call the C library function for displaying strings
uninitialized data
Introdução à Integração C e Assembly
em ambiente Linux
add esp,8
[SECTION .text] mov eax,[XYZ]
global main add eax,eax
extern printf inc eax
extern scanf push eax
main : push dword CDE
push epb call printf
mov ebp,esp add esp,8
pop edi
push ebx
pop esi
push esi
pop ebx
push edi mov esp,ebp
pop ebp
push dword ABC
ret
call printf
ABC db “Entre um número”,0AH,0
add esp,4
BCD db “%d \x0”, 0AH,0
push dword XYZ CDE db “Voce obteve %d. \x0”,0AH,0
push dword BCD
call scanf [SECTION .data]
XYZ db 4 * 0
Introdução à Integração C e Assembly
em ambiente Linux
add esp,8
• Chamando C do Assembler mov eax,[XYZ]
[SECTION .text] add eax,eax
global main inc eax
extern printf push eax
extern scanf push dword CDE
main : call printf
push epb add esp,8
mov ebp,esp pop edi
push ebx pop esi
push esi pop ebx
push edi mov esp,ebp
pop ebp
push dword ABC ret
call printf ABC db “Entre um número”,0AH,0
add esp,4 BCD db “%d \x0”, 0AH,0
push dword XYZ CDE db “Voce obteve %d. \x0”,0AH,0
push dword BCD
call scanf [SECTION .data]
XYZ db 4 * 0
Introdução à Integração C e Assembly
em ambiente Linux
Ponto Flutuante
Endereçamento de Memória
• Layout do Seletor:
Base: 2000000H
Limite: 00FFFFFH 2000000H
Σ 2080000H Segmento de 1MB
20FFFFFH
...
2080003H
MOV EAX,[DS:80000H]
3FFFFFFH
Base: 2000000H
Limite: 00FFFFFH 2000000H
Σ 2180000H Segmento de 1MB
20FFFFFH
...
2180003H
MOV EAX,[DS:180000H]
3FFFFFFH
Base: 00000000H
Limite: FFFFFFFFH
Endereçamento de Memória
Base: 00000000H
Limite: FFFFFFFFH
Σ 00180000H
...
00180003H
MOV EAX,[DS:180000H]
• Paginação
• Exemplo: enderço virtual 801C3400H
400H
200H
1C3H
01234+”000”
Endereço Físico
E4000+”000” + 01234400H
CR3
Page Table Table (Page Directory) Page Table
Endereçamento de Interrupções
IRQ0
IRQ1 IRQ8
IRQ3 IRQ9
8259 IRQ10
Mestre
IRQ4 8259 IRQ11
IRQ5 IRQ12
IRQ6
Escravo IRQ13
IRQ14
IRQ7 IRQ15
• Interrupções de Software
• INT imm
imm é um valor de 8 bits que é usado para obter o
enderço da ISR correspondente.
Interrupções
Funções C
System
SO Hardware
Calls
Comandos
UNIX
Introdução à Integração C e Assembly e
chamadas às System Calls em ambiente Linux
write(1,s,13);
}
Introdução à Integração C e Assembly e
chamadas às System Calls em ambiente Linux
write(1,s,13);
}
• Como todas as system calls em LINUX, write() usa INT 80h
para transferir o controle para o kernel.
• Toda system call no LINUX tem um número
• A lista destas chamadas e os respectivos números podem ser
encontradas em /usr/include/bits/syscall.h syscall unistd
Introdução à Integração C e Assembly e
chamadas às System Calls em ambiente Linux
write(1,s,13);
}
• No LINUX 2.0 a system calls write() tem número 4.
• Para executar esta system call em assembly o valor 4
deve ser armazenado em EAX antes de chamar INT
80h.
Introdução à Integração C e Assembly e
chamadas às System Calls em ambiente Linux
write(1,s,13);
}
• Para usar as system calls em assembly, é necessário conhecer o padrão
para passagem de parâmetros. Este padrão está estabelecido em macros
localizadas em /usr/include/bits/syscall.h
• De acordo com a norma utilizada no LINUX 2.2, os parâmentros são
armazenados, da esquerda para a direita, nos registradores
EBX,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 Calls em ambiente Linux
Ver exemplos em SysCall:
• Interrupções no Modo Protegido
write.c
• System Calls
outro1.asm,
void main(void) {
outro2.asm,
char s[] = “Hello World! \n”;
outro3.asm e
ponteiro.asm
write(1,s,13);
} systemcall\asmtut\quickstart.html
global main systemcall\asmtut\syscalls.html
main: …
mov eax,4 Uma lista das macro de chamadas
mov ebx,1 das funções pode ser encontrada no
mov ecx, dword ABC arquivo /usr/include/bits/syscall.h
mov edx,13 (pode ser alterado dependendo
int 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 Calls em ambiente Linux
[section .data] mov eax,1
hello db 'Hello, world!',10
int 80h
helloLen equ $ - hello
[section .text] ; proc fileWrite - write a string to a file
global _start fileWrite:
_start: mov ebx,eax
pop ebx mov eax,4
pop ebx mov ecx,hello
pop ebx mov edx,helloLen
mov eax,8
int 80h
mov ecx,00644Q
mov eax,6
int 80h
int 80h
test eax,eax
js skipWrite ret
call fileWrite ; endp fileWrite
skipWrite: mov ebx,eax
Introdução à Integração C e Assembly e
chamadas às System Calls em ambiente Linux
Acesso ao I/O
int ioperm(unsigned long from,unsigned long num, int turn_on);
Acesso ao I/O
C:
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 Calls em ambiente Linux
Acesso ao I/O
C:
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 Calls em ambiente Linux
Acesso ao I/O
int ioctl(int level);
• 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 quando
houver a mudança para o modo protegido os endereços
físicos serão gerados de maneira completamente diferente.
• Prepara a Interrupt Descriptor Table (IDT), pois os
vetores 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 limite
para a Global Descriptor Table. Estes registradores são
carregados com a instrução LGDT mem.
• mem é o endereço base de uma região de 6 bytes que
armazena: 2 bytes de limite + 4 bytes de endereço base
para Global 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 uma Global Descriptor
Table com 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 para
armazenar 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 deste
registrador é feito 1, o processador muda para o Modo
Protegido.
MOV EAX,CR0
OR EAX,1
MOV 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ão
inicia 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