分段故障与页面故障

Tim*_*Tim 24 memory-management segmentation-fault page-fault

  1. 我想知道分段错误和页面错误之间有什么区别和关系?

  2. 分段故障只属于分段内存模型吗?

    页面错误只属于分页内存模型吗?

    如果两者都是,那么由于大多数计算机系统(如x86和Linux)使用分页内存模型而不是分段内存模型,为什么GCC C编译器有时会报告分段错误错误?

感谢致敬!

Ern*_*ill 29

实际上,这两件事情非常不同.甲分段故障意味着试图访问无效的或非法的存储器地址的程序:例如,0或比任何有效的指针的值.一个页面错误是当指针尝试访问目前不能映射到物理内存地址空间中的页面,使MMU需要抓住它关闭磁盘,然后才能使用它.前者是非法的条件,程序一般会中止; 后者是完全正常的,程序甚至不知道它.

"分段"与早期x86处理器使用的旧"分段存储器模型"完全没有关系; 它是一个早期的用途,它只是指内存的一部分或一部分.

  • 程序不会注意到大多数页面错误,但维基百科说“无效”页面错误(http://en.wikipedia.org/wiki/Page_fault#Invalid)可能会导致分段错误(取决于您使用的操作系统)使用)。 (2认同)
  • 当您说“页面错误”时,您的描述*仅*涵盖“有效”页面错误。两者都以页面错误硬件异常开始,如果操作系统确定该进程没有映射该页面,则该页面无效并传递 SIGSEGV。但如果它有效,页面错误处理程序可以对 I/O 进行排队(硬页面错误)或进行写时复制或任何惰性内存分配(软页面错误)。 (2认同)

c47*_*57p 9

当不允许访问内存(不存在或被禁止)时,会发生分段错误.最常见的是,当您取消引用null变量或运行数组末尾时,它们会发生.当访问映射但未加载的内存时,会发生页面错误.它们不是错误,并向操作系统发出信号,表明它应该将适当的页面加载到内存中.

  • 导致分段错误的另一个原因:写入一个* VALID *内存地址,该地址位于一个内存页面中,并且页面保护设置为只读或只读/ exec-only。例如,在.text(代码)部分中写入地址将导致SIGSEGV(但读取相同的地址将是安全的) (2认同)