физический адрес в линейный

Тема в разделе "WASM.ASSEMBLER", создана пользователем Linikn, 19 сен 2006.

  1. Linikn

    Linikn New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    12
    Адрес:
    Belarus
    Как преобразовать физический адрес cr3 в линейный при страничной адресации? Или вообще как преобразовать линейный адрес в физический адрес не используя всякие там API операционной системы.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Что значит 'физический адрес cr3'? В CR3 как раз таки и хранится физический адрес. В общем, схема примерно такая:

    1. Эффективный адрес складывается с базовым адресом из дескриптора сегмента -- получается линейный адрес.
    2. Если включено страничное преобразование, то линейный адрес условно разбивается на 3 части:

    1. Биты 0-11 -- адрес байта в странице.
    2. Биты 12-21 -- при преобразовании сдвигаются влево на 2 бита, и используется как индекс в таблице сраниц второго уровня (PTE).
    3. Биты 22-31-- при преобразовании сдвигаются влево на 2 бита, и используется как индекс в таблице сраниц первого уровня (PDE).

    В итоге "старшая" из трех частей выбирает нужную запись PDE, которая адресует таблицу второго уровня, средняя, в свою очередь, выбирает в таблице второго уровня нужную запись PTE. Из выбранной PTE берутся старшие 20 бит подставляются в старшие 20 бит линейного адреса.

    Все это может сопровождаться кэшированием и исключениями :). Подробности в мануалах.
     
  3. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Сама по себе постановка задачи странновата - OS может как угодно разнести физические адреса в линейные, т.е. без исследования таблиц трансляции самой OS сделать ничего нельзя, но есть и такой прикол - извлеченный из первой таблицы (Page Directory) _физический_ адрес невозможно применить для дальнейшего изучения (Page Table). Я писал статейку на эту тему (физ. адреса в 98), может быть она поможет.
     
  4. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Не знаю уровня но следующий код запущенный по рингом 0 делает то, то ты хочешь
    Код (Text):
    1. ;----------------------------------------------------------------------------¬
    2. ;¦ GetCR3LogicalAdr: !!! меняет ebp                       ¦
    3. ;¦ Выход:                                                                  ¦
    4. ;¦ esi - логический адрес соответствующий физическому CR3              ¦
    5. ;¦ ebx - логический указатель на IDT.                      ¦
    6. ;L----------------------------------------------------------------------------
    7.         xDT STRUC
    8.         limit       dw  ?
    9.         base        dd  ?
    10.         xDT ENDS
    11.  
    12. GetCR3LogicalAdr:   call GetDataSel
    13.             jz GLACR3Label6
    14.             push ds
    15.             push esp
    16.             push ss
    17.             mov ds,eax
    18.             mov edx,ss
    19.             sub esp,6
    20.             sgdt [esp]
    21.             add edx,[esp.base]
    22.             mov bl,[edx+4]      ; BASE 23:16
    23.             mov bh,[edx+7]      ; BASE 31:24
    24.             shl ebx,10h
    25.             mov bx,[edx+2]      ; BASE 15:00
    26.             mov ss,eax      ; 0 база
    27.             add esp,ebx     ; коректировка esp
    28.             sidt [esp]
    29.             mov ebx,[esp.base]
    30.             add esp,6
    31.             push L [ebx+(14*8)]
    32.             push L [ebx+((14*8)+4)]
    33.             mov eax,cr4     ; если не сбростить
    34.             push eax                ; то вход таблицы страниц    
    35.             and al,7Fh      ; будет кэшироваться и      
    36.             mov cr4,eax     ; бит A изменяться не будет  
    37.             call GLACR3Label1
    38. ; Тут будет перехват INT 0E - ошибка страницы
    39. ; Один из ключевых моментов программы. Поскольку уровень привелегий
    40. ; не изменяется то в стеке будет:
    41. ; esp+00   -> Код ошибки
    42. ; esp+04   -> Адрес возврата
    43. ; esp+08   -> Сегмент возврата
    44. ; esp+0Ch  -> Флаги
    45. ; esp+10h  = старый esp
    46. INT0E:             
    47.             add esp,10h
    48.             jmp GLACR3Label3
    49. GLACR3Label1:       pop ax
    50.             push word ptr 8E00h
    51.             db 66h
    52.             push cs
    53.             push ax
    54.             mov eax,esp
    55.             shr eax,(10+12-2)
    56.             and al,0FCh
    57.             xchg eax,esi
    58.             cli
    59.             pop L [ebx+(14*8)]
    60.             pop L [ebx+((14*8)+4)]
    61. GLACR3Label2:       mov al,[esi]
    62.             and al,00100011b
    63.             cmp al,00100011b
    64.             jnz GLACR3Label3
    65.             mov eax,cr3             ; сброс TLB
    66.             mov cr3,eax
    67.             xor byte ptr [esi], 00100000b   ; остальные не определены
    68.             mov eax,cr3             ; сброс TLB
    69.             mov cr3,eax
    70.             test byte ptr [esi],00100000b   ; не ПЗУ ли
    71.             jnz GLACR3Label3
    72.             mov eax,cr3             ; сброс TLB
    73.             mov cr3,eax
    74.             mov eax,[esp]           ; доступ и проверка
    75.             test byte ptr [esi],00100000b   ; бита A=1 (доступ осуществлен)
    76.             jz GLACR3Label4
    77.             test byte ptr [esi],10000000b
    78.             jnz GLACR3Label5        ; страница 2 или 4 Мб
    79.             push L [esi]
    80.             and byte ptr [esi], 10111111b
    81.             mov eax,cr3             ; сброс TLB
    82.             mov cr3,eax
    83.             mov eax,[esp]           ; доступ и проверка
    84.             mov [esp],eax
    85.             test byte ptr [esi],01000000b   ; бита D=1 (проведена запись)
    86.             pop L [esi]
    87.             jnz GLACR3Label3        ; это не каталог
    88.             jmp GLACR3Label5
    89. GLACR3Label4:       xor byte ptr [esi], 00100000b   ; восстановление
    90. GLACR3Label3:       add esi,1000h
    91.             jnc GLACR3Label2
    92. GLACR3Label5:       pop eax
    93.             mov cr4,eax
    94.             pop L [ebx+((14*8)+4)]
    95.             pop L [ebx+(14*8)]
    96.  
    97.             pop edx
    98.             pop eax
    99.  
    100.             mov ss,edx
    101.             mov esp,eax
    102.  
    103.             pop ds
    104.             and esi,0FFFFF000h
    105. GLACR3Label6:       retn
     
  5. Linikn

    Linikn New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    12
    Адрес:
    Belarus
    Я имею ввиду следующее:
    1 На момент считывания cr3 страничная адресация включена.
    2 В cr3 физический адресс(не линейный!!).
    3 Следовательно в моей проге этот адрес будет трактоваться как линейный
    и бутет преобразовываться согласно страничной трансляции.
    4 И это не даёт возможности считать каталог.

    Теперь понятно?


    PROFi за код спасибо, попробую разобраться.
     
  6. Linikn

    Linikn New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    12
    Адрес:
    Belarus
    Chingachguk
    A как исследовать таблицы трансляции OS
    Есть какая нибудь информация на эту тему?
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    тест пытаешься сдать? -))
     
  8. Linikn

    Linikn New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2004
    Сообщения:
    12
    Адрес:
    Belarus
    z0mailbox
    Вообще то хочу написать операционную систему.
    А что за тест, ты о чём. Лучше бы по делу что нибудь сказал.
     
  9. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Да вроде преобразовать в общем случае не получиться - просто тебе надо будет формировать таблицу pde и начало массива таблиц pte по заранее известным ЛИНЕЙНЫМ адресам.
     
  10. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Linikn

    Только то, что в статье ;( А вообще-то было интересно узнать стратегию win на эту тему.