我想知道分段错误和页面错误之间有什么区别和关系?
分段错误是否只属于分段内存模型?
页面错误是否只属于分页内存模型?
如果两者都是,那么由于大多数计算机系统如 x86 和 Linux 使用分页内存模型而不是分段内存模型,为什么 GCC C 编译器有时会报告分段错误错误?
谢谢并恭祝安康!
我想知道分段错误和页面错误之间有什么区别和关系?
分段错误是否只属于分段内存模型?
页面错误是否只属于分页内存模型?
如果两者都是,那么由于大多数计算机系统如 x86 和 Linux 使用分页内存模型而不是分段内存模型,为什么 GCC C 编译器有时会报告分段错误错误?
谢谢并恭祝安康!
这两件事其实很不一样。分段错误意味着程序试图访问无效或非法的内存地址:例如,0,或大于任何有效指针的值。页面错误是指指针试图访问当前未映射到物理内存的地址空间页面,因此 MMU 需要在使用它之前从磁盘上抓取它。前者是非法条件,程序一般会被中止;后者是完全正常的,程序甚至都不知道它。
“分段”与早期 x86 处理器使用的旧“分段内存模型”完全无关;它是较早的用法,仅指内存的一部分或段。
当内存不允许访问(不存在,或被禁止)时,会发生分段错误。当您取消引用空变量或超出数组末尾时,它们最常发生。访问已映射但未加载的内存时会发生页面错误。它们不是错误,而是向操作系统发出信号,表明它应该将适当的页面加载到内存中。