RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> <pre> > Сорри, что так долго молчал, болел я :) > Но кое-что раскопал (немного, правда): > > Таблица прерываний: > Аппаратные прерывания (int50-int57 (irq0-7) и int70-int77 > (irq8-15)) > > # di > [--skipped--] > 0050 IntG32 Sel:Off=0168:ffeba018 DPL=0 P > 0051 IntG32 Sel:Off=0168:ffeba058 DPL=0 P > 0052 IntG32 Sel:Off=0168:ffeba098 DPL=0 P > 0053 IntG32 Sel:Off=0168:ffeba0d8 DPL=0 P > 0054 IntG32 Sel:Off=0168:ffeba118 DPL=0 P > 0055 IntG32 Sel:Off=0168:ffeba158 DPL=0 P > 0056 IntG32 Sel:Off=0168:ffeba198 DPL=0 P > 0057 IntG32 Sel:Off=0168:ffeba1d8 DPL=0 P > > 0070 IntG32 Sel:Off=0168:ffeba218 DPL=0 P > 0071 IntG32 Sel:Off=0168:ffeba268 DPL=0 P > 0072 IntG32 Sel:Off=0168:ffeba2a8 DPL=0 P > 0073 IntG32 Sel:Off=0168:ffeba2e8 DPL=0 P > 0074 IntG32 Sel:Off=0168:ffeba328 DPL=0 P > 0075 IntG32 Sel:Off=0168:ffeba368 DPL=0 P > [ > 0076 IntG32 Sel:Off=0168:ffeba3a8 DPL=0 P > 0077 IntG32 Sel:Off=0168:ffeba3e8 DPL=0 P > ] --- прерывания от дисков > > u %D1eba018 > > 0168:ffeba018 83ec08 sub esp,+08 > 0168:ffeba01b 60 pushad > 0168:ffeba01c 1e push ds > 0168:ffeba01d 06 push es > 0168:ffeba01e 0fa0 push fs > 0168:ffeba020 0fa8 push gs > 0168:ffeba022 b860010000 mov eax,00000160 > 0168:ffeba027 8ed8 mov ds,ax > 0168:ffeba029 8ec0 mov es,ax > 0168:ffeba02b 668cd0 mov ax,ss > 0168:ffeba02e 663d6001 cmp ax,0160 > 0168:ffeba032 7418 jz ffeba04c > 0168:ffeba034 663d2015 cmp ax,1520 > 0168:ffeba038 7412 jz ffeba04c > 0168:ffeba03a 663d5815 cmp ax,1558 > 0168:ffeba03e 740c jz ffeba04c > 0168:ffeba040 663d5015 cmp ax,1550 > 0168:ffeba044 7406 jz ffeba04c > 0168:ffeba046 81e4ffff0000 and esp,0000ffff > 0168:ffeba04c bb08b4ecff mov ebx,ffecb408 > 0168:ffeba051 e9d5e50500 jmp fff1862b (intIRQRouter) > > Причем перед jmp intIRQRouter в ebx сохраняется число, > зависящее от того, какой это обработчик прерывания -- > для int 50 -- ffecb408, для int 51 -- ffecb418 и т. д., > соседние отличаются на 10h. Причем ebx остается постоянным > отсюда и до intKernelExit. У нас trap screen такой : > > TRAP SCREEN INFORMATION > OS/2 Kernel Revision 14.085_W4 Exception in module: OS2KRNL > TRAP 000e ERRCD=0000 ERACC=**** ERLIM=******** > EAX=00000004 EBX=ffecb4e8 ECX=00002cb0 EDX=ffff0080 > ESI=fefc54a0 EDI=fdbd2f78 EBP=00000004 FLG=00012046 > CS:EIP=0168:fff18c30 CSACC=c09b CSLIM=ffffffff > SS:ESP=0030:00005118 SSACC=1097 SSLIM=000043ff > DS=0160 DSACC=c093 DSLIM=ffffffff CR0=8001001b > ES=0160 ESACC=c093 ESLIM=ffffffff CR2=e9029240 > FS=0650 FSACC=0093 FSLIM=00005fff > GS=0000 GSACC=**** GSLIM=******** > %D1f18c28 OS2KRNL intKernelExit + 8 > > > Int=50 - ebx=ffecb408, Int=77 - ebx=ffecb4f8. > Здесь ebx = ffecb4e8. Значит int = 76. > То есть, это было прерывание от диска. > > > Цепочка физических драйверов: > > PHYSICAL DEVICE DRIVER CHAIN > Dev Port Strt Inter Dev Real > Address Name Attr CS DS Offs Offst CS DS > ------- ---- ---- ---- ---- ---- ----- ---- ---- > [---------skipped----------] > 0790:0000 .Disk DD 2880 0798 0790 251a 0000 0000 0000 > 0790:001e OS2DASD$ c980 0798 0790 2444 475c 0000 0000 > [---------skipped----------] > > То есть, по идее, точка входа в обработчик прерывания драйвера > должна быть 798:475c. (Если Strt Offs -- Strategy routine offset, > а Inter Offst -- Interrupt routine offset. Но почему Dev CS встреча- > ется 2 раза?) > > Я ставил в этом месте точку прерывания в Kernel debugger'е, > но почему-то при активной работе с диском останова не происходило. > Вызов должен был бы происходить в точке f_call16bitDD -- > инструкция call dword ptr es:[edi + 04] (так кажется), > но может потому, что os2dasd 32 - битный (как он вообще попал > в список 16-битных драйверов?), он вызывается где-то в другом месте. > Может, этому списку драйверов верить нельзя? :) > В общем, в этом сегменте (798) куча процедур и непонятно, > где именно обработчик прерывания. > > Итак, кто виноват, вроде бы понятно (предположительно), > а что делать -- неясно. :) > > Если это та процедура, то она что-то сильно маленькая и мало > работает со стеком: > > # u 798:475c l40 > 0798:0000475c c8040000 enter 0004,00 > 0798:00004760 56 push si > 0798:00004761 1e push ds > 0798:00004762 b89007 mov ax,0790 [сегмент данных] > 0798:00004765 8ed8 mov ds,ax > 0798:00004767 c45e06 les bx,dword ptr [bp+06] [Почему он > bx не сохраняет? > не потому ли, что > эта процеду- > ра вызывается > не из f_call16bitDD? > иначе бы ebx > сохранялось.] > 0798:0000476a 268b07 mov ax,word ptr es:[bx] > 0798:0000476d 48 dec ax > 0798:0000476e 7403 jz 4773 > 0798:00004770 e98100 jmp 47f4 > 0798:00004773 26c47704 les si,dword ptr es:[bx+04] > 0798:00004777 8976fc mov word ptr [bp-04],si > 0798:0000477a 8c46fe mov word ptr [bp-02],es > 0798:0000477d 26c7041a25 mov word ptr es:[si],251a [Strt offs] > 0798:00004782 26c744029807 mov word ptr es:[si+02],0798 [CS Seg] > 0798:00004788 c45efc les bx,dword ptr [bp-04] > 0798:0000478b 26c74704a62b mov word ptr es:[bx+04],2ba6 [???] > 0798:00004791 26c747069807 mov word ptr es:[bx+06],0798 > 0798:00004797 a1e00c mov ax,word ptr [0ce0] > 0798:0000479a 8b16e20c mov dx,word ptr [0ce2] > 0798:0000479e 26894708 mov word ptr es:[bx+08],ax [Чего-то > копирует > 0798:000047a2 2689570a mov word ptr es:[bx+0a],dx из ds в > es ] > 0798:000047a6 a1e40c mov ax,word ptr [0ce4] > 0798:000047a9 8b16e60c mov dx,word ptr [0ce6] > 0798:000047ad 2689470c mov word ptr es:[bx+0c],ax > 0798:000047b1 2689570e mov word ptr es:[bx+0e],dx > 0798:000047b5 a1e80c mov ax,word ptr [0ce8] > 0798:000047b8 8b16ea0c mov dx,word ptr [0cea] > 0798:000047bc 26894710 mov word ptr es:[bx+10],ax > 0798:000047c0 26895712 mov word ptr es:[bx+12],dx > 0798:000047c4 26c74714b206 mov word ptr es:[bx+14],06b2 > 0798:000047ca 268c5f16 mov word ptr es:[bx+16],ds > 0798:000047ce a16006 mov ax,word ptr [0660] > 0798:000047d1 2689471c mov word ptr es:[bx+1c],ax > 0798:000047d5 a16406 mov ax,word ptr [0664] > 0798:000047d8 2689471e mov word ptr es:[bx+1e],ax > 0798:000047dc 26c747187208 mov word ptr es:[bx+18],0872 [???] > 0798:000047e2 268c5f1a mov word ptr es:[bx+1a],ds > 0798:000047e6 c45e06 les bx,dword ptr [bp+06] [Какая здесь > структура > 0798:000047e9 26c747020000 mov word ptr es:[bx+02],0000 кадра > стека? ] > 0798:000047ef 1f pop ds > 0798:000047f0 5e pop si > 0798:000047f1 c9 leave > 0798:000047f2 cb retf > 0798:000047f3 90 nop > > 0798:000047f4 26c747020100 mov word ptr es:[bx+02],0001 > 0798:000047fa 1f pop ds > 0798:000047fb 5e pop si > 0798:000047fc c9 leave > 0798:000047fd cb retf > > И еще интересно -- чем отличаются os2dasd$ и .Disk DD? > Плохо то, что я протрассировать не могу :( > </pre>
__, _,_ _, __, ___,
|_) | | | |_ ` /
| \ | | | , | /
~ ~ `~' ~~~ ~~~ ~~~
Programmed by
Dmitri Maximovich
,
Dmitry I. Platonoff
,
Eugen Kuleshov
.
25.09.99 (c) 1999,
RU/2
. All rights reserved.
Rewritten by
Dmitry Ban
. All rights ignored.