在内核3.10(7.3 OS)中移植自定义pci驱动程序时遇到问题。执行ioctl访问或对驱动程序的任何访问时,内核崩溃。怀疑崩溃是否是由于以下消息引起的,
警告:- [629.090891] _pcie:正在加载树外模块taints内核。 [629.090921] pcie:模块验证失败:签名和/或必需的密钥缺失-污染内核。
但是当我在RHEL OS 6.5中移植相同的驱动程序时,我没有遇到此警告/错误。
在Linux 7.3中禁用内核模块签名并启动自定义操作系统会清除此警告吗?还是可以在不重新编译操作系统的情况下清除警告。
答案 0 :(得分:0)
所引用的消息本身并不是崩溃的原因。 “内核污染”是针对内核开发人员的通知,用户已加载了不是源于环境的内核开发人员模块。有些人认为这是不支持此类用户和/或设置的正当理由。
崩溃的原因是内部内核ABI(二进制接口)不稳定,它确实在版本之间(甚至在同一版本的不同配置之间)发生变化。内核具有一些防止加载二进制不兼容模块的保护,但是通常会被禁用和/或可以绕过。一旦二进制不兼容的模块进入内核,尝试执行它通常会导致崩溃和其他不良行为:为不同的ABI编译了模块,因此模块内的代码尝试访问偏移量错误的结构字段,使用错误的寄存器中的参数调用函数以及等等。
为避免崩溃,必须至少针对正在运行的内核重新编译模块。尽管在ABI和API都发生更改的情况下这可能会失败。在后一种情况下,需要将模块的源移植到更新的API。