【发布时间】:2016-04-16 19:11:45
【问题描述】:
为什么要保留内存地址 0x0,为什么?我很难理解到底是什么,谢谢你的帮助
【问题讨论】:
标签: memory memory-management operating-system ram memory-address
为什么要保留内存地址 0x0,为什么?我很难理解到底是什么,谢谢你的帮助
【问题讨论】:
标签: memory memory-management operating-system ram memory-address
默认情况下不映射第一个(第零个)页面是分页内存系统的常见做法。这是通常由链接器强制执行的约定。当程序加载器读取可执行文件时,它永远不会得到映射第一个逻辑页的指令。
这样做的原因是为了检测空指针错误。
int *whatever = 0 ;
. . . .
*whatever = 10 ;
会导致访问冲突。
也就是说,进程通常可以在执行开始后映射第一个(第零个)页面,在某些情况下,您可以指定链接器选项,允许程序部分基于该页面。
【讨论】:
它主要是一个约定,它是特定于实现的。
C 语言标准(C99 或 C11) - 以及其他一些编程语言,如 Lisp - 具有无法取消引用的 null pointer 的概念(即 undefined behavior、segmentation fault),并且与任何其他语言都不同其他指针(指向某个有效的内存位置)。 Tony Hoare 谦虚地将这个概念称为 "my billion dollar mistake",而某些语言(Haskell、Ocaml)有一些 tagged unions 类型(例如 Ocaml 中的 'a option)。
大多数实现(但不是全部)通过地址 0 表示空指针。
在实践中,在台式机、笔记本电脑或平板电脑上,用户模式 C 程序在某些 virtual address space 中运行,其中包含地址 0 的页面未映射。 (在某些 Linux 上,您也许可以在 mmap(2) 中使用地址 0 的 MAP_FIXED,但那样会很糟糕......)
在某些嵌入式microcontrollers(例如AVR)中,可以使用地址0。
理论上(和过去),地址可能比数字更复杂......(在 1980 年代,例如i286 上的x86 memory segmentation,iAPX432 寻址,Rekursiv 架构等。 ..)
阅读几本关于 C 编程、微处理器架构和instruction sets、operating system 原理、virtual memory、MMUs 的书籍和网页。
【讨论】: