Boot, BIOS, Bootloader Prof. Alexandre Beletti POST da BIOS O primeiro a ser executado é o POST Verifica presença de dispositivos (Ex: teclado, monitor, etc) Verifica se a memória RAM está OK (teste básico) O POST carrega o software da BIOS no final da memória RAM (Ex: 0xFFFFF0) 1
POST da BIOS Coloca um JMP no primeiro byte na memória. CS:IP é setadoem 0 O processador executará o endereço 0x00000 Esse endereço está com um salto: JMP 0xFFFFF0 A BIOS assume o controle... O que a BIOS faz? BIOS Carrega o vetor de interrupções na RAM (IVT) Faz uso da INT 0x19 para localizar um dispositivo bootável Procura pelo SETOR 1, HEAD 0, TRACK 0 Um setor tem 512 bytes somente Esse 512 bytes são carregados a partir do endereço 0x7C00 (o Bootloader!) 2
Bootloader Está armazenado na MBR É sempre o primeiro setor de um disco Tem o tamanho máximo de 512 bytes É carregado na BIOS pela INT 0x19 no endereço 0x7C00 Exemplo de um Boot Loader org 0x7c00 ; We are loaded by BIOS at 0x7C00 bits 16 ; We are still in 16 bit Real Mode Start: cli hlt times 510 -($-$$) db 0 dw 0xAA55 ; Clear all Interrupts ; halt the system ; We have to be 512 bytes. ;Clear the rest of the bytes with 0 ; Boot Signiture 3
Montando e Gravando Montando o código em ASM: nasm f bin boot1.asm o boot1.bin Gravando em um disquete: partcopy0 200 f0 0 = endereço inicial 200 = endereço final (0x200 = 512 decimal) -f0 = disquete 0 ou A: ou /dev/fd0 Bootloader no BOCS 4
Modos do Processador Prof. Alexandre Beletti Modos do Processador x86 -PC Real Mode Protected Mode Unreal Mode Virtual 8086 Mode 5
Modo Real Endereços SEGMENTO:OFFSET Limitado a 1Mbde memória Registradores de 16 bits Sem Memória Virtual ou Memória Protegida Modo Real - Endereçamento Você deseja acessar mais do que 64Kbytes que um endereço de 16 bits permite (de 0 até 65535 ou de 0x0000 até 0xFFFF) Quando temos mais de 64Kb precisamos dividir a memória em partes (SEGMENTOS) Lembre-se dos registradores de segmento do x86 de 16 bits (CS, DS, SS e ES) 6
Modo Real - Endereçamento Temos então o Endereço Real que é: (SEGMENTO x 16d) + OFFSET Ex: No endereço 07C0:0000, o primeira parte (07C0) é o segmentoe a segunda parte (0000) é o offset Podemos representar um mesma referência a memória com combinações de SEGMENTOS e OFFSET distintos Modo Real - Endereçamento 0007:7B90 0008:7B80 0009:7B70 000A:7B60 000B:7B50 000C:7B40 0047:7790 0048:7780 0049:7770 004A:7760 004B:7750 004C:7740 Endereço: 0x7C00 Os endereços ao lado representam todos a mesma coisa! 7
Overlapped Segments O fato de você ter possibilidades distintas de referenciar um único byte na RAM pode gerar o que chamamos de Overlapped Segments Modo Protegido Faz uso de Descriptor Tables Permite o uso de processadores em 32 bits Permite endereçar mais de 4Gb de RAM A maioria dos Sistemas Operacionais faz uso de Modo Protegido 8
Modo Unreal É o modo real mas com 4Gb Mudamos o processador para o Modo Protegido Carregamos um Descriptor Voltamos para o Modo Real Modo Virtual 8086 É um Modo Protegido com um Modo Real de 16 bits emulado Lembre-se: As Interrupções da BIOS são disponíveis somente no Modo Real! 9
OEM Parameter Block BIOS Parameter Block Prof. Alexandre Beletti OEM Parameter Block O propósito desse bloco é descrever o sistema de arquivos presente no disco Por exemplo, caso isso não exista o Windows irá exibir que o Disco Não Está Formatado Ele deve estar incluída no programa que será o nosso Bootloader(ou no primeiro estágio do Bootloaderno caso de Bootloadercom dois estágios) 10
Exemplo de OEM Parameter Block Organização do Disco FAT12 Boot Sector Extra Reserved Sectors File Allocation Table 1 File Allocation Table 2 Root Directory (FAT12/FAT16 Only) Data Region containng files and directories. 11
Características da FAT12 Possui duas FATs(a segunda é uma cópia da primeira) Os setores extras reservados são determinados pelo OEM Blockna bpbreservedsectors O diretório ROOT (raiz) é uma tabela de formada por registros de 32 bytes Registro da Tabela FAT12 1 de 2 Bytes 0-7 : DOS File name (Padded with spaces)bytes 8-10 : DOS File extension (Padded with spaces)bytes 11 :File attributes. This is a bit pattern:bit0 :Read Only Bit 1 :Hidden Bit 2 :System Bit 3 :Volume Label Bit 4 :This is a subdirectory Bit 5 :Archive Bit 6 :Device (Internal use) Bit 6 :Unused Bytes 12 :UnusedBytes13 :Create time in msbytes14-15 :Created time, using the following format:bit0-4 :Seconds (0-29) Bit 5-10 : Minutes (0-59) 12
Registro da Tabela FAT12 2 de 2 Bit 11-15 : Hours (0-23) Bytes 16-17 :Created year in the following format:bit0-4 : Year (0=1980; 127=2107 Bit 5-8 : Month (1=January; 12=December) Bit 9-15 :Hours (0-23) Bytes 18-19 :Last access date (Uses same format as above) Bytes 20-21 :EA Index (Used in OS/2 and NT, dontworry about it) Bytes 22-23 :Last Modified time (See byte 14-15 for format) Bytes 24-25 :Last modified date (See bytes 16-17 for format) Bytes 26-27 : First Cluster Bytes 28-32 :File Size Procurando e Lendo na FAT12 Prof. Alexandre Beletti 13
Procurando e Lendo na FAT12 1. Carregando a Tabela do Diretório Root 2. Encontrando o Estágio 2 do Bootloader(Ex) 3. Carregando a FAT Carregando a Tabela do Diretório Root Calcule o Tamanho do Diretório Root= Divida o número de Entradas do Root pelo Número de Bytes por Setor Calcule o Endereço do Root= Número de FATs somado com o Setores Reservados 14
Encontrando o Estágio 2 do Bootloader(Por Exemplo...) Os 11 primeiros bytes das entradas de 32 bytes do diretório ROOT são o nome do arquivo Basta verificar se o nome encontrado é o desejado, caso contrário incremente 32 bytes (tamanho do registro) Repita o procedimento anterior até encontrar ou dizer que o arquivo não existe Carregando a FAT Quando encontramos o arquivo precisamos dos últimos 2 campos do registro: Bytes 26-27 : First Cluster Bytes 28-32 : File Size Agora em FirstCluster temos o endereço do primeiro cluster do arquivo 15