· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Количество TSS

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Дек 5, 2003 12:30:31

Выходит, если HalHandleNMI - самый низкоур-й nmi обработчик, то осталось выяснить когда его вызывают в новой задаче?


Дата: Дек 5, 2003 14:19:32

[ volodya: а что SwapContext в ядре? Там идет работа с KTSS ]

По маленьку.
SwapContext proc
. . .
:0040261E loc_40261E:
:0040261E       mov ecx, [ebx+KPCR.TSS]
:00402621       mov [ecx+KTSS.Esp0], eax		; eax = KTHREAD.InitialStack - sizeof FX_SAVE_AREA
. . .
:00402651       mov eax, [edi+KPROCESS.DirectoryTableBase]
:00402654       mov ebp, [ebx+KPCR.TSS]
:00402657       mov ecx, dword ptr [edi+KPROCESS.IopmOffset]
:0040265A       mov [ebp+KTSS.CR3], eax
:0040265D       mov cr3, eax
:00402660       mov [ebp+KTSS.IoMapBase], cx
. . .
SwapContext endp



[ volodya: Итак, KPCR - один на всех. Просто в нужный момент времени берется информация из списка KTHREAD и переписываются поля KPCR. Я прав? ]

Да. В KiSwapThread и KiReadyThread (может ещё где).


Дата: Дек 5, 2003 18:18:22 · Поправил: volodya

Four-F

Не согласен с тобой. Мотивируй.
Смотри. Ты говоришь, KPROCESS, я говорю, KTHREAD. Винда работает с потоками, а не с процессами.
Далее, перезагрузка CR3 для меня вопросом и не была. Меня застрелили вещи ниже. Вот эти:
.text:0040440A                 mov     ebp, [ebx+3Ch]  ; KPCR.GDT
.text:0040440D                 mov     eax, [edi+KTHREAD.Teb]
.text:00404410                 mov     [ebp+48h], eax  ;???
.text:00404413                 mov     eax, [edi+KTHREAD.TlsArray]
.text:00404416                 mov     [ebp+4Ch], eax ;???
.text:00404419                 mov     eax, 48h
.text:0040441E                 mov     ebp, [ebx+38h]  ; KPCR.IDT
.text:00404421                 mov     ecx, [edi+KTHREAD.KernelStack]
.text:00404424                 mov     [ebp+108h], ecx
.text:0040442A                 mov     ecx, dword ptr [edi+KTHREAD.DebugActive]
.text:0040442D                 mov     [ebp+10Ch], ecx
.text:00404433                 lldt    ax




Дата: Дек 6, 2003 15:26:02 · Поправил: Four-F

[ volodya: Ты говоришь, KPROCESS, я говорю, KTHREAD. ]

Именно KPROCESS. При входе в SwapContext edi и esi кажут на KTHREAD потоков, с которого переключаться, и на который переключаться (или наоборот - базы под рукой нет). Но затем в edi помещается указатель на KPROCESS.


[ volodya: Винда работает с потоками, а не с процессами. ]

Если быть более точным, то когда винде надо поработать с процессом она работает с процессом, а когда с потоком, то она с ним и работает. Короче, она сама знает с чем ей работать :-) В том куске кода, который я привёл edi кажет на KPROCESS 100%. Это даже требует доказательства, т.к. DirectoryTableBase является атрибутом процесса, а не потока - Page Table Directory один на все потоки внутри процесса. Затем DirectoryTableBase помещается в cr3. Тут всё чисто. А в твоём куске заполняется дескриптор 48h в GDT (потом загружается в LDTR) и дескриптор для прерывания 21h в IDT. Этот кусок кода для 16-битных прог.
.text:00402698 loc_402698:                   ; SwapContext+A8h
.text:00402698       mov ebp, [ebx+KPCR.GDT]
.text:0040269B       mov eax, dword ptr [edi+KPROCESS.LdtDescriptor.LimitLow]
.text:0040269E       mov [ebp+48h], eax      ; Fill Low Part of LDT Descriptor
.text:004026A1       mov eax, [edi+KPROCESS.LdtDescriptor.HighWord.Bits.BaseHi]
.text:004026A4       mov [ebp+4Ch], eax      ; Fill High Part of LDT Descriptor
.text:004026A7       mov eax, 48h            ; eax = LDT Selector
.text:004026AC       mov ebp, [ebx+KPCR.IDT]
.text:004026AF       mov ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Offset]
.text:004026B2       mov [ebp+108h], ecx     ; Fill Low Part of 21 Interrupt Gate Descriptor
.text:004026B8       mov ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Access]
.text:004026BB       mov [ebp+10Ch], ecx     ; Fill High Part of 21 Interrupt Gate Descriptor
.text:004026C1       lldt ax                 ; Load LDTR = 48h

Поставь туда бряк и запусти любую досовую прогу, hiew.exe например.


Дата: Июл 2, 2004 09:06:01

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

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074