ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

fault do_sigbus

fault do_sigbus do_sigbus是 x86 架构缺页异常处理中专门处理SIGBUS信号发送的辅助函数。当handle_mm_fault()返回某些特定的错误如硬件毒化页面VM_FAULT_HWPOISON或 I/O 错误VM_FAULT_SIGBUS时由它来向用户进程发送SIGBUS信号。核心作用与触发场景do_sigbus的职责非常明确处理无法通过常规缺页机制恢复的内存访问错误向用户进程发送SIGBUS信号。它在以下场景中被调用硬件毒化HWPOISON当内核检测到某物理页发生不可纠正的内存错误Machine Check时会标记该页为“毒化”状态。如果进程访问了这类页面就会触发SIGBUS。I/O 错误当从交换空间或文件系统读入页面时发生 I/O 错误内核无法完成页面加载也会发送SIGBUS。函数逻辑与关键操作do_sigbus的典型执行流程如下内核态检查如果异常发生在内核态!(error_code X86_PF_USER)则不能发送信号而是跳转到no_context()尝试通过异常表修复修复失败则触发 Oops。准备siginfo信息将出错地址address、错误码error_code和陷阱号X86_TRAP_PF保存到当前进程的thread结构中确保用户态信号处理程序能通过siginfo获取到这些信息。发送SIGBUS调用force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk, NULL, fault)强制向进程发送SIGBUS信号其中si_code为BUS_ADRERR地址错误。参数演进pkey的移除你给出的签名是当前内核的版本它经历了一次重要的简化。早期版本的do_sigbus曾包含u32 *pkey参数但该参数在 2018 年被移除。原因是do_sigbus从不将si_code设置为SEGV_PKUERR因此pkey信息对用户空间毫无用处。移除这个无用的参数让代码更清晰也避免了误导。与其他信号函数的对比函数发送信号适用场景do_sigbusSIGBUS硬件毒化、I/O 错误等无法通过 VMA 修复的异常__bad_area_nosemaphoreSIGSEGV地址不在任何 VMA 中或权限不足page_fault_oops无Oops/Panic内核态访问非法地址且无法修复do_sigbus是缺页异常处理中“非致命但无法恢复”错误路径的终点它确保用户进程能收到明确的SIGBUS信号而不是被误判为普通的段错误或导致内核崩溃。
返回列表