Автор: Гречников Евгений nickname diamond
Приложение
А
Спецификация на первичный загрузчик
Загрузчик должен предоставлять следующие сервисы:
1. При загрузке компьютера, получив управление от BIOS'а,
загружать
файл loader из папки kord по адресу 0x1000:0000. Размер файла loader не
превосходит 0x30000 = 192 Kb.
2. При этом устанавливать следующие регистры:
- ax идентифицирует устройство:
- 'f' - флопик
- 'h' - HDD
- 'c' - CD/DVD
- 'u' - USB флешка
- '?' - неизвестное устройство
- ah = номер устройства (среди всех устройств фиксированного
типа).
- bx = тип файловой системы:
- '12' = FAT12
- '16' = FAT16
- '32' = FAT32
- 'nt' = NTFS
- 'is' = ISO-9660
- ds:si = far-указатель на callback-сервис
3. Предоставлять callback-сервис для вторичного загрузчика -
far-процедуру:
на входе: ax = запрашиваемая функция на выходе:
CF=1, если функция не поддерживается; CF=0 иначе загрузчик может
разрушать все регистры, включая сегментные, за исключением ss и sp.
4. Всегда должна поддерживаться callback-функция 1: назначение:
прочитать файл, расположенный на загрузочном устройстве на входе:
ax = 1, ds:di = указатель на информационную структуру:
- dw:dw far-указатель на буфер, первое слово - смещение,
второе - сегмент
- dw максимальное число 4Kb-блоков для чтения (0x1000 байт)
должно быть ненулевым и строго меньше 0x100
- ASCIIZ имя файла в формате
"<папка1>/<папка2>/<файл>"
Если имя файла содержит
символы из старшей половины ASCIIZ-таблицы или не является 8.3-именем
(в смысле, одна из компонент имени файла имеет имя длиннее 8 символов
или расширение длиннее 3), загрузчик может не найти такой файл, даже
если он есть (а может и найти). на выходе:
- bx = статус: 0 = успешно 1 = файл оказался слишком
большим,
буфер заполнен целиком и есть ещё данные файла 2 = файл не найден 3 =
произошла ошибка чтения dx:ax = размер файла или 0xFFFF:FFFF, если файл
не найден
5. Всегда должна поддерживаться callback-функция 2: назначение:
продолжить чтение файла, частично загруженного функцией 1 на входе:
- ax = 2, ds:di = указатель на информационную
структуру:
- dw:dw far-указатель на буфер, первое слово - смещение,
второе -
сегмент dw максимальное число 4Kb-блоков для чтения (0x1000 байт)
должно быть ненулевым и строго меньше 0x100 на выходе:
- bx = статус:
- 0 = успешно
- 1 = файл оказался слишком большим, буфер заполнен целиком
и есть ещё данные файла
- 3 = произошла ошибка чтения dx:ax = размер файла
Функцию можно вызывать только в случае, когда последний вызов функции 1
и все последующие вызовы функции 2 вернули bx=1 (иными словами, только
для продолжения загрузки файла, который уже был частично загружен, но
ещё не загружен полностью).
- Для загрузчика необходимо, что бы
данные в
областях памяти 0x0-0x9000 и 0x60000-0xA0000
не модифицировались
ядром.