【发布时间】:2014-12-31 09:07:40
【问题描述】:
在C/C++中,不允许访问地址0的数据。
但是,物理内存是从 0 开始编号的。而且,在 DOS 时代,中断向量表位于物理地址 0。第一个中断向量是被零除异常的处理程序。
我的问题是:
什么情况下允许访问物理地址0?
【问题讨论】:
-
两种语言的标准都没有这样的限制。如果一个进程在一个不受保护的虚拟内存地址空间下运行,它就可以访问物理地址 0。保护本身由操作系统使用 MMU 实现。这一切都与 C 和 C++ 无关。
-
很可能它将位于受操作系统保护的区域中;甚至可能是 ROM 的一部分。
-
正如@SJuan76 指出的,这不是语言上的限制,而是物质上的限制
-
@barakmanos 说了什么。地址 0 在我的嵌入式系统上有效。任何老线程都可以写。
-
@MartinJames:就像我说的,如果一个进程在不受保护的虚拟内存地址空间下运行,它可以访问物理地址 0。如果您只运行一个没有虚拟内存管理的进程(许多嵌入式系统就是这种情况,有时甚至没有操作系统+多线程),那么显然您可以访问任何物理地址。其实这种场景下不需要逻辑地址。
标签: c++ c assembly operating-system x86