Мне нужно выяснить, что происходит, когда моя система Linux (Debian) зависает (платформа x86). Мне удалось извлечь следующую информацию непосредственно перед блокировкой системы:
es: 0x7B
cs: 0x73
ss: 0x7B
ds: 0x7B
fs: 0x0
gs: 0x33
ldtbase: 0x0
tr: 0x80
dr7: 0x400
dr6: 0xFFFF0FF0
eax: 0xBFBDE820
ecx: 0xA908F9A0
edx: 0xB708A000
ebx: 0xB71B5278
esp: 0xBFBDE730
ebp: 0xBFBDE838
esi: 0x9D36B58
edi: 0x9D50BB8
eip: 0xB71B13E8
eflags: 0x203206
cr3: 0x1E9DE000
cr0: 0x80050033
Из значений сегментных регистров я знаю, что когда Linux зависает, он находится в режиме пользовательского пространства. Я хотел бы узнать, какой процесс / библиотека вызывает сбой, и в идеале какая именно его часть.
Глядя на CR3 и EIP, я смогу получить эту информацию, но я запутался. Насколько я знаю, виртуальный адрес 0xB71B13E8 относительно используемой таблицы страниц (0x1E9DE000).
Теперь указатель инструкции указывает на физический адрес, верно? Я думаю, что я должен преобразовать это (значение EIP) в виртуальный адрес, который будет смещением таблицы страниц, указанной CR3.
Может ли кто-нибудь помочь мне немного об этом?