modulename: loading out-of-tree module taints kernel【轉】


轉自:https://blog.csdn.net/gzxb1995/article/details/105407014?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

問題描述

使用insmod命令加載編寫的驅動模塊時,出現提示信息:loading out-of-tree module taints kernel。不過,模塊還是能夠被加載。並且卸載后再次加載時,該提示信息沒有再次出現。然而整個系統重啟后再加載模塊,仍然會出現該提示信息。也就是說,在linux的一次運行期間,加載自己編寫的驅動模塊時,出現了上述提示信息。
原因分析

提示信息中的taint是污染的意思,整個提示信息的意思是加載樹外模塊污染內核。先簡單說一下內核污染,當內核受到污染意味着內核處於社區不支持的狀態,並且內核提供的某些功能可能會被禁用。此時,如果內核運行出現問題,內核開發者是不會理會的。

為什么要搞這樣一個機制呢?簡單點說,有一個對linux感興趣的同學下載了kernel的源碼並移植到自己的開發板上,然后自己寫驅動,並加載到內核。之后的一個時間點,假如內核運行出現了問題,此時該同學是不應該向內核開發者反應問題的。因為很有可能內核本身沒問題,而是這個同學自己寫的驅動存在問題,導致了內核的崩潰。內核開發者僅僅只審核了位於內核源碼樹中的代碼,因而只對源碼樹中的代碼負責。換句話說,一個被污染的內核出現問題可能不是內核的bug;一個沒有被污染的內核的錯誤報告更可能蘊含內核bug。有了這個機制,內核開發者就可以確定哪些錯誤報告是需要處理的,不然查半天發現不是自己的問題,這就耽誤工夫了。

這里列部分內核被污染的原因:

    加載非GPL兼容的內核模塊
    staging驅動程序的使用,它們是內核源代碼的一部分,但尚未經過全面測試
    使用內核源代碼未包含的樹外模塊
    強制加載不是為當前內核版本構建的模塊
    某些嚴重錯誤,例如machine check exceptions(MCE)和kernel oopses

顯然,本文所述的內核被污染的原因是加載了樹外模塊,也就是加載自己寫的驅動,不在內核源碼樹中。更多關於內核污染的信息,可以參考這個問答:What is a tainted kernel in Linux?

現在,我們再來思考一個問題,內核是怎么知道這個模塊是樹外的?對此,有人討論過:Marking loadable kernel module as in-tree。這里我簡單總結一下,我們在編譯驅動模塊的Makefile中使用M=$(PWD)來指定驅動源碼所在的目錄,內核的頂層Makefile在檢查到M非空時,會設置KBUILD_EXTMOD變量,最終導致內核的編譯體系不會在modulename.mod.c中添加MODULE_INFO(intree, "Y");,也就是說不會給我們自己的驅動打上屬於樹內的標記。
解決方案

大多數情況下,我們可以忽略內核污染的情況,不能忽略的只是某些嚴重的系統問題導致的內核。事實上,盡管加載內核時會有上述提示,但終究成功加載了模塊,驅動也能工作。

強迫症患者可能非要尋找一個解決方法,那么我們對症下葯,可以使用這么幾種解決方案:

    向內核提交patch,讓內核的開發者將你的驅動並入內核源碼樹(對於只是學習驅動的情況,這個方法並不合適)
    自己把驅動程序拷貝到本地的源碼樹中,並自己添加相應的內核配置項,然后在樹內編譯驅動模塊(保持M為空,這樣做也挺麻煩的)
    自己在驅動源碼種添加一句MODULE_INFO(intree, "Y");,以欺騙內核本模塊為樹內模塊(最好不要這么搞)

綜上,強迫症患者還是忍忍吧,對於自己學習驅動從而產生一些樹外模塊的情況,忽略上述提示信息就可以了^_^!!

最后的最后,我看到網上有同學說這個跟模塊的簽名有關,但就我找到的資料來看,好像不是這么回事,畢竟當前我並未啟用linux內核中的模塊簽名驗證:

# CONFIG_MODULE_SIG is not set

    1

既然提到了模塊簽名,就再丟一個鏈接:Signed kernel module support。這里對模塊簽名有更多的說明,感興趣的同學可以去看看。
————————————————
版權聲明:本文為CSDN博主「冉冉雲」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/gzxb1995/article/details/105407014


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM