24,68 → 24,68 |
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
;***************************************************************************** |
|
Ñïåöèôèêàöèÿ íà ïåðâè÷íûé çàãðóç÷èê KordOS. |
Çàãðóç÷èê äîëæåí ïðåäîñòàâëÿòü ñëåäóþùèå ñåðâèñû: |
1. Ïðè çàãðóçêå êîìïüþòåðà, ïîëó÷èâ óïðàâëåíèå îò BIOS'à, çàãðóæàòü |
ôàéë loader èç ïàïêè kord ïî àäðåñó 1000:0000. |
Ðàçìåð ôàéëà loader íå ïðåâîñõîäèò 30000h = 192 Kb. |
2. Ïðè ýòîì óñòàíàâëèâàòü ñëåäóþùèå ðåãèñòðû: |
ax èäåíòèôèöèðóåò óñòðîéñòâî: |
al = òèï: |
'f' - ôëîïèê |
Спецификация на первичный загрузчик KordOS. |
Загрузчик должен предоставлять следующие сервисы: |
1. При загрузке компьютера, получив управление от BIOS'а, загружать |
файл loader из папки kord по адресу 1000:0000. |
Размер файла loader не превосходит 30000h = 192 Kb. |
2. При этом устанавливать следующие регистры: |
ax идентифицирует устройство: |
al = тип: |
'f' - флопик |
'h' - HDD |
'c' - CD/DVD |
'u' - USB ôëåøêà |
'?' - íåèçâåñòíîå óñòðîéñòâî |
ah = íîìåð óñòðîéñòâà (ñðåäè âñåõ óñòðîéñòâ ôèêñèðîâàííîãî òèïà) |
bx = òèï ôàéëîâîé ñèñòåìû: |
'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 = ðàçìåð ôàéëà èëè FFFF: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 (èíûìè ñëîâàìè, |
òîëüêî äëÿ ïðîäîëæåíèÿ çàãðóçêè ôàéëà, êîòîðûé óæå áûë ÷àñòè÷íî |
çàãðóæåí, íî åù¸ íå çàãðóæåí ïîëíîñòüþ). |
Çàãðóç÷èê ìîæåò áûòü óâåðåí, ÷òî äàííûå â îáëàñòÿõ ïàìÿòè 0-9000 è |
60000-A0000 íå áóäóò ìîäèôèöèðîâàíû ÿäðîì. |
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 = размер файла или FFFF: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 (иными словами, |
только для продолжения загрузки файла, который уже был частично |
загружен, но ещё не загружен полностью). |
Загрузчик может быть уверен, что данные в областях памяти 0-9000 и |
60000-A0000 не будут модифицированы ядром. |