Como você escreve um bootloader no MBR?

2

Eu estava tentando escrever um bootloader na linguagem assembly para um drive USB, para testá-lo em outro computador. O bootloader (deve) funcionar com processadores Intel. O computador que eu estou testando (windows 7 com intel celeron e 2 GB de memória RAM) deve estar rodando, ele ainda tem uma opção para 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 conseguiu encontrar o sistema operacional: Ou o OS-tag (que eu encontrei devemos ser "dw 0xAA55") não está correto, o drive USB não é inicializável, ou eu simplesmente 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 para a montagem, por isso, se os comentários depois de algumas das linhas não corresponderem ao que deveriam ser, então provavelmente é por isso. Obrigado pela ajuda!

John Schneider
fonte

Respostas:

2

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

Para escrever no MBR real, você precisa usar dd (sob linux) ou PartCopy (para 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 plano com nasm usando -f bin opção

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 atingir 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.

Tanto quanto eu sei que todos os drives USB são capazes de armazenar um gerenciador de inicialização, é apenas que algumas placas-mãe podem ter problemas ao tentar carregar a partir 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 bootloader em sda como de costume. Muito útil para o teste!

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

Você provavelmente poderia escrever no próprio 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 de Desenvolvimento de SO por Brokenthorn Entertainment

vlsh
fonte
HxDEdit também pode ser usado para edição de bootsectors e outros enfeites.
Bigbio2002
0

a) Tente iniciar um sistema operacional diferente a partir de um stick. 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: http://en.wikipedia.org/wiki/Master_boot_record

c) O primeiro setor é acessível, abrindo a disco em si. Veja isso: http://msdn.microsoft.com/pt-br/library/windows/desktop/aa363858%28v=vs.85%29.aspx , parágrafo "Discos Físicos e Volumes"

cxxl
fonte