inż. Dariusz Mikiel

Początki standardu MBR

Tekstowy system operacyjny IBM PC DOS powstał przy współpracy IBM i Microsoft na początku lat 80. XX wieku. Jego protoplastą był QDOS firmy SCP, który Microsoft odkupił przed oficjalnym zaprezentowaniem standardu IBM PC w roku 1981.

Rok później programista IBM David Litton opracował koncepcję podziału pamięci masowej na logiczne, oddzielone od siebie dyski potocznie nazywane partycjami. Standard MBR opracowany przez Litton'a obejmował także koncepcję rozruchu komputera z dysku twardego. Wsparcie dla systemu partycjonowania urządzeń pamięci masowych i główny rekord rozruchowy, został oficjalnie zaprezentowany wraz z tekstowym systemem operacyjnym IBM PC DOS 2.0 w roku 1983. Umożliwił on wówczas rozruch modelu IBM PC XT z 10-Megabajtowym dyskiem twardym i założeniu na nim partycji. Tablica partycji opracowana przez Littona pozwalała na utworzenie do 4 partycji podstawowych, tym nie mniej DOS Microsoftu w wersji 2.0 posiadał spore ograniczenia pozwalające wykorzystać tylko jedną z nich. Narzędziem systemowym, który to umożliwiał był FDISK (Fixed Disk).

Schemat partycjonowania MBR dla komputerów klasy IBM PC wykorzystywany był od wczesnych lat 80 i nie posiadał alternatyw. Pierwotna i oryginalna wersja formatu MBR oraz jego boot code'u pozostała praktycznie nie zmieniona do roku 1996. Początkowo dostęp do sektorów na dysku odbywał się metodą CHS (ang. Cylinder Head Sector) poprzez określenie cylindra, głowicy i następnie sektora w którym chcemy zapisać lub odczytać dane. Kiedy w roku 1996 na rynek wszedł MS DOS 7.10 i MS Windows 95B wraz z nimi zostało zaprezentowane wsparcie dla dysków większych niż 8GB i ich obsługę w nowym standardzie LBA (ang. Logical Block Addressing). Schemat MBR był tym samym niezależny od postępu technologicznego pamięci masowych, producentów systemów operacyjnych i systemu plików a z biegiem lat był jedynie modyfikowany. Większość producentów systemów operacyjnych/systemów plików oparta była na tym standardzie. Z biegiem czasu na rynku pojawiły się jedynie narzędzia modyfikujące nieznacznie MBR w celu użycia więcej niż czterech partycji podstawowych. I tak w przypadku programu Advanced Active Partition działającej w rosyjskim tekstowym systemie operacyjnym PTS-DOS 6.60 (klon MS DOS) możemy utworzyć 8 podstawowych partycji.

MBR określany też jako Master Boot Block zapisany jest w pierwszym sektorze dysku poza systemem partycji. Według starej adresacji sektorów MBR znajduje się na pierwszej ścieżce, w pierwszym cylindrze oraz w pierwszym sektorze dysku (CHS – 0, 0, 1) i zajmuje jeden sektor (512 Bajtów) a w nowej adresacji znajduje się w LBA 0. Struktura głównego rekordu rozruchowego przedstawiona jest w tabeli nr 1 wraz z jej opisem poniżej.

Tab. 1 Struktura klasycznego MBR (512B)
Master Boot Record
Oznaczenie Offset Razmiar
Boot code0x0000446 bajtów
Primary partition table0x01BE64 bajty (16*4)
Boot signature0x01FE2 bajty

Boot code

Jest to elementarny kod rozruchowy komputera. Zapisany w sposób binarny w zerowym sektorze dysku na samym jego początku. Jest ściśle powiązany z firmware'em zapisanym w ROM BIOS (ang. Basic Input/Output System), który go wywołuje. Kod odwołuje się do rejestrów procesora i ładowany jest do pamięci RAM. Na podstawie tablicy partycji odszukuje na dysku aktywną partycję z boot sectorem i przekazuje kontrole do znajdującego się tam kolejnego mikrokodu. Jest to początek chain loading czyli łańcuszka, który w procesie rozruchu standardu IBM PC/AT odpowiada za wywołanie kolejnych loader'ów. Przekazując ostatecznie kontrole do jądra systemu operacyjnego.

Primary partition table

Tabela partycji to cztery 16-bajtowe pola określające umiejscowienie i wielkość partycji. Cztery pola umożliwiają zdefiniowanie 4 partycji podstawowych a tym samym ich maksymalną ilość na dysku. Tabela posiada sklasyfikowane informacje na temat typu partycji i ma krytyczne znaczenie dla odzyskiwania danych w przypadku konieczności znalezienia boot sectora uszkodzonej partycji. Poniżej przedstawiony i opisany został pojedynczy rekord tabeli partycji.

Tab. 2 Pojedynczy rekord w tabeli partycji MBR (16B)
Wpis w tabeli partycji
Oznaczenie Offset Rozmiar
Boot indicator0x00001 bajt
Starting CHS0x00013 bajty (1+1+1)
Partition type0x00041 bajt
Ending CHS0x00053 bajty (1+1+1)
Starting LBA0x00084 bajty
Size In LBA0x000C4 bajty

Boot indicator

Oznaczenie aktywnej partycji wyrażone w wartości heksadecymalnej 0x80 jako dysk fizyczny (partycja nieaktywna posiada oznaczenie 0x00). Wartość ta może być przypisana tylko do jednej partycji na dysku z której następuje rozruch komputera. Aktywna partycja sprawdzana jest przez boot code w każdym z czterech wpisów w tabeli partycji aby następnie przekazać kontrole do mikrokodu znajdującego się w jej sektorze rozruchowym. Choć narzędzie systemowe FDISK nie pozwoli na przypisanie wartości 0x80 do więcej niż jednej partycji, tym nie mniej istnieje taka możliwość co spowoduje błędy w rozruchu komputera.

Starting CHS

Adres początku partycji w adresacji CHS wyrażony w systemie szesnastkowym, używany do czasu pojawienia się dysków większych niż 8GB i ustanowienia nowego standardu adresacji LBA.

Partition type

Inaczej określany także jako identyfikator partycji (ang. Partition ID). Jest to 1-bajtowa wartość opisująca użyty w partycji system plików lub flaga określająca specyficzny dostęp do tej partycji tj. np. partycja z zaszyfrowanym systemem plików, specjalna ukryta partycja systemu operacyjnego, partycja odzyskiwania systemu operacyjnego, partycja rozszerzona, partycja linuksowa LVM, partycja z dostępem LBA czy w przypadku dysków CHS o specjalnym mapowaniu. Z oznaczenia typu partycji może korzystać boot loader lub jądro systemu operacyjnego.

Ending CHS

Adres końca partycji w adresacji CHS wyrażony w systemie szesnastkowym.

Starting LBA

4-bajtowy adres początku partycji dla dysku o adresacji typu LBA. Możliwość adresacji partycji zgodnie z LBA pojawiła się w MBR na długo wcześniej zanim standard ten został oficjalnie zaprezentowany. Początkowo standard IDE opcjonalnie zawierał 22-bitową adresację LBA, która później w roku 1994 w specyfikacji ATA-1 została rozszerzona do 28 bitów. Następnie w roku 2003 w specyfikacji ATA-6 rozszerzono ją do wersji 48-bitowej. BIOS Enhanced Disk Drive Services umożliwił korzystanie z dysków o adresacji LBA jednocześnie zapewniając wsparcie dla starych dysków CHS. Kiedy na rynku w 1996 roku pojawił się MS Windows 95B wspierający dyski LBA, większość z nich produkowana później posiadała już zaimplementowaną adresacje LBA.

Size In LBA

Rozmiar partycji w adresacji LBA (ilość sektorów w LBA).

Boot signature

Sygnatura rozruchowa komputera klasy PC służąca jako identyfikator urządzenia rozruchowego, zapisywana w systemie heksadecymalnym jako 0x55 (pierwszy bajt) i 0xAA (drugi bajt). Na jej podstawie BIOS komputera rozpoznaje dyski z których może uruchomić boot code. Jeżeli dyski twarde wykryte w BIOS i będące na liście urządzeń rozruchowych nie posiadają sygnatury lub mają błąd w jej zapisie, wówczas BIOS wyświetli komunikat typu “No boot device is available” lub “Reboot and select proper boot device". Obecność boot sygnatury określa także czy system plików znajdujący się np. na dodatkowym dysku zewnętrznym zostanie załadowany w systemie operacyjnym.

Na zrzucie ekranu poniżej pokazany został MBR z MS-DOS 3.30 w którym tabela partycji posiada możliwość wykorzystania adresacji LBA, gdzie na rynku wówczas nie było jeszcze dysków LBA. Ciekawostką jest też stosowanie we wczesnym MBR sygnatury dysku (podświetlony ciąg znaków), która wchodzi w skład obszaru zarezerwowanego oficjalnie dla boot code. Sygnatura dysku została oficjalnie zaprezentowana dopiero w MS Windows NT 3.5, gdzie później wyodrębniono ją z obszaru boot code.

MBR-MS-DOS-3.30
Zdj. 1 - Master Boot Record MS-DOS 3.30

Model partycji rozszerzonej

W roku 1987 w wersji MS-DOS 3.30 zaprezentowany został model partycji rozszerzonej. Teoretycznie umożliwiał stworzenie w niej dowolnej liczby dysków logicznych (ang. Logical DOS drive). Był to swego rodzaju kontener na partycje. W praktyce umożliwił założenie w systemie DOS maksymalnie dwóch partycji podstawowych, przy czym jedna z nich musiała być specjalnego typu tzw. rozszerzona. W niej można było stworzyć do 23 partycji logicznych, ponieważ narzędzie FDISK przydzielało dyskom logicznym kolejne litery alfabetu. W partycji rozszerzonej nie można było przechowywać danych.

EBR (ang. Extended Boot Record)

W przeciwieństwie do partycji podstawowych, które opisane są w jednej tabeli partycji w pierwszym sektorze dysku fizycznego, dyski logiczne opisane są w każdym EBR, który znajduje się przed nimi. W ten sposób powstaje łańcuszek EBR, który odpowiada za kolejne dyski logiczne. Pierwszy EBR i czasem jedyny musi znajdować się w pierwszym sektorze partycji rozszerzonej. Partycja rozszerzona może dzięki temu mechanizmowi zostać podzielona na wiele dysków logicznych. Budowa EBR jest taka sama jak MBR, przy czym boot code nie jest w niej używany i zwykle wypełniony jest zerami. Kontrole nad partycjami, załadowaniem systemu plików oraz systemu operacyjnego nadal sprawuje BIOS/MBR. Tabela partycji EBR jest taka sama jak w przypadku MBR poza tym, że posiada tylko wpisy dwóch pierwszych partycji. Pierwszy wpis dotyczy dysku logicznego, drugi adresu kolejnego EBR. W ostatnim EBR w łańcuszku, drugi wpis w tabeli partycji posiada zera. Ustanawiając tym samym ostatni dysk logiczny w partycji rozszerzonej. Trzeci i czwarty wpis w tabelach partycji EBR nie jest wykorzystywany i zwykle wypełniony jest także zerami. Poniżej ilustracja obrazująca strukturę partycji rozszerzonej.

Partycja-rozszerzona-EBR
Zdj. 2 - Struktura partycji rozszerzonej z wykorzystaniem EBR

Rozruch Komputera

Choć tabela partycji EBR pozwala oznaczyć partycję logiczną jako aktywną w praktyce Microsoft nie pozwala na rozruch systemu z takiej partycji. Jest to natomiast możliwe przy wykorzystaniu pewnych sztuczek.

Partycja-podstawowa-opis
Zdj. 3 - Opis zastosowania partycji podstawowej w MS Windows XP

Współczesna wersja MBR

Nowy MBR z oficjalną funkcją sygnatury dysku (ang. Disk signature) pojawił się w 1994 roku. Później bo w roku 1996 wprowadzono stempel czasu dysku (ang. Disk timestamp) i podzielono boot code na dwie części. Tym samym sygnatura i stempel czasu dysku zostały wyodrębnione z boot code. Współczesny MBR potrafi także rozpoznać aktywną partycję na podstawie 7-ego bitu w polu boot indicator w tabeli partycji.

Tab. 3 Zmodernizowany MBR
Zmodernizowany MBR
Oznaczenie Offset Rozmiar
Boot code0x0000218 bajtów
Disk timestamp (opcjonalnie)0x00DA6 bajtów (2+4*1)
Boot code0x00E0216 lub 222 bajty
Disk signature (opcjonalnie)0x01B86 bajtów (4+2)
Partition table0x01BE64 bajty (16*4)
Boot signature0x01FE2 bajty

Sygnatura dysku (ang. Unique MBR disk signature)

Jest 32-bitową unikalną wartością identyfikującą dysk, która może być wykorzystana przez system operacyjny. Funkcja ta została oficjalnie przedstawiona wraz z pojawieniem się MS Windows NT w wersji 3.5 i była wykorzystywana do indeksacji partycji na wszystkich dyskach, kiedykolwiek podłączanych do komputera w czasie używania OS. Sygnatury partycji przechowywane są w rejestrze systemu operacyjnego, przede wszystkim w celu ścisłego przyporządkowania im oznaczeń w postaci liter alfabetu oraz zachowania ich kolejności. Sygnatura dysku może być także użyta przez MS Windows NT w pliku BOOT.INI by określić partycję rozruchową. Obecnie wykorzystywana jest w wielu systemach operacyjnych m.in. w Linuksie od wersji kernel 2.6, gdzie może być także użyta do identyfikacji dysku/partycji rozruchowej.

Stempel czasu dysku (ang. Disk timestamp)

Czas wykrycia dysku przez OS i nadanie mu numeru porządkowego (ang. Physical drive number) tj. 80h pierwszy dysk, 81h drugi dysk itd. Fizyczny numer dysku znajduje się w offsecie 0DCh. Czas podany jest w formie godziny, minuty, sekundy i zapisany jest w offsecie 0DDh do 0DFh. Funkcja ta została zaprezentowana w MS Windows 95B i była wydana niezależnie od sygnatury dysku. Stempel czasu dysku początkowo uznawano za tajemnicze bity, które Microsoft wprowadził bez oficjalnego komunikatu. Stwarzały one pewne problemy przy uruchamianiu komputera, jeżeli ktoś np. wykonał lustrzaną kopie dysku i następnie używał go w systemie jako drugi dysk do np. backup'u danych. Microsoft z czasem wycofał się z tej "funkcji". Na zrzucie ekranu poniżej obszar przeznaczony dla disk timestamp posiada zera.

MBR-W98SE
Zdj. 4 - Master Boot Record MS Windows 98 SE

Funkcje MS Windows NT

MS Windows ME jako ostatni z rodziny 9x nie pozwalał utworzyć więcej niż jedną partycję podstawową, poprzez narzędzie FDISK. Pozwalał na założenie dodatkowej, specjalnej partycji podstawowej oznaczonej jako rozszerzona, na której można było tworzyć dyski logiczne. Nowa seria Windows oparta na jądrze NT umożliwiła tworzenie do 4 partycji podstawowych. Pojawił się w niej nowy mechanizm zarządzania partycjami, który umożliwiał łatwą modyfikację ich wielkości. Wprowadzona została także funkcja dysków dynamicznych, pozwalająca na łączenie wolumenów dyskowych w celach poprawy bezpieczeństwa danych lub zwiększenia ich wydajności.

MBR stosowany w MS Windows 7 i późniejszych wersjach nie posiadał już zer w obszarze disk timestamp. Jego miejsce zostało wykorzystane przez mikrokod. Obszar dawnego disk timestamp przyjmuje zawsze tą samą wartość, podobnie jest w przypadku Protective MBR w schemacie partycjonowania GPT. Poniżej MBR z MS Windows 10 z zaznaczonym obszarem disk timestamp i disk signature oraz mocno już rozbudowanym boot code.

MBR-W10
Zdj. 5 - Master Boot Record MS Windows 10 bez partycji

Boot sector partycji

Każdy producent systemów operacyjnych oraz systemów plików w standardzie IBM PC zagospodarowuje partycje wg. własnych zasad, przestrzegając jedynie ogólnego schematu partycjonowania MBR lub GPT. Podobnie jest w przypadku firmy Apple Inc. w standardzie opartym na procesorach Intela (Intel based Apple). Komputery Apple oparte na procesorach Power PC posługiwały się własnym schematem Apple Partition Map.

Do poprawnego uruchomienia systemu plików lub/i systemu operacyjnego, schemat partycjonowania MBR musi zawierać boot sector, który znajduje się na początku każdej partycji. W nim znajduje się BIOS Parameter Block, który zawiera opis partycji i/lub podstawową strukturę systemu plików. Ponadto w pierwszym sektorze partycji znajdują się także instrukcje dotyczące uruchamiania systemu operacyjnego jeśli taki jest.

Każdy system operacyjny posiada swój natywny system plików, skonfigurowany ściśle z boot loader'em danego systemu operacyjnego. W przypadku systemu plików NTFS kiedy jedynie formatujemy partycję dysku, zwykle tworzony jest tam również kod, odpowiadający za uruchomienie boot loader'a (programu NTLDR lub Windows Boot Manager).

Boot sector może być wykorzystany do opisu partycji bez użycia MBR. Dzieje się tak w przypadku dyskietek, kart pamięci czy w pendrive, gdzie zwykle nie stosuje się podziału na partycje. W takim przypadku jest on pierwszym sektorem w urządzeniu pamięci masowej i zastępuje MBR. Boot sector określany jest także jako VBR (ang. Volume Boot Record) lub jako Volume Boot Sector.

BootSector
Zdj. 6 - Boot Sector partycji z widocznym na początku SystemID NTFS

Ograniczenia

Ze względu na 32-bitową wartość pola Size LBA w tabeli partycji, schemat MBR posiada limit obsługi pojemności partycji i wynosi on 2 TB. Dla dysków o wielkości sektora 512 Bajtów maksymalny rozmiar partycji, którą można opisać to 2 do potęgi 32-giej. W wyniku daje to ilość 4'294'967'296 LBA a pomnożone przez wielkość sektora przekłada się maksymalnie na 2 TB. Obsługa dysków 4K przez MBR umożliwia zaadresowanie większej przestrzeni bo nawet 17.6 TB ale także może powodować rozmaite anomalie w funkcjonowaniu boot loader'ów a także programów systemowych i narzędziowych. Może także mieć wpływ na utratę danych. W dzisiejszych systemach operacyjnych oraz dyskach istnieje emulacja obsługi sektorów o wielkości 512 Bajtów.

Schemat partycjonowania MBR od początku swego istnienia czyli ponad 20 lat opierał się próbie czasu i wszelkim zmianom w standardzie IBM PC. Rozwój systemów operacyjnych oraz dyski o pojemności powyżej 2 TB, wymusiły potrzebę stworzenia nowej platformy UEFI oraz schematu partycjonowania GPT.