问题描述
我在页表/页目录中找不到地址为 0xB8000 的记录。它可以正常工作,当我在此内存区域中放入一些符号时,显示屏将显示它。
我处于保护模式,并且启用了分页。我正在使用boch。
cr0 是0xe0000011或1110 0000 0000 0000 0000 0000 0001 0001b, cr3 是0x1000
0xB8000 等于 1011 1000 0000 0000 0000 b,因此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
解决方法
它是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位为零)在您的头部进行屏蔽时。