RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : проблема со стеком


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : valerius (Валерий Седлецкий)
To : zuko
Subj : проблема со стеком

<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>

Mon 17 Mar 2003 09:25 Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)




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.