osdev.labedz.org

Standard Multiboot

Większość współcześnie tworzonych systemów operacyjnych posiada swój własny program ładujący, tak więc instalowanie nowego systemu najczęściej wiąże się z całkowitą zmianą mechanizmu bootowania. Praktycznie żaden komercyjny program bootujący nie jest też zgodny z innymi, tak więc umieszczenie na pojedynczym komputerze kilku różnych systemów operacyjnych jest problematyczne,a często nawet niemożliwe do wykonania.

Założeniem projektu GRUB było stworzenie specyfikacji takiego standardu dla interfejsu pomiędzy programem bootloadera i systemem operacyjnym, który umożliwił by ładowanie dowolnego systemu operacyjnego z poziomu dowolnego programu ładującego. Specyfikacja ta nie określa w jaki sposób ładowanie ma się odbyć - określa natomiast interfejs z jakim system operacyjny powinien być ładowany.

Idealnym rozwiązaniem dla takiego uniwersalnego programu ładującego było by, gdyby mógł on ładować pliki systemu operacyjnego bezpośrednio ze zwykłego pliku obiektowego. Niestety, z powodu nie do końca ścisłego trzymania się standardów plików obiektowych przez twórców konsolidatorów, najczęściej każdy system UNIX'owy posiada swój własny standard pliku obiektowego, który w niektórych szczegółach różni się od ogólnie przyjętego. Większość darmowych systemów operacyjnych używa jednego z wariantów plików a.out, część jednak zaczyna zmieniać standard plików obiektowych na typu ELF. Uniwersalny program ładujący powinien mieć zaimplementowany obsługę każdego z tych standardów co jest niestety nie możliwe.

Projektanci programu GRUB zastosowanie rozwiązanie kompromisowe. Systemy operacyjne zgodne ze standardem Multiboot powinny posiadać specjalny nagłówek (ang. Multiboot header), dzięki czemu program ładujący potrafi załadować obraz systemu bez potrzeby znajomości wielu wariantów standardu a.out czy innych.

Format obrazu systemu operacyjnego

Obraz systemu operacyjnego może być typowym, 32-bitowym, obiektowym plikiem uruchomialnym. Warunkiem koniecznym jest jednak, aby nie zajmował on przestrzeni pamięci zarezerwowanej przez komputer PC, oraz nie używał mechanizmów dzielenia bibliotek, oraz innych zaawansowanych mechanizmów.

Nagłówek Multiboot

Obraz pliku systemu powinien także zawierać dodatkowy, poza typowymi dla danego standardu pliku obiektowego, nagłówek zwany nagłówkiem Multiboot umieszczony w pierwszych 8192 bajtach pliku i dopasowany do ramy adresowej słowa 32-bitowego.

PrzesunięcieielkośćNazwa polaOpis
032liczba 'magiczna'niezbędne
432flaginiezbędne
832suma kontrolnaniezbędne
1232adres nagłówkajeśli flaga [16] jest ustawiona
1632adres ładowaniajeśli flaga [16] jest ustawiona
2032adres końca ładowaniajeśli flaga [16] jest ustawiona
2432adres końca sekcji .bssjeśli flaga [16] jest ustawiona
2832adres wejścia do systemujeśli flaga [16] jest ustawiona
3232rodzaj trybujeśli flaga [2] jest ustawiona
3632szerokośćjeśli flaga [2] jest ustawiona
4032wysokośćjeśli flaga [2] jest ustawiona
4432głębiajeśli flaga [2] jest ustawiona
Tabela: Budowa nagłówka Multiboot
  • Liczba 'magiczna' jest to pole z określoną wartością, po której program GRUB rozpoznaje nagłówek Multiboot. Jej wartość wynosi 0x1BADB002.
  • Pole flagi określa właściwości jakich wymaga od programu ładującego system operacyjny, aby mógł zostać prawidłowo zainicjowany. Bity 0-15 określają żądania, które jeśli nie będą mogły być spełnione, to proces bootowania zostanie przerwany, bity 16-31określają dodatkowe właściwości ładowania systemu. Jeżeli program ładujących nie rozumie ich znaczenia, bądź też nie może ich spełnić, są one ignorowane, a system jest inicjowany standardowo. Wszystkie bity dotąd nie zdefiniowane powinny mieć wartość zero.
  • Wartość jeden bitu zerowego pola flagi nakazuje programowi ładującemu umieszczanie wszystkich modułów systemu operacyjnego w obszarach pamięci o adresach dopasowanych do ramy strony (4KB). Bit 1 wymusza umieszczenie w polach mem_* struktury informacyjnej standardu Multiboot informacji na temat dostępnej pamięci operacyjnej. Bit 2 wymusza na programie ładującym udostępnienie systemowi operacyjnemu tablicy z trybami graficznymi. Ustawienie bitu 16 uaktywnia użycie pól o przesunięciu 8 do 28 w nagłówku pliku obiektowego obrazu systemu operacyjnego. Informacje te nie są wymagane jeżeli plik obiektowy jest standardu ELF, natomiast są niezbędne przy standardzie a.out lub innym.
  • Pole sumy kontrolnej jest 32-bitową liczbą o wartości określoną wzorem -(MAGIC + FLAGS).
  • Adres nagłówka zawiera wartość fizycznego adresu początku nagłówka Multiboot. Pole te umożliwia synchronizację odwzorowania pomiędzy obrazem systemu operacyjnego a jego adresem fizycznym.
  • Adres ładowania zawiera wartość określającą z pod jakie adresu powinien zostać załadowany segment kodu. Przesunięcie w pliku obiektowym jest to wartość znalezionego nagłówka minus wartość(adres nagłówka - adres ładowania). Adres ładowania powinien być mniejszy bądź równy niż adres nagłówka.
  • Adres końca ładowania zawiera fizyczny adres końca segmentu danych. Wartość (adres końca ładowania - adres ładowania) określa ile danych należy załadować do pamięci. Plik obiektowy powinien być plikiem ciągłym - sekcje kodu i danych powinny leżeć obok siebie. Jeżeli pole adresu końca ładowania ma wartość zero, program ładujący wgrywa cały plik obiektowy do pamięci.
  • Adres końca sekcji .bss zawiera adres fizyczny końca tej sekcji. Program ładujący wypełnia odpowiedni fragment pamięci zerami i rezerwuje go (w celu zabezpieczenia przed nadpisaniem innymi modułami). Jeżeli pole te ma wartość zero, program ładujący przyjmuje, że w pliku obiektowym niema sekcji .bss.
  • Adres wejścia do systemu jest to fizyczny adres pamięci gdzie program ładujący powinien przekazać sterowanie po zakończeniu procesu bootowani'a.
  • W polu rodzaj trybu umieszczany jest żądany tryb graficzny - wartość zero określa liniowy tryb graficzny, natomiast wartość jeden określa tryb graficzny zgodny ze standardowym trybem tekstowym karty EGA.
  • Pole szerokość zawiera żądaną liczbę kolumn obrazu. W trybie graficznym jednostką jest jeden piksel, a w trybie tekstowym jeden znak. Wartość zero oznacza, że ładowany system operacyjny nie ma specjalnych wymagań co do tego parametru.
  • Pole wysokość określa żądaną liczbę linii obrazu. W trybie graficznym jednostką jest jeden piksel, a w trybie tekstowym jeden znak. Wartość zero oznacza, że ładowany system operacyjny nie ma specjalnych wymagać co do tego parametru.
  • Pole głębia określa żądaną głębie kolorów trybu graficznego. Wartość zero oznacza, że ładowany system operacyjny nie ma specjalnych wymagań co do tego parametru, bądź żądany tryb karty graficznej jest trybem tekstowym.

Struktura informacji o bootowaniu

Po przekazaniu przez program ładujący sterowania do procedury wejścia systemu operacyjnego, rejestr EBX procesora zawiera fizyczny adres struktury danych zawierających informację o procesie bootowania. Informacje te mają charakter jedynie doradczy - system operacyjny może je zignorować.

Struktura informacyjna może być umieszczona w dowolnym miejscu pamięci - jeżeli system operacyjny będzie z nich korzystać, musi się zatroszczyć o odpowiednie zabezpieczenie tej przestrzeni adresowej przed przypadkowym zamazaniem.

Definicja struktury informacyjnej znajduje się w pliku nagłówkowym multiboot.h, znajdującym się w pakiecie instalacyjnym programu. Po dołączeniu tego pliku do kodu systemu operacyjnego możemy korzystać ze zdefiniowanych symboli zmiennych, bez potrzeby używania bezpośredniego adresu fizycznego.

Fragment programu wypisujący na ekranie podstawowe informacje dotyczące pamięci komputera zaczerpnięte ze struktury informacyjnej standardu Multiboot:

multiboot_info_t *mbi; mbi = (multiboot_info_t *) addr; if (CHECK_FLAG (mbi->flags, 0)) kprintf ("mem_lower = %uKB, mem_upper = %uKB\n", (unsigned) mbi->mem_lower, (unsigned) mbi->mem_upper);