找不到页表条目

问题描述

我在页表/页目录中找不到地址为 0xB8000 的记录。它可以正常工作,当我在此内存区域中放入一些符号时,显示屏将显示它。

我处于保护模式,并且启用了分页。我正在使用boch。

cr0 是0xe0000011或1110 0000 0000 0000 0000 0000 0001 0001b, cr3 是0x1000

enter image description here

0xB8000 等于 1011 1000 0000 0000 0000 b,因此10111000b是页表的索引,等于 184 页面目录的索引为 0 ,偏移为零。

我转到物理内存的0x1000,然后得到第一个(索引0)项:

enter image description here

它是0x2027或10 0000 0010 0111b,所以页表的物理地址是10b或2。我需要第184个条目的内容,因此我需要转到184 * 4 + 2 = 738 = 0x2E2,但是它为空:

enter image description here

顺便说一句,我有三个内存描述符(内存从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

解决方法

它是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位为零)在您的头部进行屏蔽时。