Welcome to eComStation.RU site!

Select your language: Russian English Deutch Spanish Italian Portuguese Czech Polish French

Frequently asked questions and answers:

eComStation.RU

ru · en · de · es · it · pt · cz · pl · fr
eComStation - это совершенно другая операционная система для PC (IBM OS/2 Warp)
Программы, новости, статьи, поддержка пользователей, оборудование, вопросы и ответы.
 
      Что такое OS/2?НовостиУстановкаОбновлениеПрименениеБудущееСообществоКупить    
(Карта сайта)

 
 
Списки протестированного OS/2 оборудования
Как получить драйверы OS/2 бесплатно

 
Обновление

 
Программы

 
(Санкт-Петербург)

 
Преимущества (1)

 
Разработчику (1)

 
(Пайпы программ)

 
Компании: (1)

 
История (1):

 
(Бонусы)

 
Советы:

 
(Барьеры и решения)

 
Технологии: (1)

 
(Применение в науке, лаборатории, ..)

 

 
Готовые решения:

 
Новая eComStation:

 
Будущее: (1)

 
(Ссылки на другие сайты)

 
(Картинка дня)

 
Артефакты OS/2

 
Гаджеты

 

Как написать свой os2ldr


TITLE: Как написать свой os2ldr

DATE: 2008-03-17 22:30:36

AUTHOR: Pavel Shtemenko

 "С чего начинается Родина?..."

Введение

Ни для кого не секрет, что IBM решила полностью забить на OS/2, даже их отговорки "поддержка кустомеров до xxxx года" просто посылание в никуда, например в линукс. Во первых они уже физически поддержать не могут, во вторых вся поддержка сводится "мы вам рекомендуем мигрировать в линукс". Я совершенно не против линукса, пусть себе живет, но только без меня. Потому, уже всем понятно, что если OS/2 выживет, то только не благодаря IBM. Собственно эта статья шаг к показу того, а насколько сложно взять и переписать все зависящее от IBM? Итак первая часть марлезонского балета - os2ldr как самое первое, что начинает работать, если вы загружаетесь OS/2.

 "... с картинки в твоем букваре?"

1. С чего начать

Конечно с изучения лога от дебагового os2ldr, он состоит:

OS2LdrD

Это понятно, оно дебаговое и тута

ComPort 02f8

Не менее понятно, куда вывод

   
IODel 0113

Здесь менее понятно, но будем расшифровывать полностью IODelay, оно же известно как DosIODelayCnt, в hex ессено

Model fc01

Судя по названию модель компьютера, если мы заглянем в вывод CPUID - однозначно определим что оно

CGetDHPhysMem

Имя вызываемой функции по определению PhysMem.... Думаю на имя копирайтов нету?

I12 639

Это сколько памяти отрепортовала int 12h

I1588 15360

Это скока отрепортовала int 15h fn 88h

I15E8(AX) 15360

Это скока отрепортовала int 15h fn E8h

I15E8(BX) 1472

Количество блоков по 64K в extended memory

I15E8(CY) 0
I15E8 1472
I15C7Bytes 0

Это все древности и их учитывать не стоит.

Поддытожим, нам надо память которая до 1mb и после, до 1mb все таки придется получать по int 12h, более об этом никто не рассказывает, а она может быть на современных 640 или 639 (+ ExtBDA area). А текущую уже модно получать через int 15h fn E820h, то есть ACPI. Но как вы понимаете, проще заполнить поля I15E8 чем переделывать все. Я не поленился и проверил на своем тестовом компьютере, int 15h E800h дает несколько больше памяти чем дает int 15h E820h (acpi) как раз ровно на размер таблицы ACPI. Вывод однозначен, os2ldr таки пользуется int 15h E820h, но вывод выводит как будто простое int 15h 8E00. Что я могу сказать, и то и то начинается с E8h.

SysHi 0
SysEx 0
LocHi 0
LocEx 0
CacHi 0
CacEx 0
PadHi 0
PadEx 0
MCA Watchdog supported?: NO=0;YES=non-zero. Rslt=0000
NVRam  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AoxID 0
AoxQty 0
AoxMem  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AoxTrans  0 0 0 0 0 0 0 0 0 0 0 0

Это все древности связаные с MCA и PS/x компьютерами от IBM, видимо надеются что хоть одна из них еще живая. Потому видимо и проверяют. Понятно , что поддерживать это совершенно нет смысла.

Int12 st 00000000 end 0009fbff
Int1588 st 00100000 end 00ffffff
Int15E8 st 01000000 end 06bfffff

Это итоговый вывод детекта количества RAM

  
Finder:
st 00000000 end 0009fbff loc 00000001 cac 00000000
st 00100000 end 00ffffff loc 00000000 cac 00000000
st 01000000 end 06bfffff loc 00000000 cac 00000000

Вот это тоже самое, только в виде предназначенном для уже записи кернела и miniFSD

CPUUsable = 00000001
CPUWeAre = 00000001

Сколько используется и сколько вообще, могу сказать что на моем DualCode оно все равно показывает 1.

CPUXlateMem = 00000000
PhysMem:
Base 00000000 Sz 0009fc00 Loc 00000001 Cac 00000000
Base 00100000 Sz 06b00000 Loc 00000000 Cac 00000000
SLFrm len e000

Собственно округленный размер лодыря

calling getdhgetdp

Вызываем Get Dos Help "Get drive parameters", почему DosHelp хз, оно вызывается тока здесь, но видать как у IBM все дисковое DASD - так и здесь все вызываемое DosHelp

cbResMsg=0bbe, cbDscMsg=15d3

Размер резидентных сообщений и не резидентных, далее мы смотрим в os2ldr.msg и понимаем, что длииииный вывод типа "IBM тута, мать вашу, вставьте следующую дискету" ну явно не должен быть в резидентных. Немного поискав в DDK, находим, файл basemid.inc, где содержатся номера сообщений которых можно соотнести с os2ldr.msg. Обратим внимание, резидентные сообщения потом доступны и после загрузки оса целиком, потому остается только выбрать те, которые возможны после загрузки - оставшиеся будут нерезидентными, пару проб - и таблица готова.

cgvi
cldr

Попытка определения антиквариатов насчет кейбы и видео

BaseMem1:
Base 00000000 sz 0009fc00
Base 00100000 sz 06b00000

Окончательный приговор детекту памяти, мы имеем столько и не байтом больше

HiLoad=00100000

Физадрес куда будем грузить старшую часть кернеля

ldrseg=1000 ldrlen=e000 &filetbl=c9b0 bootfl=0014

Физадрес лодыря= 1000h, его размер, адрес функций экспортируемых microFSD и флаг загрузки

Low/High/Ex Mem = 639/15360/94208 K

Вот еще разок в удобоваримом виде вывели детект памяти и вперед грузить кернель

open

Открываем файл кернеля. Типа попытка.

opened

Открыто. Так и видится штамп на экране "Проверено IBM" (подпись "президент xxxx")

KLBlock 0001
split
BaseMem2:
Base = 00000000 Sz = 0009fc00
Base = 00100000 Sz = 00f00000
Base = 01000000 Sz = 05c00000

Вывод расписки памяти

  
MFSDF 0001 00100000 00f00000 0000c7bc
mini-FSD 00ff3000

Это мы скопировали minFSD (aka os2boot) в самый хвост физ памяти

ldr @ 010000 => 090000, len=e000

И вот мы наконец дошли до собственно лодыря...

DHSeg=0100 DHLen=8b71

Селектор 100h размер 8b71h, то есть селектор 100 всегда, Более 8000 резидентный лоадер занять не может (причины см. в следующей статье "как писать свой os2krnl"). То есть чисто для информации неизвестно кого. Может для отгона сглаза или еще чего, которое OS/2 совсем не помогло.

MLen=0bbe
endlopaddr => 0008c000
skipping SMP reserved GDT selectors

Пропуск SMP селекторов, это делается для того чтобы сохранить загрузку кернеля именно с 1800 селектора, сегмент в Real Mode будет тоже 1800. Все это сделано для того чтобы в Real и в Prot Mode был одинаковый cs:ip. Очень удобно тогда перескакивать из Prot в Real и обратно.

И наконец начинаем копировать собственно сам файл кернеля

ob     flags    oi-flags   paddr/sel    glp     laddr/fladdr     msz/vsz
laddrnext2=ffd80000
01  rw--sfTLa-  00001063  00b000/0b00  0001  ff800000/ff800000  001000/000fb4
                                                                ^^^^^^^^^^^^^
                                                                физадрес куда пихаем
                                             ^^^^^^^^^^^^^^^^^
                                             так как он будет выглядеть в FLAT
                                        ^^^
                                        Индекс первой страницы объекта в файле кернеля
                          ^^^^^^^^^^^^
                          селектор RM в зависимости от типа, см Флаги
                ^^^^^^^^^ 
                Флаги сегмента в бинари
    ^^^^^^^^^^  
    Флаги сегмента в символьном виде
^^
номер по порядку в файле os2krnl

02  rw--sfTLaA  00005063  00c000/0c00  0002  ffd81000/ffd81000  00b000/00afb7
03  r-x-sfTLa-  00001065  018000/1800  000d  ffd8d000/ffd8d000  00a000/00941c
04  r-x-sf-LaA  00005025  022000/0120  0017  ffd97000/ffd97000  00f000/00e865
05  rw--sf-LaA  00005023  031000/0128  0026  ffda6000/ffda6000  00c000/00c455
06  rw--sN-LaA  0000d0a3  03e000/0130  0032  ffdb3000/ffdb3000  010000/010000
07  rw--sN-LaA  0000d023  04e000/0138  0042  ffdc3000/ffdc3000  003000/002a88
08  rw--sf-LaA  00005023  051000/0140  0045  ffdc6000/ffdc6000  003000/00580a
09  r-x-sf-haA  00005035  100000/0148  0048  ffe75000/ffe75000  003000/0029bc
0a  rw-BPf-h--  00002213  103000/0000  004b  ffe78000/00110000  001000/0001b0
0b  rw-BPf-h--  00002013  104000/0000  004c  ffe79000/00120000  003000/0027cc
0c  rw-Bsf-h-A  00006033  107000/0000  004f  ffe7c000/ffe7c000  02c000/030064
0d  r-x-sf-ha-  00001035  138000/0150  007b  ffead000/ffead000  010000/00fdf8
0e  r-x-sf-ha-  00001035  148000/0158  008b  ffebd000/ffebd000  010000/00ff60
0f  r-x-sf-ha-  00001035  158000/0160  009b  ffecd000/ffecd000  00f000/00ee04
10  r-x-sf-ha-  00001035  167000/0168  00aa  ffedc000/ffedc000  00f000/00e31c
11  r-xBsf-h-A  00006035  176000/0000  00b9  ffeeb000/ffeeb000  0d5000/0d4e69

Итак из этого можно увидеть, что практически все сегменты os2ldr грузятся до 1mb и только 32 бит сегменты после, начиная с первого адреса после 1mb. Сразу замечу, не на всех PC он может быть именно 1mb, там может быть и дыра в адресации. Обращу внимание, размеры, аттрибуты и номера сегментов полностью совпадают с хедером LX файла кернеля.

laddrnext=ffe75000

выводим последний занятый адрес, но уже в FLAT

R0DS=0170 R0CS=0178

Грим что такие селекторы назначены на FLAT

endlopaddr 08c000 => 057000  endhipaddr 0024b000
pagemap 05f000, fixuppt 05fc74, fixuprecs 060400
k end paddr lo/hi 00057000/0024b000, zpaddr 00057000, zsize 8000
OS2Init=1800:7f4c

Это уже собственно адрес куда будем делать JMP после отработки лодыря, оно извлекается из LX exe и кернеле, судя по os2krnl.sym файлу называется SYIInitOS2.

А дальше, мы начинаем переписывать с кернеля все что не переписали, а заодно и делать фиксапы на 32 бит согласно найденым R0DS и R0CS. Делаем это все долго, нудно, но со вкусом к происходящему.

wait 0001 lo
wait 0002 lo
wait 0003 lo
wait 0004 lo
wait 0005 lo
wait 0006 lo
wait 0007 lo
wait 0008 lo
load 0009 hi
MoveHigh src=0000b000, dst=00100000, size=3000, remain=00000000

Копируем вверх кусок, так как A20 включается ниже, значит есть только один путь - через int 15h, ну и далее занимаемся тем же. Копируем и грузим

load 000a hi
MoveHigh src=0000b000, dst=00103000, size=1000, remain=00000000
load 000b hi
MoveHigh src=0000b000, dst=00104000, size=3000, remain=00000000
load 000c hi
MoveHigh src=0000b000, dst=00107000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0010f000, size=8000, remain=00000000
IODelayCnt fixup laddr=ffe92c72

На этом куске обнаружили что нужен фиксап, поставили

MoveHigh src=0000b000, dst=00117000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0011f000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00127000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0012f000, size=4000, remain=00000000
load 000d hi
MoveHigh src=0000b000, dst=00138000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00140000, size=8000, remain=00000000
load 000e hi
IODelayCnt fixup laddr=ffec0a81
IODelayCnt fixup laddr=ffec0a8c
MoveHigh src=0000b000, dst=00148000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00150000, size=8000, remain=00000000
load 000f hi
MoveHigh src=0000b000, dst=00158000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00160000, size=7000, remain=00000000
load 0010 hi
IODelayCnt fixup laddr=ffee3572
IODelayCnt fixup laddr=ffee357c
IODelayCnt fixup laddr=ffee358a
IODelayCnt fixup laddr=ffee3591
IODelayCnt fixup laddr=ffee35a7
IODelayCnt fixup laddr=ffee35b6
IODelayCnt fixup laddr=ffee3551
IODelayCnt fixup laddr=ffee3481
IODelayCnt fixup laddr=ffee3545
IODelayCnt fixup laddr=ffee3538
IODelayCnt fixup laddr=ffee34ea
IODelayCnt fixup laddr=ffee34dd
IODelayCnt fixup laddr=ffee34ad
IODelayCnt fixup laddr=ffee349a
IODelayCnt fixup laddr=ffee3565
MoveHigh src=0000b000, dst=00167000, size=8000, remain=00000000
IODelayCnt fixup laddr=ffee66c0
MoveHigh src=0000b000, dst=0016f000, size=7000, remain=00000000
load 0011 hi
MoveHigh src=0000b000, dst=00176000, size=8000, remain=00000000
IODelayCnt fixup laddr=ffef4350
IODelayCnt fixup laddr=ffef464e
IODelayCnt fixup laddr=ffef465c
MoveHigh src=0000b000, dst=0017e000, size=8000, remain=00000000
IODelayCnt fixup laddr=ffefc774
IODelayCnt fixup laddr=ffefc76a
IODelayCnt fixup laddr=fff018cc
IODelayCnt fixup laddr=fff018c0
IODelayCnt fixup laddr=fff0187a
IODelayCnt fixup laddr=fff01870
MoveHigh src=0000b000, dst=00186000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0018e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00196000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0019e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001a6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001ae000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001b6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001be000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001c6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001ce000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001d6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001de000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001e6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001ee000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001f6000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=001fe000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00206000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0020e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00216000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0021e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00226000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0022e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00236000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=0023e000, size=8000, remain=00000000
MoveHigh src=0000b000, dst=00246000, size=5000, remain=00000000

Уф, типа все скопировали и заодно зафиксапили, разомнемся на всяком почти лишнем

  
BIOS Seg 5700

Добавили BIOS как селектор, совершенно потом не употребляется

  
Dmp seg 5800

Так же дамп

DBCS seg 6700

DBCS лично у меня посмотреть просто не на чем, ну не понимаю я иероглифов

FNT seg 6a00

Фонтовый сегмент для DBCS

rom
free lo

Освободили часть нижней памяти для ядра и пошли располагать сегменты по мере их поступления

load 0001 lo
     ^^^^  
     первый сегмент

load 0002 lo
     ^^^^ 
     второй сегмент

IODelayCnt fixup laddr=ffd84317

в нем произвели фиксап 32 бит по этому адресу и так далее все сегменты в SMP количеством 17 штук, в чем легко убедится посмотрев в хедер LX файла кернеля

load 0003 lo
IODelayCnt fixup laddr=ffd8ee80
IODelayCnt fixup laddr=ffd90dea
IODelayCnt fixup laddr=ffd90de2
IODelayCnt fixup laddr=ffd90df6
IODelayCnt fixup laddr=ffd907b3
IODelayCnt fixup laddr=ffd90c6e
IODelayCnt fixup laddr=ffd907bc
IODelayCnt fixup laddr=ffd90c74
IODelayCnt fixup laddr=ffd95603
IODelayCnt fixup laddr=ffd955f3
IODelayCnt fixup laddr=ffd955e6
load 0004 lo
load 0005 lo
LObj zfil 0003d000 for 00000455
load 0006 lo
load 0007 lo
load 0008 lo
LObj zfil 00054000 for 0000280a
done 0009 hi
done 000a hi
done 000b hi
done 000c hi
done 000d hi
done 000e hi
done 000f hi
done 0010 hi
done 0011 hi
close

Закрыли кернельный файл

  
dmp len 00003a9d xBDA len 0400

Это мы подцепили ExtBDA area (см выше, она отрепорчена как имеющяяся), заодно и подцепили os2dump

sds init 01000949
dmp init 58000006
cfg 0010
no DBCS/FNT
term
termed
-16
nFAT

В данном случае microFSD, то есть не FAT

DPEnd
+16
MemT
MemX
pa=00000000 sz=00001000 va=00000000 sel=0000 fl=2000 of=00000003 ow=0000

Выводится список арен - всех блоков памяти, готовых перед стартом ядра. Про арены см. DebugHandBook Тут и объекты самого ядра и блоки, где лежит os2dump, microFSD, os2dbcs и ейный фонт, и вся свободная память, заодно и блоки, которые были отведены, но не пригодились и помечены как invalid.

pa=00001000 sz=00009740 va=ffe6b000 sel=0100 fl=2014 of=00001004 ow=ff6d
                                                                 ^^^^^^^
                                                                 Владелец
                                                     ^^^^^^^^^^^ 
                                                     Флаги типа памяти
                                             ^^^^^^^
                                             Флаги типа арены
                                    ^^^^^^^^
                                    Селектор
                        ^^^^^^^^^^^
                        FLAT адрес
            ^^^^^^^^^^^ 
            Размер
^^^^^^^^^^^
Физический адрес

pa=0000b000 sz=00000fb4 va=ff800000 sel=0b00 fl=2144 of=00001063 ow=ffaa
pa=0000c000 sz=0000afb7 va=ffd81000 sel=0c00 fl=2244 of=00005063 ow=ffaa
pa=00018000 sz=0000941c va=ffd8d000 sel=1800 fl=2344 of=00001065 ow=ffaa
pa=00022000 sz=0000e865 va=ffd97000 sel=0120 fl=2444 of=00005025 ow=ffaa
pa=00031000 sz=0000c455 va=ffda6000 sel=0128 fl=2544 of=00005023 ow=ffaa
pa=0003e000 sz=00010000 va=ffdb3000 sel=0130 fl=2644 of=0000d0a3 ow=ffaa
pa=0004e000 sz=00002a88 va=ffdc3000 sel=0138 fl=2744 of=0000d023 ow=ffaa
pa=00051000 sz=0000580a va=ffdc6000 sel=0140 fl=2844 of=00005023 ow=ffaa
pa=00057000 sz=00000900 va=ffe6a000 sel=5700 fl=2014 of=00000000 ow=ff6d
pa=00058000 sz=00003a9d va=00000000 sel=5800 fl=2001 of=00000000 ow=0000
pa=0005c000 sz=0000e000 va=00000000 sel=5c00 fl=2002 of=00000000 ow=0000
pa=0006a000 sz=00009000 va=ffe61000 sel=6a00 fl=2002 of=00000000 ow=ff21
pa=00073000 sz=0001d000 va=00000000 sel=0000 fl=2002 of=00000000 ow=0000
pa=00090000 sz=0000effc va=ffe52000 sel=0000 fl=2054 of=00001003 ow=ffab
pa=0009f000 sz=00000c00 va=00000000 sel=0000 fl=2002 of=00000000 ow=0000
pa=0009fc00 sz=00000400 va=ffe51c00 sel=0000 fl=2004 of=00000000 ow=ff37
pa=000a0000 sz=00060000 va=00000000 sel=0000 fl=0001 of=00000000 ow=0000
pa=00100000 sz=000029bc va=ffe75000 sel=0148 fl=0944 of=00005035 ow=ffaa
pa=00103000 sz=000001b0 va=ffe78000 sel=0000 fl=0a44 of=00002213 ow=ffaa
pa=00104000 sz=000027cc va=ffe79000 sel=0000 fl=0b44 of=00002013 ow=ffaa
pa=00107000 sz=00030064 va=ffe7c000 sel=0000 fl=0c44 of=00006033 ow=ffaa
pa=00138000 sz=0000fdf8 va=ffead000 sel=0150 fl=0d44 of=00001035 ow=ffaa
pa=00148000 sz=0000ff60 va=ffebd000 sel=0158 fl=0e44 of=00001035 ow=ffaa
pa=00158000 sz=0000ee04 va=ffecd000 sel=0160 fl=0f44 of=00001035 ow=ffaa
pa=00167000 sz=0000e31c va=ffedc000 sel=0168 fl=1044 of=00001035 ow=ffaa
pa=00176000 sz=000d4e69 va=ffeeb000 sel=0000 fl=1144 of=00006035 ow=ffaa
pa=0024b000 sz=00da8000 va=00000000 sel=0000 fl=0002 of=00000000 ow=0000
pa=00ff3000 sz=0000d000 va=ffe44000 sel=0000 fl=0024 of=00001003 ow=ff9d
pa=01000000 sz=00000000 va=00000000 sel=0000 fl=0001 of=00000000 ow=0000
pa=01000000 sz=05c00000 va=00000000 sel=0000 fl=0002 of=00000000 ow=0000
pa=06c00000 sz=00000000 va=00000000 sel=0000 fl=4000 of=00000000 ow=0000
SFence OK

Это типа теста переполнения стека, во первых нахрена, во вторых ничего не дает, в третьих даже если переполнится, то ядро сразу ставит свой. Вообщим какой-то фонарь оставшийся с незыблемых лет, с тех времен, когда там существовал свой отладчик. Лично я такого лодыря не видел.

a20

Включили наконец A20

pDHt
rPIC

Сделали init 8259

j syi

Ушли в кернель и далее можно наблюдать такую надпись, если вы конечно имеете кабель на компорт и поставили дебаговое ядро.

System Debugger 8/8/97 [80786]
MaxProcesses = 1025
Symbols linked (os2krnl)

                        OS/2 Warp Server for e-business
          (C) Copyright IBM Corp. 1987, 1999.  All rights reserved.
  US Government Users Restricted Rights - Use, duplication or disclosure
            restricted by GSA ADP Schedule Contract with IBM Corp.

Internal revision 14.039F_SMP

Здесь собственно часть прямой интерпретации os2ldr и заканчивается, начинается не прямая. Итого, надо поставить девхелперы с физического адреса 1000, загрузить все сообщения из os2ldr.msg, поставить обработчики прерывания, поставить OEMHLP$ драйвер и предоставить некоторые сервисы. Теперь спросите себя, насколько это все сложно?

 "А может она начинается... "

2. Что делать дальше

Самое первое смотрим заготовку лодыря с хоббеса и читаем EDM/2, понимает что интерфейс к os2ldr от загрузчика описан в ifs.inf. Далее замечаем, что часть DevHlp находятся в лоадере, потому пойдем самым простым путем - AltF7 в fc и по всем хедерам в DDK с поиском строки DevHlp. Почти сразу натыкаемся на очень интересную структуру в doshlp.inc, называется она DosHlpFunction, далее следует не менее интересная структура KernelAccess. Присматриваемся к макросам в том же файле, ага, DefDosHlp и DefDiscDosHlp. Вспоминаем, что часть лоадера остается резидентной, а часть после отработки сбрасывается, как ступени ракетоносителя. Так же вспоминаем, что есть еще и сообщения, но тут уже попроще - они все видны невооруженным глазом в os2ldr.msg и перечислены в basemid.inc. Исходя из стандартной для OS/2 работы с MSG предполагаем, что они должен хранится в виде:

dw НомерСообщения
dw УказательНаТексСообщения

Итак, надо сделать таблицу для отдачи в кернель. Таблицу сообщений и таблицу хелперов, которые сидят в os2ldr. Далее читаем по английски названия хелперов, смотрим в pddref.inf насчет параметров вызова и просто их пишем. В основном все описаны в pddref.inf, но натыкаемся на несколько экзотических, типа DosHelpInitInterrupts, Весьма чешем себе затылок и тут в дебаговом окне замечаем, оппа! а все указатели из IDT смотрят-то на os2ldr, его резидентную 32 битную часть!!! Ага, сказали суровые сибирские мужики. Дело как раз тут, сразу понимаем, все обработчики прерываний должен ставить os2ldr именно по вызову этой функции. Далее помня acpi и ее нелегкую борьбу за share IRQ знаем, мы должны еще прописать в airqi таблицу кернеля все указатели на эти обработчики прерывания и главное! поставить флаг SHARE.

Делаем, пытаемся загрузится и понимает что чет тут не так... пропал куда-то драйвер OEMHLP$, AltF7 по диску, батюшки, дык он в os2ldr...

Оглядываемся вокруг, ага еще осталось выяснить а нет ли чего в OEMHLP$ недокументированного? У удивлению ничего, только умолчания, что например не объявлена, что номер ioctl 80h.... Вспомнив, что начала писать его M$ у которой к старшим битам было просто любовное отношение, решили что фиг с им, так и повторим.

Теперь быстренько делаем согласно DebugHandBook параметры для ядра, jmp на точку входа и о чудо, загрузились.

 "... с той хаты вдали от ворот?"

3. Итоги трудового дня

Hаписать можно и в обозримые сроки, ничего сверхсекретного кроме глюков тут не видно, любому грамотному инженеру задача на полдня по написанию задания для программеров. IBM практически всю инфу дала. Да и думается ждала, что подхватят и понесут и создадут массу, ан нет, все понадеялись на IBM, наверное потому она линуксом и занялась - кинула идею, лемминги ея начинают сразу тусовать и извращать как только можно. Судя по JFS пределов извращению просто не бывает. Вот тут мы припомним, что IBM хотя и серый, но все-таки голубой гигант.... По извращениям я не думаю, что кто-то в ближайшем десятилетии до него дотянется. Ему уже все-таки более 100 лет и в извращениях наверняка понимают толк.

Используемая (и рекомендуемая) литература:

  • IBM DebugHandBook
  • IBM DDK pddref.inf
  • IBM DDK header and inc
  • ACPI standard
  • Ralf Brown's interrupt list

Разрешение на публикацию получено 2008/03/17, 22:00 MSK

Попробуй программу:

Widescreen activator - включает широкие режимы для Intel.

Комментарии:

Oxyd
2008-03-18 05:38:18

Паша, как всегда, монстр!!! :)

дикая собака Екомса
2008-03-18 13:46:48

Ить, раз лоадер набит функциями для ядра, значит лоадер - кусок ядра.

Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).


Ваше имя:

Ваш E-Mail:

CODE:
......

  

Ваш комментарий:


eComStation 2.0: все фиксы от корпорации IBM + настройки всех системных служб и драйверов оптимизированы, Что нового в eCS 2.0?

Статьи

Операционная система
Программное обеспечение
Оборудование
Для разработчика
Разное
Колонка редактора


Готовая eComStation на SSD диске

 





Последний активный опрос: Какая высота барьера RPM?

IBM OS/2 Warp

 
Обучение новичков

Списки протестированного OS/2 оборудования

 
Статьи


   
  Почему eComStation?
Возможности
Особенности
Применение
Ролики и скриншоты
   eComStation для
для бизнесменов
для студентов и инженеров
для продавцов компьютеров
сообщество пользователей
   Разработчик
Распространить программу
Описание API, библиотеки
Начать новый проект
Конкурсы
   Программы
Он-лайн каталог
Выбрать через eCo Market
   Служба поддержки
Отправить вопрос
Купить eComStation
Вопросы и ответы
Обучение новичков
 
 
© 2001 - 2014 eCo Software, All rights reserved
eComStation is a registered trademark of Serenity Systems International
OS/2 Warp is a registered trademark of IBM Corporation
 

 

 
Картинка дня: