我的项目是在我要用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内核中管理分页和虚拟地址?你们可以给我一些其他有关分页的指南吗?
听起来好像您仅启用分页,因为x86-64要求使用分页,并且您实际上并不想将其用于为不同的进程提供自己的虚拟地址空间之类的东西:
一个简单的选择是要标识所有RAM的映射:物理=虚拟地址。 https://wiki.osdev.org/Setting_Up_Long_Mode#Setting_up_the_Paging
另请参见https://wiki.osdev.org/Paging和https://wiki.osdev.org/Setting_Up_Paging_With_PAE(x86-64 page-table entry format与32位PAE相同,但使用更多级别。]
1GB的大页面可提供更好的性能(更少的TLB丢失,而当您进行TLB丢失时,页面走行更短),意味着更少的页面表级别和更少的总PTE。在较旧的硬件上,2MB的大页面可能是一个不错的选择,但是现代的CPU对1G页面也具有良好的TLB支持。