Завантажувальний запис тому

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Завантажувальний запис тому (англ. Volume Boot Record — VBR, також відомий як завантажувальний сектор тому, завантажувальний запис розділу або завантажувальний сектор розділу) — це тип завантажувального сектора, впровадженийв IBM PC. Його можна знайти на розділеному пристрої зберігання даних, наприклад на жорсткому диску, або на нерозділеному пристрої, наприклад на дискеті, і він містить машинний код для програм завантаження (зазвичай, але не обов'язково, операційних систем), що зберігаються в інших частинах пристрою. На нерозділених пристроях зберігання це перший сектор пристрою. На розділених пристроях це перший сектор окремого розділу на пристрої, причому першим сектором всього пристрою є головний завантажувальний запис (MBR), що містить таблицю розділів.

Код завантажувального запису тому викликається або безпосередньо мікропрограмою машини, або опосередковано кодом у головному завантажувальному записі, або диспетчером завантаження. Код в MBR і VBR, по суті, завантажується однаково .

Виклик VBR через менеджер завантаження відомий як ланцюжкове завантаження . Деякі системи з подвійним завантаженням, такі як NTLDR (завантажувач для всіх випусків операційних систем Microsoft Windows NT, аж до Windows XP і Windows Server 2003 включно), зберігають копії коду завантаження, який встановлюють окремі операційні системи в один розділів VBR і зберігайте їх у файлах диска, завантажуючи відповідний вміст VBR з файлу після того, як завантажувач запитав користувача, яку операційну систему потрібно завантажити. У Windows Vista, Windows Server 2008 і новіших версіях NTLDR було замінено; натомість функціональність завантажувача забезпечується двома новими компонентами: WINLOAD.EXE та диспетчером завантаження Windows.

У файлових системах, таких як FAT12 (за винятком DOS 1.x), FAT16, FAT32, HPFS і NTFS, VBR також містить блок параметрів BIOS (BPB), який визначає розташування та розкладку основних структур даних на диску для файлової системи.

Технічні деталі

[ред. | ред. код]

Підпис

[ред. | ред. код]

Наявність IBM PC-сумісного завантажувача для процесорів x86 у завантажувальному секторі за умовою позначається двобайтовою шістнадцятковою послідовністю, яка називається підписом завантажувального сектора (55h із фіксованим зміщенням+1FEh іAAh at+1FFh ) для розмірів секторів 512 байт або більше.[nb 1] Для секторів розміром 512 байт підпис сектора завантаження також позначає кінець сектора. VBR на менших і більших секторах також можуть показувати підписи в кінці фактичного розміру сектора, однак семантика, описана тут, застосовується до 16-бітового підпису лише на +1FEh .

Цей підпис вказує на наявність принаймні фіктивного завантажувача, який безпечно виконувати, навіть якщо він не може фактично завантажити операційну систему. Це не вказує на наявність (або навіть певної) файлової системи чи операційної системи, хоча деякі старі версії DOS до 3.3 покладалися на неї у своєму процесі для виявлення носіїв у форматі FAT (нові версії цього не роблять). Код завантаження для інших платформ або процесорів не повинен використовувати цю сигнатуру, оскільки це може призвести до збою, коли BIOS передає виконання в завантажувальний сектор, припускаючи, що він містить дійсний виконуваний код. Це означає, що носії FAT12 / FAT16, які також будуть використовуватися дуже старими версіями DOS, повинні підтримувати підпис, навіть якщо вони не містять операційної системи або призначені для завантаження лише на інших платформах; отже, вони також повинні містити принаймні x86-сумісний (фіктивний) завантажувач (для порівняння див. приклади FAT на Atari ST та з MSX-DOS ). Тим не менш, деякі носії для інших платформ помилково містять підпис навіть без фіктивного завантажувача, сумісного з x86, що робить перевірку не на 100% надійною на практиці.

Підпис перевіряється більшістю системних BIOS, починаючи (принаймні) з IBM PC/AT (але не оригінальним IBM PC та деякими іншими машинами). Більше того, він також перевіряється більшістю завантажувачів MBR перед передачею керування завантажувальному сектору. Деякі BIOS (наприклад, IBM PC/AT) виконують перевірку лише для фіксованих дисків/знімних дисків, тоді як для дискет і суперфлоппі достатньо почати з байта, більшого або рівного 06h і перші дев'ять слів не містять однакового значення, перш ніж завантажувальний сектор буде прийнятий як дійсний, уникаючи, таким чином, явного тесту для 55h ,AAh на дискетах. Оскільки старі завантажувальні сектори (тобто дуже старий носій CP/M-86 і DOS) іноді не мають цього підпису, незважаючи на те, що їх можна успішно завантажити, перевірку можна вимкнути в деяких середовищах. Це також відображає той факт, що дискети можуть бути відформатовані для використання менших розмірів секторів, ніж 512 байт.

Якщо код BIOS або MBR не виявляє дійсний завантажувальний сектор і тому не може передати виконання коду завантажувального сектора, він спробує наступний завантажувальний пристрій у рядку. Якщо всі вони виходять з ладу, зазвичай відображатиметься повідомлення про помилку та викликається INT 18h.[1] Це або запустить додаткове резидентне програмне забезпечення в ROM (ROM BASIC), буде зроблена спроба віддалено завантажитися через мережу, перезавантажить систему через INT 19h після підтвердження користувача, або змусить систему зупинити процес завантаження до наступного ввімкнення.[1]

Від десяткового зміщення від 72 до 79 PBR NTFS містить серійний номер ідентифікатора тому UUID розділу.

Виклик

[ред. | ред. код]

Код завантаження в VBR може припускати, що BIOS налаштував свої структури даних, а також перериває та ініціалізує апаратне забезпечення. Код не повинен передбачати наявність більше 32 КБ пам'яті для безпечної роботи[1]; якщо йому потрібно більше пам'яті, він повинен запитати для нього INT 12h, оскільки інший код перед завантаженням (наприклад, BIOS extensions overlays, системи шифрування або завантажувачі віддаленого завантаження) також можуть бути присутніми в інших місцях пам’яті (і зазвичай ховаються від завантажувального сектора, відповідно зменшуючи звітну пам’ять INT 12h, щоб вони не були перезаписані MBR та діями VBR). Специфікація завантаження BIOS передбачає 64 КБ пам’яті та чітко рекомендує 0000h:7C00h до 0000h:FFFFh як тимчасовий блокнот.[2][1] Код завантаження не повинен передбачати кращі процесори, ніж оригінальний Intel 8088 або 8086 (використовується в оригінальному ПК), і не робити ніяких припущень щодо точного стану апаратного забезпечення, системи переривань (переривання можна ввімкнути або вимкнути) або розташування і розмір стеку. Хоча оригінальний IBM BIOS ініціалізує регістри ЦП DS, ES і SS для сегментації 0000h і підтримує початковий стек на рівні SS:SP = 0000h:0400h, це не умова, на яку можна покладатися, оскільки не всі BIOS та коди MBR відповідають цій умові. Регістри, не зазначені нижче, повинні розглядатися як неініціалізовані. Прямий доступ до обладнання зазвичай не допускається. Хоча таблиця параметрів диска (DPT/FDPB) зазвичай налаштовується за адресою 0000h:0078h вже в пам’яті, VBR повинен перемістити (і, можливо, виправити) DPT, на який вказує вектор INT 1Eh, до цього місця (INT 1Eh не є перериванням, а далеким покажчиком на DPT).

Деякі умови можуть бути послаблені в контрольованому середовищі, наприклад, деякі завантажувачі сьогодні припускають, що мають до 128 КБ пам’яті для роботи в нормальному режимі (без запиту про більше), а деякі завантажувачі, що використовують доступ до LBA, передбачають принаймні Intel ЦП 80188 або 80186 .

VBR завантажується в пам'ять за адресою 0000h:7C00h[1] і з наступними регістрами ЦП, налаштованими, коли попередній завантажувач (тобто, як правило, BIOS або MBR, але, можливо, інший завантажувач) переходить до нього, стрибаючи до 0000h:7C00h в реальному режимі ЦП.

  • CS:IP = 0000h:7C00h (фіксоване)

Натомість деякі BIOS Compaq помилково використовують 07C0h:0000h. Хоча це розв’язується в тому самому місці в пам’яті реального режиму, це нестандартно, і його слід уникати, оскільки код VBR, який передбачає певні значення регістра або не записаний для переміщення, може не працювати інакше.

  • DL = завантажувальний пристрій ( дискети / суперфлоппі: 00h = перший, 01h = другий, ..., 7Eh ; фіксовані диски / знімні диски : 80h = перший, 81h = другий, ..., FEh; значення 7Fh і FFh зарезервовані для ROM / віддалених дисків і не повинні використовуватися на диску).[3] DL підтримується BIOS IBM, а також більшістю інших BIOS. Відомо, що BIOS Toshiba T1000 не підтримує це належним чином, і деякі старі BIOS Wyse 286 використовують значення DL більші або рівні 2 для жорстких дисків. USB-флешки, налаштовані як суперфлоппі, зазвичай отримують призначення DL = 00h або 01h, однак деякі рідкісні BIOS помилково представляють USB-флешки, налаштовані як знімні диски, як DL = 01h, замість DL = 80h. Традиційно під час завантаження BIOS передавав лише значення 00h і 80h, а багато секторів завантаження були підключені до роботи з фіксованими значеннями, так чи інакше. Plug and Play BIOS Specification і BIOS Boot Specification (BBS) дозволяють іншим пристроям також стати завантажувальними.[2][4] Останнія також рекомендує, щоб коди MBR і VBR використовували DL, а не внутрішні параметри за замовчуванням.[2] (Примітка: MS-DOS/PC DOS і OS/2 VBR ігнорують надане значення DL і натомість отримують значення, збережене зі зміщенням +19h у Extented BIOS Parameter Block (EBPB) або зі зміщенням сектора +1FDh у версіях DOS 3.2–3.31. Деякі версії DR-DOS використовують DL, починаючи з 7.02. DR-DOS 7.07 VBR за замовчуванням використовують DL та ігнорують значення BPB, але SYS /O[:nnn] можна використовувати, щоб повторно викликати стару поведінку використання значення BPB або навіть примусити зберігати там певний завантажувальний диск nnn.[3] На томах FAT32 FreeDOS також використовує значення DL, тоді як вона робить це лише на томах FAT12/FAT16, якщо значення BPB встановлено на FFh . )
  • DH біт 5 = 0: пристрій підтримується через INT 13h; інакше: байдуже (повинно бути нульовим). DH підтримується деякими BIOS IBM. Деякі коди MBR і VBR зберігають значення DH.

Системи з підтримкою Plug-and-Play BIOS або BBS нададуть вказівник на дані PnP на додаток до DL[2][4]:

  • DL = завантажувальний привід (див. вище)
  • ES:DI = вказує на структуру перевірки встановлення "$PnP".

Ця інформація дозволяє завантажувачу (у MBR або VBR) активно взаємодіяти з BIOS або резидентним накладенням PnP/BBS в пам'яті, щоб налаштувати порядок завантаження тощо, однак ця інформація ігнорується більшістю стандартних MBR і VBR. В ідеалі ES:DI передається, але операційні системи з підтримкою PnP зазвичай також мають резервні методи для отримання точки входу PnP BIOS пізніше, щоб більшість операційних систем не покладалися на це. Інформацію в ES:DI можна використовувати як підказку - відповідно до специфікації BIOS PnP, структуру перевірки встановлення "$PnP" можна знайти шляхом пошуку підпису рядка ASCII $PnP в системній пам'яті, починаючи з F0000h до FFFFFh на кожній межі 16 байтів.

З розділеними носіями, коли VBR запускається MBR (або іншим завантажувачем), а не BIOS, багато реалізацій передають додаткову інформацію до VBR, окрім просто DL (а іноді також DH та ES:DI):

  • DS:SI = вказує на 16-байтовий запис таблиці розділів MBR (у переміщеному MBR), що відповідає активованому VBR. PC-MOS 5.1 залежить від цього для завантаження, якщо жоден розділ у таблиці розділів не позначено як завантажувальний. У поєднанні з LOADER, багатокористувацькі DOS і завантажувальні сектори REAL/32 використовують це для пошуку завантажувального сектора активного розділу (або іншого bootstrap завантажувача, такого як IBMBIO.LDR у фіксованому положенні на диску), якщо файл завантаження (LOADER. SYS) не вдалося знайти. PTS-DOS 6.5 і S/DOS 1.0 використовують це в поєднанні зі своєю функцією Advanced Active Partition (AAP). На додаток до підтримки LOADER і AAPs, DR-DOS 7.07 може використовувати це для визначення необхідного методу доступу INT 13h при використанні його подвійного коду VBR CHS/LBA. Код MBR OS/2, MS-DOS (до версії 7.0), PC DOS (до 7.10) і Windows NT (приблизно до 2007 р.) також забезпечує такий самий інтерфейс, хоча ці системи не використовують це. MBR, встановлений у Windows NT 6.0 (і вище), використовує інші регістри, і тому більше не сумісна з цими розширеннями. Хоча деякі розширення залежать лише від самого запису таблиці розділів 16 байт, інші розширення можуть вимагати, щоб також була присутня вся таблиця розділів із 4 (або 5 записами).

Відповідно до DR-DOS 7.07 розширений інтерфейс може використовуватися за бажанням MBR та разом із LOADER:

  • AX = магічний підпис, що вказує на наявність цього розширення (0EDCh)
  • DL = завантажувальний привід (див. вище)
  • DS:SI = вказує на 16-байтовий запис таблиці розділів MBR, який використовується (див. вище)
  • ES:BX = початок завантажувального сектора або спеціального зображення сектора "NEWLDR" (зазвичай 7C00h)
  • CX = зарезервовано

У поєднанні з таблицями розділів GUID (GPT), Enhanced Disk Drive Specification (EDD) 4 Hybrid MBR рекомендує інше розширення інтерфейсу MBR до VBR[5]:

  • EAX = 54504721h ("!GPT")
  • DL = завантажувальний привід (див. вище)
  • ES:DI = вказує на структуру перевірки встановлення "$PnP" (див. вище)
  • DS:SI = вказує на структуру гібридної передачі MBR, що складається з 16-байтового запису таблиці розділів MBR (з усіма бітами, за винятком встановлених прапорця завантаження зі зміщенням +0h і типу розділу зі зміщенням +4h), за яким слідують додаткові дані. Це частково сумісно зі старішим розширенням DS:SI, яке обговорювалося вище, якщо цим старішим розширеннями потрібен лише 16-байтовий запис розділу, а не вся таблиця розділів.

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. The signature at offset +1FEh in boot sectors is 55h AAh, that is 55h at offset +1FEh and AAh at offset +1FFh. Since little-endian representation must be assumed in the context of IBM PC compatible machines, this can be written as 16-bit word AA55h in programs for x86 processors (note the swapped order), whereas it would have to be written as 55AAh in programs for other CPU architectures using a big-endian representation. Since this has been mixed up numerous times in books and even in original Microsoft reference documents, this article uses the offset-based byte-wise on-disk representation to avoid any possible misinterpretation.

Джерела

[ред. | ред. код]
  1. а б в г д Paul, Matthias R. (2 жовтня 1997) [1997-09-29]. Caldera OpenDOS 7.01/7.02 Update Alpha 3 IBMBIO.COM - README.TXT and BOOT.TXT - A short description of how OpenDOS is booted. Архів оригіналу за 4 жовтня 2003. Процитовано 29 березня 2009. [1]
  2. а б в г Compaq Computer Corporation; Phoenix Technologies Ltd.; Intel Corporation (11 січня 1996). BIOS Boot Specification 1.01 (PDF). 1.01. Архів оригіналу (PDF) за 14 квітня 2016.
  3. а б Paul, Matthias R. (14 серпня 2017) [2017-08-07]. The continuing saga of Windows 3.1 in enhanced mode on OmniBook 300. MoHPC - the Museum of HP Calculators. Архів оригіналу за 1 травня 2018. Процитовано 1 травня 2018. […] SYS […] /O[:nnn] Override IPL reported boot drive unit (n=0..126, 128..254). […] Preparing target disk... Choosing FAT12 CHS Boot Sector (requires IPL to report boot unit). Treating target as diskette or superfloppy medium (boot drive unit 0). Writing new Boot Sector... […]
  4. а б Compaq Computer Corporation; Phoenix Technologies Ltd.; Intel Corporation (5 травня 1994). Plug and Play BIOS Specification 1.0A (PDF). 1.0A. Архів оригіналу (PDF) за 2 лютого 2018.
  5. Elliott, Robert (4 січня 2010). EDD-4 Hybrid MBR boot code annex (PDF). Hewlett Packard, T13 Technical Committee. e09127r3. Архів (PDF) оригіналу за 1 травня 2018. Процитовано 1 травня 2018.

Література

[ред. | ред. код]