|
|
| Посл.отвђт | Сообщен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 |