Режим PAE

Тема в разделе "WASM.ASSEMBLER", создана пользователем rpy3uH, 16 окт 2007.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Я написал пример программы которая включает режим PAE (запускается из под DOS и переключается в защищённый режим). Она проецирует три виртуальных адреса 0B8000h, 0FF000000h, 0EE000000h на физический адрес 0B8000h и выводи три раза один и тот же текст, по этим трём адресам. За формирование адресов отвечает одна процедурка которой я передаю виртуальный адрес и физический, а она создаёт нужные структуры
    Вот кусок кода который формирует адреса, включает страничную адресацию и выводит сообщения (самое важное это процедурка create_VirtAddressPAE)
    (FASM)
    Код (Text):
    1. PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS equ  01A00000h
    2. PAGE_DIRECTORIES_TABLE_BASE_ADDRESS          equ  01A01000h
    3. PAGE_TABLES_BASE_ADDRESS                     equ  01A10000h
    4.  
    5. TABLES_END                                   equ  02210000h
    6.  
    7.             START_CODE:
    8.  
    9.    xor eax, eax
    10.    mov edi, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    11.    mov ecx, (TABLES_END - PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS)/4
    12.    rep stosd
    13.  
    14.    mov eax, START_CODE
    15.    mov ebx, eax
    16.    call create_VirtAddressPAE
    17.  
    18.    mov eax, 0B8000h
    19.    mov ebx, eax
    20.    call create_VirtAddressPAE
    21.  
    22.    mov eax, 0FF000000h
    23.    mov ebx, 0B8000h
    24.    call create_VirtAddressPAE
    25.  
    26.    mov eax, 0EE000000h
    27.    mov ebx, 0B8000h
    28.    call create_VirtAddressPAE
    29.  
    30.    mov eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    31.    mov cr3, eax
    32.  
    33.  
    34.    mov eax, cr4
    35.    or eax, 32
    36.    mov cr4, eax
    37.  
    38.    mov eax, cr0
    39.    or eax, 80000000h
    40.    mov cr0, eax
    41.  
    42.  
    43.          ;--------------------PAE PAGING ENABLED-------------------------
    44.                 mov esi, message1
    45.                 mov edi, 0B8000h
    46.                 mov ecx,18
    47.                 rep movsb
    48.  
    49.                 mov esi, message2
    50.                 mov edi, 0FF000012h
    51.                 mov ecx, 18
    52.                 rep movsb
    53.  
    54.                 mov esi, message3
    55.                 mov edi, 0EE000024h
    56.                 mov ecx, 18
    57.                 rep movsb
    58.  
    59.                 jmp    $
    60.  
    61. message1 db "152535455565758595"
    62. message2 db "A5d5r5F5F505050505"
    63. message3 db "A5d5r5E5E505050505"
    64.  
    65. create_VirtAddressPAE:
    66. ; in
    67. ; EAX page address
    68. ; EBX phys page address
    69.     pushad
    70.  
    71.     and eax, 0FFFFF000h
    72.     and ebx, 0FFFFF000h
    73.  
    74.     mov edi, eax
    75.     mov esi, ebx
    76.  
    77.     shr eax, 30
    78.     mov ebx, eax
    79.     mov ecx, eax     ;ebx, ecx, eax index in Page Directories Table
    80.     shl eax, 3       ; eax = eax*8
    81.     add eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    82.                      ; eax point to entry of Page Directories Table
    83.  
    84.     imul ebx, ebx, 512*8
    85.     add ebx, PAGE_DIRECTORIES_TABLE_BASE_ADDRESS
    86.                      ; ebx point to Page Directory
    87.     ;add eax, 4  ;!!!!!---!!!
    88.     or ebx, 1
    89.     mov [eax], ebx
    90.     ;sub eax, 4  ;!!!---!!!
    91.  
    92.     mov eax, edi
    93.     shl eax, 2
    94.     shr eax, 23
    95.     mov edx, eax    ; edx, eax index in page dir
    96.     shl eax, 3      ; eax = eax*8
    97.     add eax, ebx    ; eax point to page dir entry
    98.  
    99.     imul edx, ecx
    100.     imul edx, 512*8
    101.     add edx, PAGE_TABLES_BASE_ADDRESS
    102.                     ; edx point to page table
    103.     ;add eax, 4  ;!!!!!---!!!
    104.     or edx, 3
    105.     mov [eax], edx
    106.     ;sub eax, 4  ;!!!---!!!
    107.  
    108.     mov ebx, edi
    109.     shl ebx, 11
    110.     shr ebx, 23     ; ebx index in page table
    111.     shl ebx, 3      ; ebx = ebx*8
    112.     add ebx, edx    ; ebx point to page table entry
    113.     ;add ebx, 4 ;!!!!!---!!!
    114.     or esi, 3
    115.     mov [ebx], esi
    116.    .end:
    117.     popad
    118.     ret
    по адресу PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS находится таблица указателей на каталоги
    по адресу PAGE_DIRECTORIES_TABLE_BASE_ADDRESS надодятся четыре каталога
    по адресу PAGE_TABLES_BASE_ADDRESS находятся таблицы страниц
    проверяю прогу на машине VirtualBox
    в общем прога не работает, чего только не пробовал: неполучается
    Парни, пожалуйста, помогите если не лень кто чем может, ошибка наверняка какая-нибудь глупая....
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Хм, странный немного код у тебя. Попробуй заменить на этот:
    Код (Text):
    1. map_addr:
    2.  and ebx, 0xFFFFF000
    3.  
    4.  mov edx, eax
    5.  shr eax, 0x1E
    6.  shl eax, 0x3
    7.  add eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    8.  
    9.  mov [eax], PAGE_DIRECTORIES_TABLE_BASE_ADDRESS or 0x1
    10.  
    11.  mov eax, edx
    12.  shr eax, 0x15
    13.  and eax, 0x1FF
    14.  shl eax, 0x3
    15.  add eax, PAGE_DIRECTORIES_TABLE_BASE_ADDRESS
    16.  
    17.  mov [eax], PAGE_TABLES_BASE_ADDRESS or 0x1
    18.  
    19.  mov eax, edx
    20.  shr eax, 0xC
    21.  and eax, 0x1FF
    22.  shl eax, 0x3
    23.  add eax, PAGE_TABLES_BASE_ADDRESS or 0x1
    24.  
    25.  or ebx, 0x1
    26.  mov [eax], ebx
    27.  
    28.  ret
    Я его, правда, не проверял на машине -- только в голове прокрутил, но, вроде, работать должно.

    Помимо этого, необходимо сбросить очередь команд после выставления бита, отвечающего за страничное преобразование. Т.е. поставь что-то вроде:

    Код (Text):
    1.  jmp next
    2. next:
     
  3. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    неа, не работает этот код, слишком он простой тебя

    мой код не странный, он сложный, кто разберётся - тот герой :)
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    ُУгу, настолько сложный, что аж не работает ;).

    Совсем забыл: каждая entry же 8 байт. Соотвественно, должно быть так:

    Код (Text):
    1.  map_addr:
    2.  and ebx, 0xFFFFF000
    3.  
    4.  mov edx, eax
    5.  shr eax, 0x1E
    6.  shl eax, 0x3
    7.  add eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    8.  
    9.  mov [eax], PAGE_DIRECTORIES_TABLE_BASE_ADDRESS or 0x1
    10.  mov [eax + 0x4], 0x0
    11.  
    12.  mov eax, edx
    13.  shr eax, 0x15
    14.  and eax, 0x1FF
    15.  shl eax, 0x3
    16.  add eax, PAGE_DIRECTORIES_TABLE_BASE_ADDRESS
    17.  
    18.  mov [eax], PAGE_TABLES_BASE_ADDRESS or 0x1
    19.  mov [eax + 0x4], 0x0
    20.  
    21.  mov eax, edx
    22.  shr eax, 0xC
    23.  and eax, 0x1FF
    24.  shl eax, 0x3
    25.  add eax, PAGE_TABLES_BASE_ADDRESS or 0x1
    26.  
    27.  or ebx, 0x1
    28.  mov [eax], ebx
    29.  mov [eax + 0x4], 0x0
    30.  
    31.  ret
     
  5. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    неа, он тоже на работает!
    суть проблемы в том что, а нас 4 каталога страниц, поэтому что бы поставить нормальную ссылку на каталог, надо умножить индекс каталога на 512*8 (размер одного каталога) и прибавить к PAGE_DIRECTORIES_TABLE_BASE_ADDRESS
    для этого у меня и есть код
    Код (Text):
    1.     imul ebx, ebx, 512*8  ; в  ebx изначально индекс каталога мы его умножаем на 512*8 и сохраняем в ebx
    2.     add ebx, PAGE_DIRECTORIES_TABLE_BASE_ADDRESS ; теперь в ebx у нас ссылка на контретный каталог страниц
    аналогичная ситуация с таблицами страниц (их ещё больше!!!!)
    Код (Text):
    1.     imul edx, ecx ; в ecx у нас индекс каталога, в edx индекс в этом каталоге страниц и мы их перемножаем
    2.     imul edx, 512*8 ; мы это число умножаем на размер одной таблицы страниц
    3.     add edx, PAGE_TABLES_BASE_ADDRESS ; теперь в edx у нас ссылка на конкретную таблицу страниц
    првильно, он не работает потому что он сложный :)
    кстати, првильно ли я включаю страничную адресацию? я сначала выставляю пятый бит в cr4 и потом выставляю последный бит в cr0
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Зачем? Старшие 2 бита адреса -- индекс в PDPT. Размер элемента PDPT -- 8 байт. Он содержит физический адрес каталога таблиц. Соотвественно, получив старшие два бита адреса, умножив их на 8 и сложив с базовым физическим адресом PDPT, получим физический адрес элемента PDPT, который содержит физический адрес каталога таблиц:
    Код (Text):
    1.  mov edx, eax
    2.  shr eax, 0x1E
    3.  shl eax, 0x3
    4.  add eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    5. ;теперь еах содержит физический адрес элемента PDPT.
    6.  
    7. ;запишем в него физический адрес каталога таблиц, с установленным битом присутствия
    8. ; и обнулим старшие 32 бита элемента.
    9.  mov [eax], PAGE_DIRECTORIES_TABLE_BASE_ADDRESS or 0x1
    10.  mov [eax + 0x4], 0x0
    Те же действия надо проделать с оставшейся частью адреса.

    Нашел у себя опечатку:
    Код (Text):
    1.  add eax, PAGE_TABLES_BASE_ADDRESS or 0x1
    замени на:
    Код (Text):
    1.  add eax, PAGE_TABLES_BASE_ADDRESS
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ну и до кучи на 512*8 множить не стоит.
    Битовые сдвиги никто не отменял ;)
    Хотя ошибка ясное дело не в этом...
     
  8. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    но каталогов таблиц целых четыре: первый катлог будет по адресу PAGE_DIRECTORIES_TABLE_BASE_ADDRESS, второй каталог будет по адресу PAGE_DIRECTORIES_TABLE_BASE_ADDRESS+1000h, третий каталог будет по адресу PAGE_DIRECTORIES_TABLE_BASE_ADDRESS+2000h и четвёртый каталог PAGE_DIRECTORIES_TABLE_BASE_ADDRESS+3000h, для этого и надо умножать индекс каталога на 512*8 и прибавлять к базе
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Неважно, в каком порядке и как располагать таблицы. Их адреса известны тебе заранее. Соотвественно вычислять их не надо.

    1. Существует ли физ. адрес 1A00000 и т.п. в вирт. машине? Поддерживает ли Virt. Box PAE?
    2. Пробовал ли отлаживать в Bochs? Bochs более подробен в случае возникновения ошибки.
    3. Покажи, какой код у тебя получился в итоге (с моей вставкой), или выложи образ для Bochs, который можно запустить.
     
  10. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    1. Физический адрес 1A00000 (это район 26 мегабайта) точно есть на вирт. машине т.к. в настройках указано 64 МБ
    2. Я как раз и собираюсь использловать Bochs
    3. Я не использую Bochs потому что у меня то создаётся прога в форамте MZ для DOS, а как я её помещу в образ? (VirtualBox я просто настроил так чтобы она использовала реальную дисекту отформатированную как загрузочный диск MS-DOS)
    в общем мне по ходу придётся переписать прогу что бы она являлась загрузчиком чтобы можно было её засунуть в образ.
    В общем если уже кому-то реально интересна моя проблема, то прикрепляю исходник проги. там 2 файла pm.asm(основной файл) и PM_CODE.ASM (код защищённого режма).
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    У тебя в исходнике стоит 'add eax, PAGE_TABLES_BASE_ADDRESS or 0x3', в предыдущем посте я писал, что это надо изменить на 'add eax, PAGE_TABLES_BASE_ADDRESS'.
     
  12. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    всем спасибо за участие!!!! хоть кто-то попытался помочь.....
    проблема решилась, я всё таки исправил свою процедурку "создания" виртуального адреса (истина была рядом!)
    выкладываю её код, восклицательными знаками помечены ключевые строки
    может кому-нибудь пригодится....
    Код (Text):
    1. create_VirtAddressPAE:
    2. ; in
    3. ; EAX page address
    4. ; EBX phys page address
    5.     pushad
    6.  
    7.     and eax, 0FFFFF000h
    8.     and ebx, 0FFFFF000h
    9.  
    10.     mov edi, eax
    11.     mov esi, ebx
    12.  
    13.     shr eax, 30
    14.     mov ebx, eax
    15.     mov ecx, eax     ;ebx, ecx, eax index in Page Directories Table
    16.     shl eax, 3       ; eax = eax*8
    17.     add eax, PAGE_DIRECTORIES_POINTERS_TABLE_BASE_ADDRESS
    18.                      ; eax point to entry of Page Directories Table
    19.  
    20.     shl ebx, 12
    21.     add ebx, PAGE_DIRECTORIES_TABLE_BASE_ADDRESS
    22.                      ; ebx point to Page Directory
    23.  
    24.     push ebx    ; save ebx  !!!!!!
    25.     or ebx, 1   ; set present flag !!!!!!
    26.     mov [eax], ebx
    27.     pop ebx     ; backup ebx !!!!!!!!!
    28.  
    29.  
    30.     mov eax, edi
    31.     shl eax, 2
    32.     shr eax, 23
    33.     mov edx, eax    ; edx, eax index in page dir
    34.     shl eax, 3      ; eax = eax*8
    35.     add eax, ebx    ; eax point to page dir entry
    36.  
    37.     imul edx, ecx
    38.     shl edx, 12
    39.     add edx, PAGE_TABLES_BASE_ADDRESS
    40.                     ; edx point to page table
    41.  
    42.     push edx        ; save edx !!!!!
    43.     or edx, 3       ; set present, write, supervisor flags
    44.     mov [eax], edx
    45.     pop edx         ; backup edx !!!!!!!!!
    46.  
    47.  
    48.     mov ebx, edi
    49.     shl ebx, 11
    50.     shr ebx, 23     ; ebx index in page table
    51.     shl ebx, 3      ; ebx = ebx*8
    52.     add ebx, edx    ; ebx point to page table entry
    53.  
    54.     or esi, 3
    55.     mov [ebx], esi
    56.    .end:
    57.     popad
    58.     ret
     
  13. AlB80

    AlB80 New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    25
    Адрес:
    Russia
    Ага. Ребята в теме. :)
    Есть вопрос.
    1. ВиндаХР использует PAE для предотвращения выполнения данных.
    2. Больше 4ГБ физического пространства обрабатывать всеравно не хочет (да и не надо, нет столько у меня, проблемы с дровами и тд и тп).
    3. Позволяет создать своп больше чем на 4ГБ.

    а. Больше ли будет виртуалки?
    б. Почему можно создать своп на 80ГБ?
     
  14. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    б. Почему можно создать своп на 80ГБ?
    ___А у меня своп вообще 512 гб :))
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я не специалист по swap'у, но, насколько я понимаю, ничего страшного в большом swap'е нет. Задач-то в ОС много, адресное пространство каждой -- 4 GB. Соответственно, и swap может быть больше чем 4 GB.
     
  16. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    если я не ошибаюсь, в Windows СУММА виртуальной памяти ВСЕХ приложениий не считая ядерной и не считая промэпированной не превышает 4 ГБ. Винда не даст приложениям выделить больше.
     
  17. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ты ошибаешся.
    Ядерная память общая плюс 2Гб или 3Гб подьзовательского адресного пространства для каждого процесса.
    Создай 5 процессов и в каждом выдели 1Гб памяти - система ругнётся на нехватку виртуальной памяти и предложит увеличить своп.
    При согласии своп просто увеличится до ~5Гб и всё.
    Отказа в выделении никто не получит.
    PS: эксперимент надо проводить при свопе размещённом на NTFS разделе, на FAT работать не будет т.к. там максимальный размер файла 4Гб - но это ограничение FS а не ОС в целом.
     
  18. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    cppasm
    Ты этот эксперимент реально проводил? Всё было как ты сказал? Тогда я не знаю, что это за версия винды. У меня своп файл мало увеличился, когда было запрошено пятью процессами по 1Г. Двум процессам был дан отказ.
     
  19. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    10110111, надо проверить, но мне кажется тоже, что объем доступной памяти ограничивается только объемом оперативы и свопа, возможности защищенного режима позволяют раздавать виртуальную память направо и налево :)
     
  20. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    Я этот эксперимент реально проводил. Ставиш своп в 5 гб и все будет ок, все запросы будут выполнены, но скорость... В этом и смысл PAE