PCIe 支持各种错误报告机制,我可以看到设备驱动程序如何与这些功能的接口处理特定的错误类型,并在发生错误时根据需要重新初始化相关设备。
但是,如果由于总线错误或热插拔设备断开连接等原因导致读取无法满足,如何向从内存映射地址空间读取的用户空间程序指示 PCIe 读取错误?
据我了解,有两种基本可能性:要么无效数据传播到读取应用程序(例如,所有读取都会返回 0x00 或 0xFF),要么 PCI 错误导致错误状态或中断 CPU,这将由内核处理并转换为信号(如 Unix 上的 SIGBUS)。
(对于写入,这可能不起作用,至少如果它们被实现为发布的 PCIe 事务,因为用户空间应用程序不会在内存访问上被阻止:如果传递了信号,则会在写入失败后的某个时间异步到达。)
后者似乎是一个更安全的选择,但我发现两者都提到了一个信号并发送一个特殊值(这里和这里)。
我的问题不仅限于特定的系统,但由于 PCIe 错误的实现可能在很大程度上取决于相关系统的硬件和内核架构,因此针对特定系统的答案也非常受欢迎。