谁能解释为什么递归调用期间的堆栈溢出会导致总线错误而不是段错误(Mac OS)?
我有一个被递归调用数千次的函数。正如我所料,它达到了堆栈限制,但在其他情况下会导致段错误,这是合乎逻辑的,但为什么它是总线错误 10?据我所知,引用未对齐的内存会导致总线错误,但为什么在达到堆栈限制时会出现这种情况?
最佳答案
总线错误和分段违规都是由程序访问不应访问的内存造成的,但它们是由不同的机制检测和发出信号的。
详细信息因操作系统而异。以下观察结果或多或少是 UNIX 主机上发生的情况。
如果操作系统检测到某个进程正在访问操作系统尚未分配给该进程的内存(例如分配给另一个进程),它会向违规进程发送 SIGSEGV 信号。然后进程/程序终止,报告分段违规。
但是,如果硬件检测到对物理上不存在的硬件资源的访问,则会引发操作系统捕获的硬件故障,操作系统会向执行违规指令的进程发送 SIGBUS 信号。未对齐的内存访问也可能发生这种情况 - 引发硬件故障,并被操作系统捕获,该操作系统向原始进程发送信号。
虽然细节有所不同(例如操作系统或内核如何响应硬件故障,或者向违规进程发送什么信号),但总体思路是相似的。
关于c++ - 为什么堆栈溢出会导致总线错误 10 而不是段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57287267/