ru:docs:boot:bootsector

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ru:docs:boot:bootsector [2014/05/21 22:29] (current)
Line 1: Line 1:
 +===== Описание бутсектора для FreeLdr =====
 +
 +  * Данный ​ бутсектор ​ предназначен ​ для ​ использования ​ в загрузчике FreeLdr системы ​ osFree ​ (OS/​3) ​ для ​ загрузки Micro File System Driver (MicroFSD, aka blackbox). ​ BlackBox -- это обычный DOS executable в COM-формате,​ то есть, его размер ​ теоретически ​ ограничен ​ 64  Кбайтами. ​ Поэтому данный загрузчик также рассчитан на загрузку файлов размером до 64 Кбайт.
 +  * Замечание. ​
 +    * Данный ​ загрузчик просто грузит произвольный файл размером до 64  Кб как последовательность секторов и передает управление этому файлу. ​
 +    * Файл грузится ​ по  определенному ​ сегментному ​ адресу ​ и  управление ​ передается по заданному ​ адресу точки входа, находящейся в этом сегменте. ​
 +    * Как сегмент,​ так и точка ​ входа ​ настраиваются ​ --  они могут быть любыми. ​
 +    * Загружаемый файл может быть любым файлом такого размера,​ но его первичное предназначение -- содержать в  себе ​ MicroFSD.
 +  * Идеология ​ следующая: ​
 +    * Данный загрузчик не понимает никакой файловой ​ системы. ​
 +    * Его предназначение -- загрузить Blackbox для конкретной ФС.
 +    * Смысл ​ метафоры BlackBox'​а в том, что есть один единственный исполняемый файл, который ​ понимает ​ формат конкретной ФС. 
 +    * Остальные части загрузчика независимы от  ФС, они используют Blackbox как черный ящик, который умеет читать файлы сданной ​ ФС,  вся ​ специфика которой спрятана внутри этого черного ящика (англ. black  box  --  черный ​ ящик).  ​
 +    * BlackBox для этого предоставляет 4 функции: ​
 +      - Открыть ​ файл ​
 +      - Закрыть файл ​
 +      - Прочитать данные из файла ​
 +      - Завершить работу с BlackBox.
 +    * Данный ​ загрузчик ​ имеет две версии. Обе из них компилируются из одного и того ​ же  исходного ​ файла. Для ​ получения ​ первой версии необходимо задать в мейкфайле ​  ​бутсектора ​  ​препроцессорный ​  ​символ ​  ​OLDCODE ​  ​(т. ​  ​е., ​  ​надо раскомментировать в мейкфайле -dOLDCODE).
 +    * Первая ​ версия ​ отличается ​ тем, ​ что ​ она  ​
 +      * совместима ​ с  IBM'​овским бутсектором ​ для ​ FAT и может грузить IBM FAT MicroFSD ​
 +      * умеет грузить только нефрагментированные ​ файлы. (IBM'​овский ​ FAT-бутсектор ​ тоже не умеет грузить фрагментированные ​ файлы, ​ но размер IBM FAT MicroFSD -- всего 2-3 сектора,​ но для более сложных ФС это не подходит,​ т.к. размер MicroFSD значительно больше,​ и вероятность фрагментации возрастает. (Для примера:​ размер ext2fs MicroFSD -- 30 секторов)). ​ Данная версия подходит,​ когда загружаемый файл гарантированно не  является ​ фрагментированным ​ (или ​ с  высокой ​ долей ​ вероятности является таким), ​ например, ​ когда это не файл как таковой,​ а остаток бутблока ФС после бутсектора, ​ если такая область для данной ФС предусмотрена (например,​ JFS или HPFS).
 +    * Вторая ​  ​версия  ​
 +      * несовместима ​ с  IBM  FAT  MicroFSD,  ​
 +      * но  может ​ грузить фрагментированный ​ файл ​ MicroFSD.  ​
 +      * Она ​ более ​ подходит ​ в  том случае,​ когда специальной ​ области ​ под бутблок не предусмотрено,​ например,​ FAT12, FAT16 или "​чужие" ​ файловые ​ системы, ​ такие ​ как ext2fs (в ext2fs перед суперблоком для загрузчика предусмотрено лишь два сектора,​ что очень мало для MicroFSD).
 +
 +==== Поля бутсектора (от конца к началу) ====
 +
 +    - Сигнатура ​ бутсектора: ​ word,  находится ​ по смещению 0x1FE от начала бутсектора и равна 0x55AA.
 +    - ForceLBA: byte, смещение 0x1FD, если данный байт равен 1, то поддержка доступа через LBA не проверяется,​ а включается принудительно.
 +
 +==== Параметры первой версии (-dOLDCODE) ====
 +
 +    - muFSDLen, ​ byte  (смещение ​ 0x1FC). Задает длину загружаемого файла в секторах.
 +    - muFSDAddr, ​ dword  (смещение ​ 0x1F8). Задает номер стартового сектора загружаемого ​ файла. ​ Этот ​ номер ​ отсчитывается от начала раздела. (бутсектор имеет номер 0).
 +    - muFSDEntry, ​ word  (смещение ​ 0x1F6). ​ Задает ​ смещение точки входа в загружаемый исполняемый файл от начала сегмента.
 +    - muFSDLoadSeg, ​ word  (смещение ​ 0x1F4). ​ Задает ​ сегментный адрес, по которому производится загрузка.
 +
 +==== Параметры второй версии ====
 +
 +  * В  отличие ​ от  первой ​ версии, ​ вторая ​ версия не содержит адрес и длину загружаемого ​ файла ​ непосредственно ​ в  бутсекторе. ​ Взамен ​ этого, бутсектор содержит только адрес дополнительного сектора с картой размещения загружаемого файла (allocation map sector).
 +  * Более ​ развернуто.  ​
 +    * Вторая ​ версия бутсектора содержит поддержку загрузки фрагментированного ​ файла. ​ Длина ​ этого ​ файла ​ может ​ быть ​ как максимум,​ 64 Кбайта. 64 Kb / 512 = 128 секторов. То есть, этот файл может занимать max. 128 секторов. ​ Максимальный ​ вариант фрагментированного файла -- это 128 секторов,​ разбросанные по всему диску. Для хранения адреса каждого сектора потребуется 4 байта. ​  ​4 ​  ​* ​  ​128 ​  ​== ​  ​512, ​  ​то ​ есть, ​ для ​ хранения ​ карты ​ размещения фрагментированного файла длиной 64 Кб потребуется в точности один сектор. Этот сектор ​ представляет ​ собой ​ массив ​ из 128 4-х-байтных указателей на секторы. Каждое 4-байтное двойное слово указывает в точности на один сектор.
 +    * Сектор ​ с  картой ​ размещения ​ загружаемого файла может располагаться где угодно на диске. Он может находиться как непосредственно после бутсектора (как это ​ сделано ​ у  нас при загрузке с раздела с файловой системой ext2fs: в ext2 под ​ загрузчик ​ зарезервировано как раз 2 сектора,​ первый из них -- бутсектор,​ второй ​ --  карта ​ распределения.),​ так и в любом месте области файлов ФС (как это имеет место при загрузке с FAT-раздела).
 +      - mapAddr: ​ dword (смещение 0x1F9), задает номер сектора с  картой размещения загружаемого файла. Номер отсчитывается от начала раздела (бутсектор имеет номер 0).
 +      - muFSDEntry: ​ word  (смещение 0x1F7), задает точку входа в загружаемый файл.
 +      - mapLoadSeg: ​ word  (смещение 0x1F5), задает адрес загрузки allocation map. Загружаемый ​ файл ​ грузится ​ сразу ​ после ​ allocation ​ map  (т.  е.,  по сегментному адресу muFSDLoadSeg == mapLoadSeg + 0x20).
 +  * Загружаемый ​ файл загружается по кускам в один сектор согласно allocation map  и  грузится непосредственно после allocation map. То есть, если мы хотим, например, ​ загрузить ​ файл ​ по  сегментному ​ адресу ​ 0x5660, ​ то  нужно задать mapLoadSeg == muFSDLoadSeg - 0x20 == 0x5640.
 +
 +==== Замечания ====
 +
 +   - Данный ​ бутсектор ​ использует LBA для загрузки секторов с диска, если расширения ​ int  13h  поддерживаются BIOS'​ом. В противном случае он использует функцию для чтения секторов через CHS.
 +   - При ​ загрузке ​ с  флоппи-диска данный бутсектор использует CHS, кроме того, ​ производится ​ инициализация флоппи-контроллера для работы с дискетами с нестандартным количеством секторов в треке.
 +
 +(c) osFree project, ​
 +2006, Nov 12.
  

ru/docs/boot/bootsector.txt · Last modified: 2014/05/21 22:29 (external edit)