最近编译内核驱动出现错误,使用dump_stack()函数查看问题,出现以下日志:
其中,对CPU: 0 PID: 7852 Comm: v4l_id Tainted: G O 4.9.140-tegra #1这句话的意义感到不明确,经过各方面查找,最终在 The Linux Kernel 的doc里面找到了相关解释:
某些oops报告在程序计数器之后包含字符串“ Tainted:”。这表明内核已被某种机制污染。字符串后跟一系列位置敏感的字符,每个字符代表一个特定的污染值。
如果加载的所有模块均具有GPL或兼容许可证,则为“ G”;如果已加载任何专有模块,则为“ P”。那些不具有insmod不能识别为GPL兼容的MODULE_LICENSE或MODULE_LICENSE的模块被认为是专有的。
F
如果任何模块是由强制加载的,insmod -f
,如果所有模块都已正常加载。
S
如果oop发生在未通过安全运行多处理器认证的硬件上运行的SMP内核上。当前,这仅发生在不具有SMP功能的各种Athlon上。
R
如果某个模块是由强制卸载的,如果所有模块都已正常卸载。
M
如果任何处理器报告了计算机检查异常, 则没有发生计算机检查异常。
B
如果页面释放功能发现错误的页面引用或某些意外的页面标志。
U
如果用户或用户应用程序特别要求设置Tainted标志,则返回否则。
D
如果内核最近死亡,即出现OOPS或BUG。
A
如果ACPI表已被覆盖。
W
如果内核先前已发出警告。(尽管某些警告可能会设置更具体的异味标记。)
C
如果已加载登台驱动程序。
I
如果内核正在解决平台固件(BIOS或类似版本)中的严重错误。
O
如果已加载外部构建的(“树外”)模块。
E
如果未签名的模块已加载到支持模块签名的内核中。
L
如果以前在系统上发生过软锁定。
K
如果内核已经过实时修补。
附上链接:https://www.kernel.org/doc/html/v4.15/admin-guide/tainted-kernels.html#
通过日志显示可以看出来,这个内核污染的原因是“加载的所有模块均具有GPL或兼容许可证”和“加载外部构建的(“树外”)模块”导致的,并不是本身的问题