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

 WASM Phorum —› WASM.WIN32 —› Защищенный режим вопросы

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


Дата: Янв 14, 2004 12:47:29

Как я понимаю происходящее->
Есть два процесса A и B. У каждого процесса
есть по два потока (задачи).
Возьмем потоки первого A1 и A2 и потоки второго процесса B1 и B2.
Каждый поток(задача) имеет свою таблицу LTD с набором дескрипторов.
Селекторы этих дескрипторов лежат в регистрах CS DS и тд.
У дескрипторов CS DS есть БАЗА и ПРЕДЕЛ и другие флаги такие как права доступа и тд. При использование flat модели памяти база обычно равна 0 и предел 4 гига, права же разные.
Так же для каждой задачи есть дескриптор TSS
в котором сохраняютс регистры флаги и указатели стеков
плюс селектор LTD и CR3(каталог страниц для данной задачи тут я так понял хранится линейный адрес каталога который потом просто преваращается в физический).


Вопрос
1)Как изолируются адресные пространства
процесса A и процесса B ?
с помощью каталогов страниц? То есть для каждого процесса свой каталог страниц, но они вроде для потока свои, и могут задаваться в CR3 в TSS ?
Или с помощью сегментов селекторы декскрипторов которых лежат в регистрах CS DS и дескрипоторы свои для каждой задачи лежат в LTD.
но тогда непонятно? так как база у сегментов и предел одинаковые для каждого процесса.

2)Как происходят вызовы между между
A1 и A2 (скажем можно ли сделать дальний вызов на адрес cs:eax (логический адрес другой задачи). А если задачи принадлежат разным процессам ?

3)Как вообще во всей этой мешанине, логический адрес,линейный,физический можно понять где какой. Например
в структуре TSS в CR3 лежит линейный адрес каталога страниц а в SSi:ESPi лежат логические адреса для стеков но какой от них смысл если все это в контексте данной задачи.

4)Как просисходит передача параметров при вызове системной функции с помощью прерывания из пользовательского процесса?

Вообщем все вопросы с адресами, во многих хелпах
почему то только обьясняют что такое логический, линейный физический адрес, как перейти от одного к другому, страничная адресация и тд. А как все это работает вместе и где какие толком не пишется.

"Не ну в все понятно, но ясно что конкретно имелось ввиду."


С уважением Дмитрий.


Дата: Янв 14, 2004 12:48:13

не ясно в смысле.


Дата: Янв 14, 2004 18:27:21

А ты не понимай. Ты книжки почитай. Тогда проще будет.
LDT в Windows нет. TSS в Windows нет. Переключение контекстов программное, а не аппаратное. Идет перезагрузка CR0/CR3. Для каждого процесса свой набор страниц.

Как просисходит передача параметров при вызове системной функции с помощью прерывания из пользовательского процесса

На этот вопрос ответь самостоятельно - ковыряй либо кода Linux, либо разберись с int 2e/sysenter в 2k+.

логический адрес,линейный,физический можно понять где какой

Серьезное заявление. Смотрим мануалы Интела. Намек :)
Что такое, положим, ebx? А ds:ebx? А виртуальная память? :)


Дата: Янв 14, 2004 19:01:24

>А ты не понимай. Ты книжки почитай. Тогда проще будет.
>LDT в Windows нет. TSS в Windows нет. Переключение >контекстов программное, а не аппаратное. Идет >перезагрузка CR0/CR3. Для каждого процесса свой набор >страниц.
То есть для каждого процесса(и всех потоков этого процесса )в виндах свой каталог страниц?
Если в виндах нет TSS и LTD тогда я вообще не пойму как сохраняются регистры, селекторы сегментов, указатель на таблицу страниц и все остальное при переключении задач?

Volodya а можешь постучаться ко мне в аську
icq 76970436 Dim, если тебе не сложно, мало просто
людей которых в этом разбираются. Обещаю по пустякам вопросы не задавать.

Спасибо за ответ Дмитрий.


Дата: Янв 14, 2004 19:07:32

Я не люблю чаты и ни в чем не разбираюсь. Я - флибустьер. По чуть-чуть обо всем. :) Т.е., в конечном итоге, ничего :)

По поводу TSS/LDT (а не LTD!) - вот, смотри (только пока сырой):
.text:00404334 SwapContext     proc near               ; CODE XREF: KiUnlockDispatcherDatabase+6Ep
.text:00404334                                         ; KiSwapThread+BCp ...
.text:00404334                 or      cl, cl          ; esi - KTHREAD
.text:00404334                                         ; cl - BYTE WaitIrql
.text:00404334                                         ; ebx - KPCR.SelfPcr
.text:00404336                 mov     es:[esi+KTHREAD.State], 2
.text:0040433B                 pushf
.text:0040433C                 mov     ecx, [ebx]      ; ecx - *KPCR
.text:0040433E                 cmp     dword ptr [ebx+80Ch], 0 ; KPCR.KPRCB.DpcRoutineActive
.text:00404345                 push    ecx
.text:00404346                 jnz     KeBugCheck
.text:0040434C                 mov     ebp, cr0
.text:0040434F                 mov     edx, ebp
.text:00404351                 mov     cl, [esi+KTHREAD.DebugActive]
.text:00404354                 mov     [ebx+50h], cl   ; KPCR.DebugActive
.text:00404357                 cli
.text:00404358                 mov     [edi+KTHREAD.KernelStack], esp
.text:0040435B                 mov     eax, [esi+KTHREAD.InitialStack]
.text:0040435E                 mov     ecx, [esi+KTHREAD.StackLimit]
.text:00404361                 sub     eax, 210h
.text:00404366                 mov     [ebx+8], ecx    ; KPCR.NT_TIB.StackLimit
.text:00404369                 mov     [ebx+4], eax    ; KPCR.NT_TIB.StackBase
.text:0040436C                 xor     ecx, ecx
.text:0040436E                 mov     cl, [esi+KTHREAD.NpxState]
.text:00404371                 and     edx, 0FFFFFFF1h
.text:00404374                 or      ecx, edx
.text:00404376                 or      ecx, [eax+20Ch]
.text:0040437C                 cmp     ebp, ecx
.text:0040437E                 jnz     zero_CR0
.text:00404384 
.text:00404384 loc_404384:                             ; CODE XREF: SwapContext+107j
.text:00404384                 test    dword ptr [eax-1Ch], 20000h
.text:0040438B                 jnz     short loc_404390
.text:0040438D                 sub     eax, 10h
.text:00404390 
.text:00404390 loc_404390:                             ; CODE XREF: SwapContext+57j
.text:00404390                 mov     ecx, [ebx+40h]  ; KPCR.TSS
.text:00404393                 mov     [ecx+4], eax    ; KTSS.Esp0
.text:00404396                 mov     esp, [esi+KTHREAD.KernelStack]
.text:00404399                 mov     eax, [esi+KTHREAD.Teb]
.text:0040439C                 mov     [ebx+18h], eax  ; KPCR.NT_TIB.Self
.text:0040439F                 sti
.text:004043A0                 mov     ecx, [ebx+3Ch]  ; KPCR.GDT
.text:004043A3                 mov     [ecx+3Ah], ax   ; ???
.text:004043A7                 shr     eax, 10h
.text:004043AA                 mov     [ecx+3Ch], al
.text:004043AD                 shr     eax, 8
.text:004043B0                 mov     [ecx+3Fh], al
.text:004043B3                 mov     eax, [edi+KTHREAD.ApcState.Process]
.text:004043B6                 cmp     eax, [esi+KTHREAD.ApcState.Process]
.text:004043B9                 jz      short __ret
.text:004043BB                 mov     edi, [esi+KTHREAD.ApcState.Process]
.text:004043BE                 xor     eax, eax
.text:004043C0                 db      66h
.text:004043C0                 mov     gs, ax
.text:004043C3                 assume gs:nothing
.text:004043C3                 mov     eax, [edi+KPROCESS.DirectoryTableBase]
.text:004043C6                 mov     ebp, [ebx+40h]  ; KPCR.TSS
.text:004043C9                 mov     ecx, dword ptr [edi+KPROCESS.IopmOffset]
.text:004043CC                 mov     [ebp+1Ch], eax  ; KTSS.CR3
.text:004043CF                 mov     cr3, eax
.text:004043D2                 mov     [ebp+66h], cx   ; KTSS.IoMapBase
.text:004043D6                 xor     eax, eax
.text:004043D8                 cmp     [edi+KPROCESS.LdtDescriptor.LimitLow], ax
.text:004043DC                 jnz     short lldt
.text:004043DE                 lldt    ax
.text:004043E1                 lea     ecx, [ecx]
.text:004043E3 
.text:004043E3 __ret:                                  ; CODE XREF: SwapContext+85j
.text:004043E3                                         ; SwapContext+102j
.text:004043E3                 inc     [esi+KTHREAD.ContextSwitches]
.text:004043E6                 inc     dword ptr [ebx+5C0h] ; KPCR.KeContextSwitches
.text:004043EC                 pop     ecx
.text:004043ED                 mov     [ebx], ecx
.text:004043EF                 cmp     [esi+KTHREAD.ApcState.KernelApcPending], 0
.text:004043F3                 jnz     short _ret
.text:004043F5                 popf
.text:004043F6                 xor     eax, eax
.text:004043F8                 retn
.text:004043F9 ; ---------------------------------------------------------------------- -----
.text:004043F9 
.text:004043F9 _ret:                                   ; CODE XREF: SwapContext+BFj
.text:004043F9                 popf
.text:004043FA                 jnz     short ___ret
.text:004043FC                 mov     al, 1
.text:004043FE                 retn
.text:004043FF ; ---------------------------------------------------------------------- -----
.text:004043FF 
.text:004043FF ___ret:                                 ; CODE XREF: SwapContext+C6j
.text:004043FF                 mov     cl, 1
.text:00404401                 call    ds:_imp_HalRequestSoftwareInterrupt
.text:00404407                 xor     eax, eax
.text:00404409                 retn
.text:0040440A ; ---------------------------------------------------------------------- -----
.text:0040440A 
.text:0040440A lldt:                                   ; CODE XREF: SwapContext+A8j
.text:0040440A                 mov     ebp, [ebx+3Ch]  ; KPCR.GDT
.text:0040440D                 mov     eax, dword ptr [edi+KPROCESS.LdtDescriptor.LimitLow]
.text:00404410                 mov     [ebp+48h], eax
.text:00404413                 mov     eax, [edi+(KPROCESS+24h)]
.text:00404416                 mov     [ebp+4Ch], eax
.text:00404419                 mov     eax, 48h
.text:0040441E                 mov     ebp, [ebx+38h]  ; KPCR.IDT
.text:00404421                 mov     ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Offset]
.text:00404424                 mov     [ebp+108h], ecx
.text:0040442A                 mov     ecx, dword ptr [edi+KPROCESS.Int21Descriptor.Access]
.text:0040442D                 mov     [ebp+10Ch], ecx
.text:00404433                 lldt    ax
.text:00404436                 jmp     short __ret
.text:00404438 ; ---------------------------------------------------------------------- -----
.text:00404438 
.text:00404438 zero_CR0:                               ; CODE XREF: SwapContext+4Aj
.text:00404438                 mov     cr0, ecx
.text:0040443B                 jmp     loc_404384
.text:00404440 ; ---------------------------------------------------------------------- -----
.text:00404440 
.text:00404440 KeBugCheck:                             ; CODE XREF: SwapContext+12j
.text:00404440                 push    0B8h
.text:00404445                 call    KeBugCheck
.text:0040444A                 retn
.text:0040444A SwapContext     endp ; sp = -8




Дата: Янв 14, 2004 19:46:43

Dim, о том, что такое логический, линейный и физический адреса, отлично написал Broken Sword в цикле своём цикле статей "процессоры intel в защищённом режиме"


Дата: Янв 15, 2004 04:09:04

> обьясняют что такое ... А как все это работает вместе толком не пишется.

Так ведь отдельно обьясняют также что такое eax, mov, sub, xor...
Как программист напишет, так и будет работать вместе. Хотя лишь в незначительном количестве случаев результаты этой работь будут выглядеть осмысленно :)

А вообще, почему пишешь такое в раздел WIN32 ? винда интересует или что?


Дата: Янв 15, 2004 13:37:36

То есть как я понимаю в ВИНДАХ
для каждого потока одного процесса есть свой каталог таблиц 1024 таблиц по 1024 страниц по 4 кб =4гига
покрывающий виртуальное адресное пространоство.
И при переключении с одного потока на другой поток другого процесса меняется регистр CR3(физ адрес) который начинает указывать на новый каталог страниц нового процесса?
А содержимое всех регистров в том числе и CR3 старого потока сохраняетс в структуре CONTEXT ?
(То есть TSS тут не используется)
И дескрипторы сегментов используются в основом для контроля доступа к сегменту, в дескрипторе которых написано что можно с этими сегментами делать и из какого кольца, который задается в селектрое двумя битами.

Правильно я понимаю происходящее ?


Дата: Янв 15, 2004 14:25:50

Фролов
http://www.osp.ru/pcworld/1998/05/180.htm

"Каждый процесс Windows NT имеет свой отдельный каталог страниц и свое собственное независимое адресное пространство, что очень хорошо с точки зрения защиты процессов друг от друга."


Дата: Янв 15, 2004 18:03:20

А содержимое всех регистров в том числе и CR3 старого потока сохраняетс в структуре CONTEXT ?


А куда твои глазоньки смотрели в том коде, что я привел? CONTEXT - это документированная структура кольца-3. В кольце-0 ее и близко нет. Вместо нее есть KTRAP_FRAME, но это к твоему случаю не относится.
Windows держит двусвязный список EPROCESS, откуда в нужный момент вырипываются необходимые поля и засовываются в KPCR, который является текущим блоком на данный момент времени. Код функции переключения контекстов приведен выше - сам смотри как там с CR0/CR3/LDT обращаются!

для каждого потока одного процесса есть свой каталог таблиц 1024 таблиц по 1024 страниц по 4 кб =4гига


Упрощаешь ситуацию - читай книгу Руссиновича и статьи Four-F, страницы бывают разные ;)

А так, говорю ж, читай интеловские доки - там это понятно разобрано. Применительно к винде это описано в доках к софт-айсу.


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