【发布时间】:2019-06-26 01:09:47
【问题描述】:
我正在开发一个 Linux 内核模块,它通过处理进程的页表将物理地址范围映射到进程虚拟地址空间。
然后,我脑子里有一个问题,如果 PTE 指向一个不存在的物理地址会发生什么?
例如,我的 X86 笔记本电脑有 8GB DRAM,如果 PTE 的值为 0x8000000400001227,CPU 会不会为这个无效地址访问产生一些异常?
我对此进行了快速测试,但没有发生任何异常情况,我完全糊涂了。
请帮助澄清背后的原因,或者让我知道我是否真的需要阅读一些 X86 文档。
【问题讨论】:
-
您是否考虑过交换大小(或 win 术语中的页面文件)? en.wikipedia.org/wiki/Virtual_memory
-
事实上,在我阅读您的 cmets 之前,我没有考虑交换空间。用你的 cmets,我检查了我的 Linux 系统,交换大小只有 1GB,所以 RAM + SWAP = 9GB。我设置PTE指向16GB,应该是不存在的吧?我还有一个问题,CPU如何使用PTE?我的意思是,它如何知道访问 RAM 或 SWAP 空间?我认为访问交换是由操作系统页面错误处理程序完成的。那么你的意思是 0x400000000 触发了#PF 吗?或者我原来的问题的答案是访问不存在的物理地址会触发 CPU 中的页面错误?
-
交换由软件处理。硬件分页与它没有任何关系,除了如果一个页面不存在,硬件会产生一个页面错误,以便软件可以检索该页面。
-
@norok2:这个问题是关于物理地址空间,而不是虚拟地址空间。处理有效的页面错误以实现虚拟内存是完全独立的。
标签: memory-management x86-64 memory-address