Jak napisać bootloader do MBR?

2

Próbowałem napisać program ładujący w języku asemblera na dysk USB, aby przetestować go na innym komputerze. Program ładujący (powinien) działać z procesorami Intel. Komputer, na którym go testuję (Windows 7 z procesorem Intel Celeron i 2 GB RAM) powinien go uruchomić, ma nawet opcję rozruchu z dysku USB w BIOS-ie (i wykrywa dysk). Kiedy uruchamiam boot z napędu, uruchamia się on w systemie Windows. Powinien wyświetlać mój niestandardowy system operacyjny, który jest po prostu programem do montażu typu Hello-World. Zakładam, że dzieje się tak, ponieważ nie można znaleźć systemu operacyjnego: albo znacznik systemu operacyjnego (który znalazłem powinien być „dw 0xAA55”) jest nieprawidłowy, dysk USB nie nadaje się do rozruchu lub po prostu nie umieszczam plik bin bootloadera w pierwszym sektorze.

Moje pytania brzmią: jak sprawdzić, czy (a) dysk USB jest w stanie uruchomić system operacyjny, (b) czy system operacyjny jest rozpoznawany, oraz (c) czy plik bin znajduje się we właściwym sektorze (pierwszy sektor) .

Oto kod asemblera:

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)

Jestem raczej nowy w asemblerze, więc jeśli komentarze po niektórych liniach nie pasują do tego, czym powinny być, to prawdopodobnie dlatego. Dzięki za pomoc!

John Schneider
źródło

Odpowiedzi:

3

Nie można uzyskać dostępu do MBR z systemu plików, jest to specjalny sektor, zawsze poza tworzonymi partycjami.

Aby napisać do rzeczywistego MBR, musisz użyć dd (pod Linuksem) lub PartCopy (dla Windows). Nigdy nie korzystałem z PartCopy, więc nie mogę za to ręczyć, ale dd działało dla mnie.

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

Gdzie sda ​​to nazwa dysku twardego lub urządzenia USB, a bootsector.bin to płaski plik binarny

Zauważ, że opcja „of” powinna wskazywać na samo urządzenie, a NIE na partycję na tym urządzeniu, tj. Sda1, sda2

Możesz skompilować płaski plik binarny z nasm, używając opcji -f bin

Podobnie możesz sprawdzić, czy bootsector tam jest, czytając z pierwszego sektora do pliku:

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

Otwórz go za pomocą jakiegoś edytora szesnastkowego i sprawdź, czy jest taki sam jak oryginał, lub zdemontuj go.

Możesz również wyczyścić bootsector pisząc od zerowego urządzenia:

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

Skąd wiesz, że system operacyjny jest rozpoznawany? Jeśli uderzy w twój bootsektor, nie spróbuje załadować innego bootsectora, nawet jeśli twój kod się zawiesi. BIOS sprawdza po prostu znacznik 0xAA55, ładuje 512 bajtów do pamięci i uruchamia na nim procesor w trybie płaskiego (domyślnie), BIOS w zasadzie przekazuje ci kontrolę. Cokolwiek wydarzy się później, będzie skutkiem działania Twojego kodu. Więc jeśli Twój kod ulegnie awarii, komputer po prostu tam usiądzie i zużyje prąd.

O ile wiem, wszystkie dyski USB są zdolne do przechowywania bootloadera, po prostu niektóre płyty główne mogą być uszkodzone podczas próby ładowania z dysków USB. Do zabawy użyłem zapasowego dysku twardego, wydaje się bardziej niezawodny.

Dodatkowa sztuczka: może być męcząca konieczność ponownego uruchamiania komputera za każdym razem, więc rozważ użycie maszyny wirtualnej. VirtualBox jest świetny, ale są też inne. Przydatne w wirtualnym pudełku jest to, że można go uruchomić z prawdziwego dysku twardego (lub pamięci USB). Możesz dołączyć wirtualną skrzynkę do prawdziwego dysku twardego, tworząc wirtualny system plików proxy:

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

Następnie wystarczy użyć pliku vmdk jako zwykłego wirtualnego systemu plików i jak zwykle zapisać program ładujący do sda. Bardzo przydatny do testowania!

Źródło: Podręcznik Virtual Box, rozdział 9, sekcja tematów zaawansowanych: Dostęp do całego fizycznego dysku twardego

Prawdopodobnie mógłbyś napisać do samego wirtualnego systemu plików, ale nie znalazłem łatwego sposobu na to, te pliki mają nietypowe formaty, więc nie możesz po prostu użyć na nich dd .

Kilka innych przydatnych rzeczy do przeczytania na temat niestandardowego systemu operacyjnego i programów ładujących:

OS Dever

OS Developmnet Series firmy Broken Thorn Entertainment

vlsh
źródło
HxDEdit może być również używany do edycji sektorów rozruchowych i tym podobnych.
Bigbio2002
0

a) Spróbuj uruchomić inny system operacyjny z pendrive. Muszą być instrukcje, jak np. Umieścić system Windows na pamięci USB. Jeśli to zadziałało, wiesz, że Twoja maszyna może to zrobić.

b) Jeśli wiesz, że Twoje urządzenie uruchamia system operacyjny, wiesz, że uruchamia system operacyjny, gdy ulega awarii lub wyświetla komunikat „cześć”. Wiesz, że nie rozpoznał systemu operacyjnego po uruchomieniu na zwykłej partycji. Więcej informacji tutaj: http://en.wikipedia.org/wiki/Master_boot_record

c) Pierwszy sektor jest osiągalny przez otwarcie samego dysku . Spójrz na to: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx , akapit „Dyski fizyczne i woluminy”

cxxl
źródło