assembly - 如何在程序集/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 内核中管理分页和虚拟地址?你们能否给我一些其他关于分页的指南?
解决方案
听起来您只是启用分页,因为 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页表条目格式与 32 位 PAE 相同,但使用更多级别。)
1GB 的大页面提供更好的性能(更少的 TLB 未命中,并且在您执行 TLB 未命中时更短的页面遍历)并且意味着更少的页表级别和您必须设置的总 PTE 更少。在较旧的硬件上,2MB 大页面可能是一个不错的选择,但现代 CPU 也对 1G 页面具有良好的 TLB 支持。
推荐阅读
- typescript - Whay 在此界面“interface PublicEmitter”中的意思是“= keyof Events”
{ ... }" - c# - 如何将 blob(Excel 文件)上传到 Azure 存储帐户
- node.js - 如何将 webpack 捆绑的 nodejs express 应用程序添加到 wordpress 页面?
- ruby - 当符号是散列中的键时,如何将带有下划线的符号(例如 The_Dark_Knight)转换为单词之间有空格的字符串?
- c# - Winforms 将焦点移动到用户控件中的下一个控件
- android - Firebase 身份验证使应用程序崩溃并显示错误消息:任务尚未完成
- java - 如何在extensionContext中获取变量值
- reactjs - 在 Create React App PWA 中使用 HTML5 地理位置 API 访问地理位置
- linux - 如何将 CSS 添加到主题 GTK
- sql - 在 SSRS 中连接多值参数