Изучаю системное программирование. Вот никак не получается включить страничную трансляцию с PAE с двухмегабайтовыми страницами в защищенном режиме. Код (Text): ; Здесь программа уже в защищенном режиме pages equ 0x9000 pde equ 0x9000 pdpe equ 0xA000 mov ecx,1024*2-1 xor eax,eax mov edi,pages cld rep stosd mov dword[pde],010000011b ; PS or W/R or Present mov dword[pdpe],pde+3 ; W/R or Present mov eax,cr4 bts eax,5 ; PAE = 1 mov cr4,eax mov eax,pdpe mov cr3,eax mov eax,cr0 bts eax,31 mov cr0,eax jmp $+2 Далее содержимое экрана должно немного меняется по прерыванию таймера, но вместо этого комп просто перезагружается. Без PAE, и с четырехмегабайтовой страницой все работает как задумано: Код (Text): pde equ 0x9000 mov ecx,1023 xor eax,eax mov edi,pde cld rep stosd mov dword[pde],010000011b ; PS or W/R or Present mov eax,cr4 bts eax,4 ; PSE = 1 mov cr4,eax mov eax,pde mov cr3,eax mov eax,cr0 bts eax,31 mov cr0,eax jmp $+2 Где я ошибся? И у меня сейчас нет виртуальной машины... тяжеловатая В аттаче код полностью. Запускою через boot.ini
Код (Text): mov dword[pde],010000011b ; PS or W/R or Present mov dword[pdpe],pde+3 ; W/R or Present Здесь явно что-то не так. Во-первых, при включенном PAE дескриптор 64-битный, старшее слово должно обнуляться (кроме младших 4 битов - в них старшие биты адреса). Во-вторых, неверно заполняется PDPTE. 1й бит там зарезервирован, а значит должен быть 0. Процессор проверяет, что все зарезервированные биты должны быть установлены в 0, в противном случае выбрасывает исключение и, как следствие, перезагрузка.
Почему я такой невнимательный... Несклько раз перечитывал описание форматов этих таблиц, и не заметил, что там этот бит зарезервирован. Теперь все работает. Спасибо.