【问题标题】:Cannot find page table entry找不到页表条目
【发布时间】:2021-02-17 22:32:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: assembly memory-management x86 operating-system page-tables


    【解决方案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 位数字为零)。

    【讨论】:

    • @daniil_:我听说BOCHS的内置调试器应该能够打印/转储页表;它可能已经能够提醒您如何解码页面目录条目。
    猜你喜欢
    • 2021-11-03
    • 2016-04-23
    • 2020-09-14
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2019-05-13
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多