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


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

>кстати селектоp e8 вообще не являлся стандаpтным
>pанее в ос2, напpимеp в ваpп3 его такого нет, а
>вот в acp2 он уже соответствует твоему.

Это для ядра 14.065,

>вообще, стандаpтное значение селектоpа для SS в
>r0 для 16-бит дpайвеpов и ядpа = 30.

а вот я поставил более новое (14.085),
так там снова ss=0030


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

Здесь проблемы со стеком уже нет,
трап не двойной, а система пытается
залезть в несуществующую страницу памяти (trap 0e).

# u %D1f18c28 - 10

-------cut-------------------------------
OS2KRNL intKernelExit:
%D1f18c28 8f05b80bddff pop dword ptr [ffdd0bb8]
%D1f18c2e 0fa9 pop gs
%D1f18c30 0fa1 pop fs
^^^^^^^^^ ^^^^^^^^^^
%D1f18c32 07 pop es
%D1f18c33 1f pop ds
%D1f18c34 61 popad
%D1f18c35 83c408 add esp,+08
%D1f18c38 cf iretd
OS2KRNL PrivateStackExit:
-------cut------------------------------
-- Выход из кернела?

Стек:

# dd 0030:00005000 l200

-------cut------------------------------
0030:00005000 25a0517c 00000000 50760001 0608294c
0030:00005010 0030504e 47100029 51b05001 00600000
0030:00005020 0001000a 47100029 1f585536 fef12cd4
0030:00005030 00000069 40010000 9ff24001 0100ffeb
0030:00005040 22460000 1e3b0000 8c86fff2 1e1cf9f4
0030:00005050 5092fff2 23480000 8c86fff2 d44cf9f4
0030:00005060 2246ffec 27d70000 0002ffdd 8c860000
0030:00005070 8e0ef9f4 000afff1 00000160 ffdd2795
0030:00005080 ffdd27d7 00000002 ffdd27d5 f9f48cd4
0030:00005090 00040000 b4090000 27e90160 12000a00
0030:000050a0 ffff2246 00040000 28090000 0a008020
0030:000050b0 2d090004 388c1200 fff1eb1c fff10168
0030:000050c0 ea60237c 0000010a 00000000 fff1eb1c
0030:000050d0 ea600000 fdbd2f78 fefc54a0 00000004
0030:000050e0 000050f4 ffecb4e8 ffff0080 00002cb0
0030:000050f0 00000004 ffec0000 00000650 00000160
0030:00005100 00000160 0000000e 00000000 fff18c30
0030:00005110 00000168 00012046 00202246 01600a00
~~~~~~~~
вершина стека
0030:00005120 00da0030 2fac512a 513c1698 00fe2eb5
0030:00005130 00c017f2 50f80140 91dd17f2 515000da
0030:00005140 16982d95 169817f2 17f24164 16ca0000
0030:00005150 20725164 04011698 16981929 169818bd
0030:00005160 f9f47597 16bf516c 00002246 01600a00
0030:00005170 00040030 c400f5c0 51b0060b 51920000
0030:00005180 00000000 008e0000 00000000 00070000
0030:00005190 4ce90000 fff246b8 00002246 fff246c0
0030:000051a0 00002246 fabfefec f5c00004 f94c49a8
0030:000051b0 f9f48df0 ffead9ab 00000007 0000008e
0030:000051c0 00000000 00000000 f94c40ca fd461597
0030:000051d0 f94c40ca 00000000 f94c40ca f8d55cbc
0030:000051e0 000014c4 fd405000 f5c01fec fd405c48
0030:000051f0 f9f48e28 fee31a50 f9f48e28 fee31a73
0030:00005200 00005214 00000001 000001f4 00000000
0030:00005210 00044020 00000000 fd442cb8 fabf7a08
0030:00005220 05c20624 f8d55cbc f9f48e50 00002246
0030:00005230 fee270b1 07b00c48 faa7a3fc 000001f4
0030:00005240 0c000000 00002cbc f5c01fec faa7a3fc
0030:00005250 000052d4 00005268 f8e24080 000001f4
0030:00005260 00800000 f8e2409c f8f0a080 f8f0b0ab
0030:00005270 faa36cbc f8e24080 000052d4 f8f11d06
-------cut------------------------------

Трап происходит при попытке выполнить инструкцию
pop fs.
В стеке в этот момент находится несуществующий
селектор 2246:

# dl 2246
2246 Invalid Bas=00000000 Lim=00000000 DPL=0 NP

Причем в стеке (на вершине) находится двойное слово
00202246. Вообще-то, имхо за селектором наверное должны
идти нули (выравнивание по границе дв. слова), а там
почему-то 0020.

Еще что можно заметить, так это то, что прямо перед
инструкцией "pop fs" было прерывание (прямо над вершиной
стека 3 двойных слова: fff18c30 00000168 00012046 --
eip, cs и регистр флагов).

Пока не знаю, как узнать, что это было за прерывание
и как попасть в его обработчик. Возможно, он и поместил
в стек мусор (00202246).

Читаю книжки, т.к. они рулез ;)
Кстати, совсем забыл, что у меня где-то завалялась
дока про процессор i486 :) .

PS
Кстати, убедился, что стека и в самом деле не
хватало (тогда). Стек занимает одну страницу памяти:

# dg 30

0030 Data Bas=ffd27c00 Lim=000043ff DPL=0 P RW ED A UV
^^^^^^^^ ^^^^ ^^^^

# dp %D1d27c00 linaddr frame pteframe state res Dc Au CD WT Us rW Pn state

%D1d27c00* 00201 frame=00201 2 0 c A U W P resident
%D1d2cc00 0059f frame=0059f 1 0 D A s W P uvirt
%D1d30c00 096ff frame=096ff 1 0 c u s W P uvirt

-- Одна страница памяти: 0059f

Легко убедиться, что эта страница занимает адреса
с esp= 4400 - 5400
Так что в данном случае стека более чем хватает.

А в предыдущем случае (ядро 14.065) стек кончился:
Стек: e000 - f000, esp=e002 - на 1 слово за верхний
предел. Так что посыпаю голову пеплом ;)

Пока непонятно, что значит ebp=00000004, ведь ebp
должен указывать на базу кадра стека, а здесь он
указывает вообще за пределы стека. Может, это тоже
особенность expand-down стеков, или все-таки ошибка?

PPS
pls, простите чайника за незнание азов :)

PPPS

> тебе надо pаскpучивать по стеку где пpоизошол
> пеpвоначальный тpап е и смотpеть отчего он
> случился..

Это я уже понял, что надо раскручивать стек, но как,
многое непонятно (не хватает знания азов :)), например,
где предыдущий кадр стека, ведь ebp=неизвестно чему.
Будем продолжать читать доки, но на это потребуется
время :).

ЗЗЗЗЫ
А что ты можешь сказать насчет того, какая здесь
связь: трап в кернеле, нехватка стека и новый большой
жесткий диск (Barracuda 80 Gb)? Ведь все траблы начались
именно с установкой нового винта, со старым (ibm 60 Gb)
такого не было. У KuiSa-Ka вообще 2 терабайта массив,
а глюков почему-то нет. Тут наверно имеет значение
комбинация винт-контроллер-драйвера-ядро. Я ставил
и более новые ядра (стабильные -- 14.065, 14.085, и
с тесткейса -- 14.089E), обновлял os2dasd, danis506,
ibm1s506, но проблема как была, так и есть.
(А может быть имеет значение то, что у KuiSa-Ka наверное
JFS, а у меня HPFS386?)
Глюки по идее должны быть где-то в драйверах дисков,
но они почему-то в ядре. Кстати, у меня один раз трап-
нулось в os2dasd.dmd. Может, проблема именно в os2dasd?
Может, os2dasd передает неправильный запрос ядру, а то
от этого трапается? В общем, не знаю, раскручивать надо.


Valery Sedletski,
valerius (aka heretic).
_valerius@mail.ru

Wed 22 Jan 2003 11:41 Mozilla/4.0 (compatible; MSIE 5.01; 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.