首页 > 解决方案 > 如何在程序集/C 内核中管理分页?

问题描述

我的项目是在我试图用 C 和汇编代码编写的一小块内核上执行我自己的 JVM。所以,我仍在学习内核如何完成其​​主要工作。

现在,按照一些指南,我设置了分页

.map 
    mov         eax     , p3_t
    or          eax     , 0b11
    mov dword   [p4_t]  , eax
    mov         eax     , p2_t
    or          eax     , 0b11
    mov dword   [p3_t]  , eax

    mov        ecx      , 0
.map_pd:
    mov        eax, 0x200000
    mul        ecx
    or         eax , 0b10000011
    mov        [p2_t+ecx*8] , eax
    inc        ecx
    cmp        ecx, 512
    jne        .map_pd

    mov        eax, p4_t
    mov        cr3, eax
    mov        eax, cr4
    or         eax, 1 << 5
    mov        cr4, eax

    mov        ecx, 0xC0000080
    rdmsr
    or         eax, 1 << 8
    wrmsr

    mov        eax, cr0
    or         eax, 1 << 31
    or         eax , 1 << 16
    mov        cr0, eax

那应该设置并启用分页。不幸的是,这些指南给我的信息很少。

现在,如何在 C 内核中管理分页和虚拟地址?你们能否给我一些其他关于分页的指南?

标签: assemblykernelx86-64pagingosdev

解决方案


听起来您只是启用分页,因为 x86-64 需要它,并且您真的不想将它用于任何事情,例如为不同的进程提供自己的虚拟地址空间:

一种简单的选择是对所有 RAM 进行标识映射:物理 = 虚拟地址https://wiki.osdev.org/Setting_Up_Long_Mode#Setting_up_the_Paging

另请参阅https://wiki.osdev.org/Paginghttps://wiki.osdev.org/Setting_Up_Paging_With_PAE(x86-64表条目格式与 32 位 PAE 相同,但使用更多级别。)

1GB 的大页面提供更好的性能(更少的 TLB 未命中,并且在您执行 TLB 未命中时更短的页面遍历)并且意味着更少的页表级别和您必须设置的总 PTE 更少。在较旧的硬件上,2MB 大页面可能是一个不错的选择,但现代 CPU 也对 1G 页面具有良好的 TLB 支持。


推荐阅读