【问题标题】:Why is the memory address 0x0 reserved, and for what?为什么要保留内存地址 0x0,为什么?
【发布时间】:2016-04-16 19:11:45
【问题描述】:

为什么要保留内存地址 0x0,为什么?我很难理解到底是什么,谢谢你的帮助

【问题讨论】:

    标签: memory memory-management operating-system ram memory-address


    【解决方案1】:

    默认情况下不映射第一个(第零个)页面是分页内存系统的常见做法。这是通常由链接器强制执行的约定。当程序加载器读取可执行文件时,它永远不会得到映射第一个逻辑页的指令。

    这样做的原因是为了检测空指针错误。

    int *whatever = 0 ;
     . . . . 
    *whatever = 10 ;
    

    会导致访问冲突。

    也就是说,进程通常可以在执行开始后映射第一个(第零个)页面,在某些情况下,您可以指定链接器选项,允许程序部分基于该页面。

    【讨论】:

      【解决方案2】:

      它主要是一个约定,它是特定于实现的。

      C 语言标准(C99 或 C11) - 以及其他一些编程语言,如 Lisp - 具有无法取消引用的 null pointer 的概念(即 undefined behaviorsegmentation 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 segmentationiAPX432 寻址,Rekursiv 架构等。 ..)

      阅读几本关于 C 编程、微处理器架构和instruction setsoperating system 原理、virtual memoryMMUs 的书籍和网页。

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2012-11-27
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 2018-10-17
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多