Programação de Sistemas
Segmentação e Protecção de
memória nos µP Intel
Introdução (1)
Lista dos processadores de uso geral da Intel
• 4004: Nov 1971, 4 bits, primeiro µP
– Desenvolvido para linha de calculadoras da
Busicom (Japão)
– Relógio a ... 740KHz, executa 92K instruções/seg
– Relógio a ... 740KHz, executa 92K instruções/seg
• 8080: Abr 1974, 8 bits
• Relógio 2 MHz, executa 500K instruções/seg • 8085, compatível, exigia menos HW
• Z80, da Zilog, adoptado por fabricantes de microcomputadores por ser binariamente compatível e poder ser fabricado sem pagamento de
Introdução (2)
• Arquitectura IA-16
1978: 8086-29K transistores, 0.33 MIPS endereça 1MB
1982: 80286-134K transistores (MMU incorporado), 0.9 MIPS endereça 16MB de memória
• Arquitectura IA-32
1985: 80386-275K transistores, 5 MIPS endereça 4GB de memória
Introdução (3)
1993: Pentium-3.1M transistores, 60 MIPS [introduz SIMD instruções em registos de 64 bits]
1997: Pentium II- 9.5M transistores, 300 MIPS
1999: Pentium III-9.5M transistores, 500 MIPS [introduz Streaming SIMD instruções em registos de 128 bits]
2000: Pentium 4-42M transistores, 1500 MIPS endereça 64GB de memória
• Arquitectura IA-64
2006: Core 2-151M transistores, 20_000 MIPS
Introdução (4)
• Fabricantes seguiram abordagens distintas na passagem de
32 bits para 64 bits:
– Intel associou-se à HP para desenvolver processador Itanium
dedicado a servidores e a estações de trabalho de elevado
desempenho. O processador emulava o IA-32, mas com
significativa degradação no desempenho.
significativa degradação no desempenho.
– Advanced Micro Devices desenvolveu AMD64, estendendo o
IA-32 para16 registos de uso geral de 64 bits.
• Vendas do AMD64 muito superiores levaram a Intel a
adoptar a arquitectura AMD64, sob a designação EM64T.
Informação complementar do IA32 e IA64 disponível em
Introdução (5)
•
Um µP da Intel pode correr em 5 modos de operação:
– Modo Real : único existente no 8086.
– Modo Protegido : actualmente o mais usado.
– Modo Virtual 8086 : executa programas compatíveis com 8086,
concorrencialmente com programas em modo protegido.
– Modo Memória extendida para 64 bits:
• Modo compatível – executa código 32 bits na máquina de 64-bits sem recompilação (não acede ao espaço de 64 bits).
• Modo 64 bits – acesso a registos de 64 bits e espaço de endereçamento de 64 bits.
Registos IA-32 (1)
•
Pentium possui
elevado número de
registos.
Registos IA-32 (2)
Registos IA-32 (3)
B. Bandeiras (“flags”) – 32 bits
Registos IA-32 (4)
C. Tabelas descritores
Registos IA-64 (1)
• Os registos de uso geral dependem do modo de operação
– Compatível IA-32
• 8 registos iguais aos IA-32: EAX-EDX, EDI, ESI, EBP, ESP • 8 registos extra: R8D-R15D
– 64 bits
• 8 registos iguais aos IA-32, mas com prefixo R: RAX-RDX, RDI,RSI, RBP, RSP
• 8 registos extra: R8-R15
• Todos os registos podem ser acedidos a nível de
– Byte
– Word
– Double
Registos IA-64 (2)
Tipo registo Modo compatível IA-32
Modo 64-bit
Byte
AL,BL,CL,DL, AH, BH, CH, DH AL,BL,CL,DL, DIL,SIL, BPL,SPL, R8L-R15LWord
AX, BX, CX, DX, DI, SI, AX, BX, CX, DX, DI, SI,Word
DI, SI,BP, SP
DI, SI, BP, SP, R8W-R15W
Double
EAX, EBX, ECX, EDX, EDI, ESI,EBP, SP
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D-R15D
Quad
-- RAX, RBX ,RCX, RDX, RDI, RSI, RBP, RSP, R8-R15Segmentação (1)
•
A segmentação tem em vista a resolução de problemas
– incremento do espaço de endereçamento, e
– protecção de memória.
A. Espaço de endereçamento
A. Espaço de endereçamento
– A Intel foi a primeira a disponibilizar um µP de 16 bits, o 8086.
Apesar de tecnologicamente inferior ao Motorola 68000, a
entrada inicial permitiu assegurar maior quota de mercado.
– 16 bits endereçam 64KB, demasiadamente pequeno para
programas de grande dimensão. A segmentação permitiu alargar
endereçamento para 1MB.
Segmentação (2)
B. Protecção de memória
– A memória virtual pagimentada tem apenas 1 dimensão (entre 0 e
limite máximo).
– Existem aplicações que trabalham em várias dimensões.
Ex: um compilador existem diversões partes lógicas, que não
podem ser sobrepostas.
podem ser sobrepostas.
• Árvore de derivação (“parsing”) • Tabela de símbolos
• Código
Segmentação (3)
Comparação entre paginação e segmentação
Gestão memória IA-16 (1)
•
O 8086/8 foi o primeiro processador da Intel a 16 bits
(diferença reside na dimensão do bus: 16 bits no 8086 e 8
bits no 8088)
•
O 8086/8 possui 4 registos de segmento, cada um base de
uma zona de 64KB.
uma zona de 64KB.
– CS (“Code Segment”), para endereçar código
– DS (“Data Segment”), para endereçar variáveis globais
– SS (“Stack Segment”), para endereçar piha, incluindo variáveis locais às rotinas
– ES (“Extra Segment”)
•
Segmentos podem ser torneados
indicando explicitamente o segmento
(ex: MOV AX,ES:var)
64KB
CS
Gestão memória IA-16 (2)
• Espaço físico é de 1MB.
• Como 16 bits apenas endereçam 64KB, como fazer?
Resposta: o endereço físico é calculado por
1. Deslocar segmento 4bits para a esquerda
2. Somar endereço
Nota
: paginação substitui bits do prefixo, segmentação soma bits do
Nota
: paginação substitui bits do prefixo, segmentação soma bits do
prefixo
Ex1: para DS=0x0365, o endereço linear 0x42f corresponde ao endereço
físico 0x03650+0x42f=0x03a7f
Ex2: a instrução a executar encontra-se no endereço CS:IP, o push envia
dado para o endereço SS:SP
0 3 6 5
DS0
0 4 2 f
0 3 a 7 f
endereço linear endereço físicoGestão memória IA-16 (3)
• O valor dos segmentos
CS,DS e SS determinam o
modelo do programa.
– Largo (“large”):
CS, DS e SS distintos
Code segment Stack segment 0xfffffCS, DS e SS distintos
– Médio (“medium”):
DS=SS, CS distinto
– Pequeno (“small”): CS=DS=SS
Extra segment Data segment 0x00000Nota
: o endereçamento puramente segmentado disponibilizado pelo
Pentium e Core 2 em modo real.
Gestão memória IA-16 (4)
• Multiprocessamento
implementado por
segmentos com
valores distintos em
cada processo.
Processo 1
0xfffff Code segment Code segmentcada processo.
Processo 2
0x00000• No IA-16, espera-se que o programa não aceda a endereços
inexistentes. Se o fizer, lê dado erróneo ou “crasha”.
• Aumento de segurança exige mais dados que o endereço base dos
segmentos. Sendo os registos escassos, torna-se necessário instalar
informação na memória central: o IA-32 usa tabela de descritores.
Gestão memória IA-32 (1)
A gestão de memória do IA-32 é distinta do IA-16, mais
poderosa e complexa.
A. Selectores
• Os registos CS,… (mais FS e GS) passaram a designar-se
por selectores (da tabela de descritores).
por selectores (da tabela de descritores).
• Os 16 bits dos selectores são divididos em 3 campos:
– RPL (2 bits): indica o nível de privilégio (CPL).
– TI (1 bit): indica tabela de descritores , local-LDT ou global-GDT.
– Index (13 bits): indexa o descritor na tabela determinada pelo campo TI.
Nota
: Em todos os processo, CS, DS
e SS têem de estar carregados
com selectores válidos.
Gestão memória IA-32 (2)
B. Tabela de descritores
• 80386+ possuem três tipos de tabelas de descritores,
residentes em memória.
Cada tabela contém até 8K descritores, cada um designado
por descritor de segmento.
por descritor de segmento.
– GDT (“Global Descriptor Table”), obrigatório e partilhado por
todos os programas.
– LDT (“Local Descriptor Table”), opcional e descreve os
segmentos locais a cada programa (código, dados, pilha).
– IDT (“Interrupt Descriptor Table”), para serviços de sistema
acedidos pela instrução INT.
Nota
: Linux apenas usa o GDT. Os LDTs são alocados para emulação do
Windows.
Gestão memória IA-32 (3)
C. Registos base
• As tabelas GDT, LDT e IDT são referenciadas pelos
registos GDTR, LDTR e IDTR.
– GDTR e IDTR - 48 bits:
• 16 bits menos significativos determinam a dimensão da tabela. • 16 bits menos significativos determinam a dimensão da tabela. • 32 bits mais significativos determinam o endereço base da tabela.
– LDTR: selector de 16 bits, indexa na tabela do GDT o LDT
corrente.
Descritores de segmentos IA-32 (1)
• A tabela GDT possuem dois tipos de descritores de
segmentos.
– Code Segment Descriptor ou Data Segment Descriptor.
Nota
: a pilha é implementada por um Data Segment Descriptor.
– System Descriptor, subdividido em dois subtipos:
– System Descriptor, subdividido em dois subtipos:
• System Segment Descriptor: referenciam segmentos do sistema (LDT e TSS)
• Gate Descriptor : referenciam pontos de entrada em rotinas.
• Por compatibilidade entre SOs, o primeiro descritor do
GDT não é usado.
Descritores de segmentos IA-32 (2)
•
Cada descritor ocupa 8B, com o seguinte formato
Descritores de segmentos IA-32 (3)
• Tipo de descritores descriminado pelo bit S
– S=1 para aplicação (código e dados/pilha)
• Type: Executable (0-data,1-code), Expansion (0-up,1-down), Access (0-read only, 1-read/write)
– S=0 para sistema
• 0010 - LDT • 0010 - LDT
• 1001 – porta de processo (“task”) • 1011 – porta de processo
• 1100 – porta de entrada de rotina • 1110 – porta de interrupção
Descritores de segmentos IA-32 (4)
Descritores de segmentos IA-32 (5)
1. Code Segment Descritor/Data Segment Descriptor.
– Endereço base do segmento de 32B (virtual, ou físico,
dependendo do valor do bit PG do registo de controlo cr0).
O endereço linear é calculado somando o endereço base, indicado
pelo
descritor
(32B),
com
o
deslocamento
(32B).
Nota
: para apressar os cálculos, o CPU contém uma TLB com os
Nota
: para apressar os cálculos, o CPU contém uma TLB com os
descritos usados mais recentemente.
Descritores de segmentos IA-32 (6)
• Se soma ultrapassar
o limite indicado
no
descritor
é
gerada
uma
interrupção. Assim
são garantidas duas
são garantidas duas
protecções:
– Intraprocesso (código não executa dados ou pilha)
– Interprocesso (processo não executa código de outro processo)
Descritores de segmentos IA-32 (7)
2. Task State Segment Descriptor.
• O índice da tabela de descritores, onde se encontra armazenado o
TSS-Task State Segment Descriptor, é armazendo no registo
TR-Task Segment Register – 16 bits.
TSS = End. base tabela
TSS = End. base tabela
Descritores de segmentos IA-32 (8)
Descritores de segmentos IA-32 (9)
• O TSS, na realidade o PCB-Process Control Block, ocupa 26
quadwords com os seguintes campos:
– Conteúdo dos selectores (CS,DS,SS,ES,FS e GS)
– Conteúdo dos registos de uso geral (EAX,EBX,ECX,EDX, ESP,EBP, ESI,EDI)
– Conteúdo do registo de bandeiras EIFLAGS – Conteúdo do registo de bandeiras EIFLAGS – Conteúdo do EIP
– Conteúdo do LDTR (ponteiro para tabelas LDT)
– Conteúdo do IDTR (ponteiro para tabela de interrupções) – Ponteiro para o descritor Call Gate
– Ponteiro para processo previamente executado – …
Descritores de segmentos IA-32 (10)
link esp0 ss0 esp1 ss1 esp2 ss2 PTDB EIP ss0 ss0 ss0 ss0 EFLAGS EAX 0 4 8 12 16 20 24 28 32 36 40 26 longwords 32-bits ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ss0 ES CS SS DS FS GS LDTR IOMAP TRAP EAX ECX EDX EBX ESP EBP ESI EDI= campo ‘estático’
= campo ‘volátil’
= campo ‘reservado’
40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 26 longwordsDescritores de segmentos IA-32 (11)
• Os segmentos definidos no TSS cobrem todo o espaço necessário à
execução do mesmo.
– Selectores de segmentos (CS,DS,SS e restantes). – Ponteiros para pilhas de nível 0,1 e 2.
GDT do Linux (1)
• No Linux, cada processador mantém uma GDT com
– 18 descritores de segmentos
• 4 Descritores de código e de dados para código de utilizador e núcleo • 1 Descritor TSS
• 1 Descritor TSS especial “double fault”
• 1 Descritor Local, usado por todos os processos
• 3 TLS - Thread Local Storage (para dados locais a cada thread, em aplicações multithreaded)
• 3 APM - Advanced Power Management • 5 PnP - Plug and Play
Registos de controlo IA-32 (1)
• Registos de controlo do modo no IA-32 (32 bits)
– cr0 (controlo das operações básicas) – cr1 (reservado)
– cr2 (endereço linear da última página em falta) – cr3 (endereço base do directório)
– cr4 (activar mecanismos avançados) – cr4 (activar mecanismos avançados)
• Flags do cr0
• PG (bit 31) paginação:
Nota 1: Se PG=1, o endereço é virtual e o segmento é dividido em páginas. : Se PG=0, o endereço é físico.
Nota 2: cr2 e cr3 válidos apenas se PG=1 • CD (bit 30) cache inibida.
• WP (bit 16) escrita protegida.
• EM (bit 2) unidade processamento vírgula flutuante (FPU) ausente. • PE (bit 0) modo protegido.
Segmentação
Registos de controlo IA-32 (2)
• Enquanto a paginação pode ser suspensa, a segmentação
não pode (devido à necessidade de garantia de protecção).
Endereço Lógico
Endereço Linear
Page-directory base-address
12 310
3 4 P C D P W T0
PCD=Page Cache-Disable PWT=Page Write Through
• cr3
contém o endereço base do directório (PDBR): 20 bits
Endereço Linear
Endereço Físico
Protecção (1)
• O 80386+ suporta 4
níveis de protecção, entre
0 (maior privilégio) e 3
(menor privilégio).
• O Linux usa apenas os
• O Linux usa apenas os
níveis
– 0 para o núcleo, e
– 3 para utilizador
Protecção (2)
• O nível de protecção é indicado no campo RPL do
selector.
– Cada processo pode aceder a dados ou chamar rotinas de níveis
superiores (menos privilegiados).
– Tentativas de acessos ilegais a níveis mais privilegiados geram
TRAP.
TRAP.
• Algumas instruções (ex: carregamento do registo cr3)
apenas pode ser executadas no nível 0.
Protecção (3)
Espaço núcleo (anel 0)
TSS
GDT
GDTR TR
Espaço núcleo (anel 0)
TEXT
DATA
BSS
heap
STACK
shared runtime library
Processo
CS
DS
SS
SP
IP
Criado na compilaçãoInstruções (espaço persistente) Dados inicializados (espaço persistente) Dados não inicializados (espaço persistente)
Criado durante execução
Espaço utilizador (anel 3)
Protecção (4)
[Problema] Como o processo de utilizador pode chamar uma
rotina de nível mais privilegiado?
• Para chamar rotina de nível mais privilegiado, o CALL
indica um descritor específico, designado por call gate,
que recolhe o endereço de outro descritor de código.
indica um descritor específico, designado por call gate,
que recolhe o endereço de outro descritor de código.
Vantagens:
– O utilizador não pode entrar no meio de uma chamada de sistema.
– Garante que as verificações de segurança, executadas no início da
rotina, não sejam torneadas por a rotina chamadora entrar mais à
frente na rotina chamada.
Protecção (5)
• O descritor do call gate contém 6 elementos:
– descritor de código da rotina alvo, – ponto de entrada da rotina alvo,
– nível de privilégio que a rotina chamadora necessita de ter para poder entrar, – se a rotina alvo exigir substituição de pilha, indica o número de parâmetros a
copiar da rotina chamadora para a rotina chamada,
– dimensão dos parâmetros a carregar na pilha da rotina chamada (16-bit ou 32-bit), – dimensão dos parâmetros a carregar na pilha da rotina chamada (16-bit ou 32-bit), – validade do descritor call-gate.
Protecção (6)
• O endereço do ponto de entrada da rotina chamada não é
acedido directamente pela rotina chamadora!
O endereço do ponto de entrada é igual ao deslocamento
indicado no descritor call-gate mais o endereço base
indicado pelo selector do segmento.
• Descritores envolvidos numa chamada a uma rotina de
nível mais privilegiado
Protecção (7)
TASK STATE SEGMENT
Stack pointer params
call-instruction CS:IP code-segment code-segment called procedure STACK SEGMENT Stack pointer STACK SEGMENT params params gate-descriptor TSS-descriptor TR GDTR Rotina chamadora Rotina chamada
Protecção (8)
• Existem 4 instruções que provocam a mudança de tarefa:
– Salto longo, sem retorno para um descritor TSS instalado no GDT
ljmp
$task_selector, 0
– Chamada longa , para mais tarde retornar, para um descritor TSS
instalado no GDT
lcall
$task_selector, 0
lcall
$task_selector, 0
– TRAP (por task-gate)
int
0x80
Nota
: código da função de sistema indicada no registo EAX
– A tarefa corrente retorna de interrupção (bit NT de EPLAGS a 1)
iret
Interrupções (1)
• A tabela IDT-”Interrupt
Descriptor Table”, residente
num segmento de memória
dedicado, contém ponteiros
para tratamento de
interrupções.
interrupções.
• O endereço base da IDT é
identificado pelo registo
IDTR, de 48 bits.
NOTA: Instruções de escrita e leitura do IDTR (sidt, lidt) e do GDTR (sgdt, lgdt) apenas podem ser executadas no anel de nível 0.
Interrupções (2)
• Tal como no GDT, existem vários tipos descritores de
interrupções designados por portas (gates):
– Task gate (ISR tratada como comutação de processo – necessário
em caso de falha de pilha quando CPL=0, ou “double fault”).
– Interrupt gate (ISR tratada como chamada normal a rotina e utiliza
a pilha do processo interrompido para EIP e CS)
a pilha do processo interrompido para EIP e CS)
– Trap gate.
• A única diferença entre o Trap gate e o Interrupt gate é o
CPU limpar, ou não limpar, o bit IF do registo EFLAGS.
A diferença é necessária quando a rotina de serviço da
interrupção (ISR) é executado fora do nível de protecção
0-não podendo executar as instruções cli ou sti.
Interrupções (3)
• O interrupt-gate é muito semelhante ao call-gate.
• O endereço ISR é igual ao deslocamento indicado no
descritor interrupt-gate mais o endereço base indicado
pelo selector de segmento.
Interrupções (4)
Interrupt-gate
Interrupt Descriptor
Table (256 entradas)
ISR
code-segment
GDTR
IDTR
code-descriptor