Помогите разобраться с Page Translation

Тема в разделе "WASM.ZEN", создана пользователем dinoweb, 13 ноя 2006.

  1. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Изучаю системное программирование.
    Вот никак не получается включить страничную трансляцию с PAE с двухмегабайтовыми страницами в защищенном режиме.

    Код (Text):
    1.  ; Здесь программа уже в защищенном режиме
    2.   pages equ 0x9000
    3.   pde   equ 0x9000
    4.   pdpe  equ 0xA000
    5.  
    6.   mov ecx,1024*2-1
    7.   xor eax,eax
    8.   mov edi,pages
    9.   cld
    10.   rep stosd
    11.  
    12.   mov dword[pde],010000011b ; PS or W/R or Present
    13.   mov dword[pdpe],pde+3     ; W/R or Present
    14.  
    15.   mov eax,cr4
    16.   bts eax,5 ; PAE = 1
    17.   mov cr4,eax
    18.  
    19.   mov eax,pdpe
    20.   mov cr3,eax
    21.  
    22.   mov eax,cr0
    23.   bts eax,31
    24.   mov cr0,eax
    25.   jmp $+2
    Далее содержимое экрана должно немного меняется по прерыванию таймера, но вместо этого комп просто перезагружается.

    Без PAE, и с четырехмегабайтовой страницой все работает как задумано:

    Код (Text):
    1.   pde   equ 0x9000
    2.  
    3.   mov ecx,1023
    4.   xor eax,eax
    5.   mov edi,pde
    6.   cld
    7.   rep stosd
    8.  
    9.   mov dword[pde],010000011b ; PS or W/R or Present
    10.  
    11.   mov eax,cr4
    12.   bts eax,4 ; PSE = 1
    13.   mov cr4,eax
    14.  
    15.   mov eax,pde
    16.   mov cr3,eax
    17.  
    18.   mov eax,cr0
    19.   bts eax,31
    20.   mov cr0,eax
    21.   jmp $+2
    Где я ошибся?

    И у меня сейчас нет виртуальной машины... тяжеловатая

    В аттаче код полностью. Запускою через boot.ini
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1.   mov dword[pde],010000011b ; PS or W/R or Present
    2.   mov dword[pdpe],pde+3     ; W/R or Present
    Здесь явно что-то не так. Во-первых, при включенном PAE дескриптор 64-битный, старшее слово должно обнуляться (кроме младших 4 битов - в них старшие биты адреса). Во-вторых, неверно заполняется PDPTE. 1й бит там зарезервирован, а значит должен быть 0.

    Процессор проверяет, что все зарезервированные биты должны быть установлены в 0, в противном случае выбрасывает исключение и, как следствие, перезагрузка.
     
  3. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Почему я такой невнимательный... Несклько раз перечитывал описание форматов этих таблиц, и не заметил, что там этот бит зарезервирован. Теперь все работает.
    Спасибо.