【问题标题】:What if accessing a non-existing physical address in X86 system?如果在 X86 系统中访问一个不存在的物理地址怎么办?
【发布时间】: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


【解决方案1】:

通常,对不存在的内存进行内存读取将返回所有 FF,而内存写入将被丢弃。 (对于某些平台和/或某些地址范围,读取可能会返回 0。这取决于芯片组如何解码地址范围。)

页表条目位 51:M 是保留的(其中 M 是处理器支持的物理地址宽度),因此如果您映射并尝试访问大于物理地址宽度的地址,您将得到一个页面错误,因为到保留位违规。我认为 M 对于客户来说通常是 39 位;更多的服务器。您可以使用 eax=80000008 的 CPUID 并检查 eax 的 7:0 位来找出系统的值。

【讨论】:

  • 在我的 Linux 系统中,M 是 43,所以 0x400000000 是有效地址,但在我的 8GB RAM 系统中不存在。我的测试显示您的 cmets/answer 是正确的。但是在KVM guest(Ubuntu Linux)中,读取的数据是0,不是0xFF,不知道为什么。我很惊讶我可以从不存在的地址读取数据而没有任何错误。我的假设是硬件(您提到的芯片组)应该为该访问触发一些异常,但这似乎不对。
猜你喜欢
  • 2021-10-28
  • 2014-03-16
  • 2010-10-06
  • 2018-09-23
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多