Como você escreve um bootloader no MBR?

2

Eu estava tentando escrever um gerenciador de inicialização no idioma assembly para um drive USB, para testá-lo em outro computador. O bootloader (deveria) funcionar com processadores intel. O computador que estou testando (windows 7 com intel celeron e 2 GB de memória RAM) deve estar rodando, ele ainda tem a opção de inicializar a partir de uma unidade USB na BIOS (e detecta a unidade). Quando eu corro a inicialização da unidade, ela inicializa no Windows. Ele deve estar exibindo meu sistema operacional personalizado, que é basicamente apenas um programa de montagem do tipo Hello-World. Eu estou supondo que isso é porque não foi possível encontrar o sistema operacional: A marca OS (que eu achei deveria ser "dw 0xAA55") não está correta, a unidade USB não é inicializável, ou Eu apenas não estou colocando o arquivo bin bootloader no primeiro setor.

Minhas perguntas são: Como testar se (a) o drive USB é capaz de inicializar um sistema operacional, (b) se o sistema operacional está sendo reconhecido, e (c) se o arquivo bin está no setor correto (o primeiro setor).

Aqui está o código de montagem:

org 7C00h

jmp 0x0:start

start:
cli
mov ax, 0x9000 ;Set up stack
mov ss, ax     ;Tell processor where stack is
mov sp, 0xFB00 ;Set stack offset
sti

mov AH, 0Eh ;Tell bios we're writing a char to screen!
mov AL, 'T' ;Load a new character into memory
int 10h     ;Call BIOS video interrupt

jmp start   ;And so on and so on

times 510-($-$$) db 0 ;Fill rest of sector up with 0s to make this 512B (a sector)
dw 0xAA55             ;Let BIOS know this is an OS! (defines a word)

Eu sou bastante novo na montagem, então se os comentários depois de algumas das linhas não corresponderem ao que deveriam ser, então provavelmente é por isso. Obrigado pela sua ajuda!

    
por John Schneider 02.12.2012 / 21:06

2 respostas

2

Você não pode acessar o MBR a partir do sistema de arquivos, é um setor especial, está sempre fora de qualquer partição que você criar.

Para gravar no MBR real, você precisa usar dd (no linux) ou PartCopy (no windows). Eu nunca usei o PartCopy, então não posso garantir, mas o dd funcionou para mim.

dd if=bootsector.bin of=/dev/sda bs=512 count=1

Onde sda é o nome do seu disco rígido ou dispositivo usb e o bootsector.bin é um binário simples

Observe que a opção "de" deve apontar para o próprio dispositivo e NÃO particionar nesse dispositivo, por exemplo, sda1, sda2

Você pode compilar um binário simples com nasm usando a opção -f bin

Da mesma forma, você pode testar se o bootsector está lá lendo do primeiro setor para o arquivo:

dd if=/dev/sda of=mbr_contents.bin bs=512 count=1

Abra-o com um editor hexadecimal e veja se é igual ao original ou desmonte-o.

Você também pode limpar o setor de inicialização escrevendo de zero dispositivo:

dd if=/dev/zero of=/dev/sda bs=512 count=1

Como você sabe que o sistema operacional está sendo reconhecido? Se ele acertar o seu setor de inicialização, ele não tentará carregar outro setor de inicialização, mesmo se o seu código falhar. O BIOS apenas verifica a tag 0xAA55, carrega os 512 bytes na memória e executa a CPU no modo flat real (padrão), o BIOS basicamente lhe entrega o controle. Aconteça o que acontecer, o resultado será o código do SEU funcionamento. Então, se o seu código falhar, o computador ficará lá e desperdiçará eletricidade.

Até onde eu sei, todos os drives usb são capazes de armazenar um bootloader, mas algumas placas-mãe podem ter problemas ao tentar carregar de drives usb. Eu usei um disco rígido extra para brincar, parece mais confiável.

Truque de bônus: você pode achar cansativo ter que reinicializar seu computador todas as vezes, então considere usar uma máquina virtual. O VirtualBox é ótimo, mas há outros. O que é útil sobre a caixa virtual é que você pode inicializá-la a partir do disco rígido real (ou do pendrive). Você pode anexar a caixa virtual ao disco rígido real criando um sistema de arquivos virtual proxy:

VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
  -rawdisk /dev/sda

Então você apenas usa o arquivo vmdk como um sistema de arquivos virtual regular e escreve seu gerenciador de inicialização em sda como de costume. Muito útil para testes!

Fonte: Manual de Caixa Virtual, Capítulo 9, Tópicos Avançados Seção: acesso ao disco rígido físico inteiro

Você provavelmente poderia escrever em um sistema de arquivos virtual, mas eu não encontrei uma maneira fácil de fazer isso, esses arquivos têm formatos incomuns, então você não pode simplesmente usar dd neles.

Algumas outras coisas úteis para ler no sistema operacional e nos gerenciadores de inicialização:

OS Dever

Série OS Developmnet da Broken Thorn Entertainment

    
por 07.01.2013 / 04:08
0

a) Tente inicializar um sistema operacional diferente de um bastão. Deve haver instruções sobre como, por exemplo, Coloque o Windows em um pendrive. Se isso funcionou, você sabe que sua máquina pode fazer isso.

b) Se você sabe que sua caixa inicializa qualquer sistema operacional, você sabe que ele inicializa seu sistema operacional quando ele trava ou exibe seu "olá". Você sabe que não reconheceu o sistema operacional quando ele inicializa em sua partição normal. Mais informações aqui: link

c) O primeiro setor é acessível abrindo o próprio disco . Dê uma olhada nisso: link , parágrafo "Discos Físicos e Volumes"

    
por 02.12.2012 / 22:02