分段错误与页面错误

Posted

技术标签:

【中文标题】分段错误与页面错误【英文标题】:segmentation fault vs page fault 【发布时间】:2011-10-20 12:03:28 【问题描述】:

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

    分段错误是否只属于分段内存模型?

    缺页只属于分页内存模型吗?

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

感谢和问候!

【问题讨论】:

【参考方案1】:

实际上,这两件事非常不同。 分段错误表示程序试图访问无效或非法的内存地址:例如,0,或大于任何有效指针的值。 page fault 是指指针试图访问当前未映射到物理内存的地址空间页面,因此 MMU 需要在使用它之前从磁盘上抓取它。前者是非法条件,程序一般会被中止;后者是完全正常的,程序甚至不会知道它。

“分段”与早期 x86 处理器使用的旧“分段内存模型”完全无关;这是较早的用法,仅指内存的一部分或

【讨论】:

谢谢! (1) 分段内存模型和分页内存模型有什么关系? (2)分段错误中的“分段”是什么意思?这是否意味着分段内存模型中的分段?如果是,为什么除了分段内存模型之外,分页内存模型还会发生这种情况? 程序不会注意到大多数页面错误,但 Wikipedia 表示“无效”页面错误 (en.wikipedia.org/wiki/Page_fault#Invalid) 可能会导致分段错误(取决于您使用的操作系统)。 当您说“页面错误”时,您的描述涵盖“有效”页面错误。两者都以页面错误硬件异常开始,如果操作系统确定进程没有映射该页面,那么它是无效的并传递一个 SIGSEGV。但如果它是有效的,页面错误处理程序可以排队 I/O(硬页面错误)或执行写时复制或任何惰性内存分配(软页面错误)。【参考方案2】:

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

【讨论】:

谢谢! (1) 分段内存模型和分页内存模型有什么关系? (2)分段错误中的“分段”是什么意思?这是否意味着分段内存模型中的分段?如果是,为什么除了分段内存模型之外,分页内存模型还会发生这种情况? 分段错误的另一个原因:写入驻留在内存页中的 VALID 内存地址,其中页保护设置为只读或只读/只执行。例如,写入 .text(代码)部分中的地址将导致 SIGSEGV(但读取相同的地址将是安全的)

以上是关于分段错误与页面错误的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

这段代码一次执行良好,另一次出现分段错误

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

python跟踪分段错误

带有 std::promise 的 C++11 分段错误

C++:当我添加看似无关的代码行时,分段错误消失了