Не удается найти запись в таблице страниц

Я не могу найти записи в таблице страниц/каталоге страниц для адреса 0xB8000. Он работает правильно, и когда я помещаю некоторые символы в эту область памяти, дисплей показывает это.

Я нахожусь в защищенном режиме, и пейджинг включен. Я использую бокс.

cr0 равен 0xe0000011 или 1110 0000 0000 0000 0000 0000 0001 0001b, cr3 равен 0x1000

введите здесь описание изображения

0xB8000 равно 1011 1000 0000 0000 0000b, поэтому 10111000b — это индекс таблицы страниц, он равен 184, индекс каталога страниц равен 0, смещение равно нулю.

Я перехожу к 0x1000 физической памяти и получаю первый (индекс 0) элемент: введите здесь описание изображения

Это 0x2027 или 10 0000 0010 0111b, поэтому физический адрес таблицы страниц 10b или 2. Мне нужно содержимое 184-й записи, поэтому мне нужно перейти к 184 * 4 + 2 = 738 = 0x2E2, но он пуст:   введите здесь описание изображения

Кстати, у меня есть три дескриптора памяти (память от 0x0 до 0xFFFFFFFF):

null:
    0
code: 
    dw 0FFFFh           ; limit low
    dw 0                ; base low
    db 0                ; base middle
    db 10011010b        ; access
    db 11001111b        ; granularity
    db 0                ; base high

data:
    dw 0FFFFh           ; limit low (Same as code)
    dw 0                ; base low
    db 0                ; base middle
    db 10010010b        ; access
    db 11001111b        ; granularity
    db 0                ; base high

person daniil_    schedule 05.11.2020    source источник


Ответы (1)


Это 0x2027 или 10 0000 0010 0111b, поэтому физический адрес таблицы страниц равен 10b или 2. Мне нужно содержимое 184-й записи, поэтому мне нужно перейти к 184 * 4 + 2 = 738 = 0x2E2, но он пуст:

Это 0x2027, поэтому физический адрес таблицы страниц 0x2000 (не 2). 185-я запись (номер записи 184) будет располагаться по смещению 0x2E0 в таблице страниц и будет иметь физический адрес 0x22E0.

Примечание. Вы можете сдвинуть запись каталога страниц (0x2027) вправо на 12 позиций и сказать, что это физическая страница номер 2, а затем умножить номер страницы на размер страницы (или сдвинуть его влево на 12 позиций), чтобы найти физический адрес страница. Вместо этого проще/быстрее просто замаскировать младшие 12 бит (например, physical_address_of_page_table = page_directory_entry & 0xFFFFF000;), особенно когда вы делаете это в уме с шестнадцатеричными значениями (где вы можете просто предположить, что последние 3 цифры являются нулями).

person Brendan    schedule 05.11.2020
comment
Спасибо большое, понял! - person daniil_; 05.11.2020
comment
@daniil_: я читал, что встроенный отладчик BOCHS должен иметь возможность печатать / создавать дамп таблиц страниц; он мог бы напомнить вам, как расшифровывать запись каталога страниц. - person Peter Cordes; 05.11.2020