![为什么 64 位机器上的内存访问错误指向 32 位地址?](https://linux22.com/image/1561666/%E4%B8%BA%E4%BB%80%E4%B9%88%2064%20%E4%BD%8D%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84%E5%86%85%E5%AD%98%E8%AE%BF%E9%97%AE%E9%94%99%E8%AF%AF%E6%8C%87%E5%90%91%2032%20%E4%BD%8D%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
每个人在使用电脑的过程中可能都遇到过类似的错误0x8231d13f 处发生内存访问冲突它指出了发生违规的内存中的 32 位地址。假设我们有 8 GiB 的 RAM。问题是:为什么在 64 位 CPU 的机器上,这些违规错误仍然针对 32 位值而不是 64 位值 (例如 0x1934a8bb34cf1200)?如果计算机仍然使用 32 位,那么当我们拥有超过 4GiB 的 RAM (可存储超过 2^32 个地址) 时,它如何访问地址?
一开始我以为这可能与地址总线宽度,但是我读到当前 AMD 架构有 48 位宽度的线。
答案1
操作系统不提供此功能。程序本身捕获错误并显示有意义的错误信息。
如果错误发生在 32 位可执行文件中,并由 32 位异常处理程序捕获,则错误对话框没有任何内容能只是显示错误位置的 32 位地址。
如果情况变得严重到操作系统必须干预该过程,因为访问冲突,那么它很可能什么都不做,忽略导致错误的请求,将相关的错误代码返回给应用程序,并期望它处理输出错误消息。这不是操作系统级别的功能。这完全是应用程序的职责。
如果程序是 64 位可执行文件,并具有 64 位感知异常处理然后我希望在错误窗口中看到一个长地址。
但即使在对话框中显示此类信息,充其量也毫无意义和用处。当您显示这些信息时,它基本上已经超出了无法挽回的地步。一些数据已经丢失,一些关键的未处理状态已经发生,并且很有可能您已经失去了它正在做的事情。
显示任何向最终用户发送错误信息地址的过程就像在罗马被烧毁时摆弄一样。用户对此无能为力,很可能每次调用时地址都会不同,而且这只是对话框噪音。您不妨说“抱歉,发生了一些不好的事情,我们要退出了”,然后就此打住。