0指针不能访问,那那个位置的字节会不会很孤独?
目录
分两种情况讨论:物理地址和虚拟地址。
如果说的是物理地址 0x0,那他一点都不孤独,每次复位的时候,程序计数器都会跟他打个招呼:
“嘿,哥们,请问复位的中断服务函数怎么走?”
“去 0x100000!”
“谢了!”
这是因为在大部分架构中,中断向量表都放在物理地址 0x0。而第一个中断就是复位中断。
至于虚拟地址 0x0,由于它没有被映射到任何一个物理地址,那么也就无所谓它所在的物理位置的字节了,更谈不上孤独与否:你不能问一个不存在的人是否孤独。
之所以不让虚拟地址 0x0 对应一个实际存在的物理地址,是为了防止程序员失误,传了一个空指针,然后这个空指针还被翻译到一个真实存在的物理地址了。这样会导致意外访问了程序员本来不想访问的地方。
为了避免程序员失误,现代操作系统干脆就保留 0x0,不让它对应任何一个真实存在的地址。这样程序员写错之后就能马上被操作系统告知自己写错了。
如果绕过了操作系统,强行访问虚拟地址 0x0,多半会报一个 MMU Translation fault 吧。因为 MMU 找不到 0x0 对应的物理地址。这种错误是硬件上的错误,属于致命错误,多半会导致死机或者蓝屏,需要硬件复位才能解决。
当然,一般人也不会闲到绕过操作系统。此时操作系统会温柔地告诉你出错了,这种错误不会导致死机或者蓝屏。从这里我们可以看出,程序员的岁月静好,离不开操作系统的负重前行。