日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux内核引入模块机制好处,linux内核模块的版本检查机制

發(fā)布時(shí)間:2025/3/21 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核引入模块机制好处,linux内核模块的版本检查机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

linux內(nèi)核對(duì)插入的內(nèi)核模塊進(jìn)行嚴(yán)格的版本檢查,即使一個(gè)小版本號(hào)不一致也會(huì)導(dǎo)致加載的不成功,這完全是為了內(nèi)核本身運(yùn)行安全。由于linux內(nèi)核的發(fā)布是基于版本號(hào)的,而所有的內(nèi)核模塊的開(kāi)發(fā)必須依賴內(nèi)核頭文件--其使用的內(nèi)核導(dǎo)出符號(hào)均在頭文件中,該頭文件肯定屬于一個(gè)特定版本的源碼樹(shù),因此模塊也就間接依賴了該版本的源碼樹(shù)。那么到底為何內(nèi)核對(duì)模塊的版本檢查如此嚴(yán)格呢?因?yàn)槊慨?dāng)一個(gè)新的版本發(fā)布,可能導(dǎo)致接口的改變,如果不嚴(yán)格檢查版本則可能導(dǎo)致內(nèi)核crash,然而如果舊版本的模塊難道沒(méi)有任何辦法載入到新版本的內(nèi)核中嗎?不是的!只要它使用的接口在兩個(gè)版本間沒(méi)有改變即可,這是通過(guò)一個(gè)非常有意思的機(jī)制實(shí)現(xiàn)的,這就是單獨(dú)接口符號(hào)的crc校驗(yàn)機(jī)制。其實(shí)windows的ddk編譯的驅(qū)動(dòng)要想載入內(nèi)核而不發(fā)生意外,接口的一致性也是必要的,只是ddk的編譯環(huán)境為開(kāi)發(fā)者屏蔽了很多版本方面的信息,第一,ddk自帶了頭文件并且windows的內(nèi)核無(wú)法單獨(dú)進(jìn)行下載,它是和操作系統(tǒng)一起被發(fā)行的;第二,操作系統(tǒng)的內(nèi)核,庫(kù),ddk是由微軟統(tǒng)一管理的。因此,我們會(huì)覺(jué)得ddk編譯出的驅(qū)動(dòng)對(duì)系統(tǒng)版本沒(méi)有要求,其實(shí)這是不對(duì)的,在ddk的Build Environments中,不是也有版本之分別嗎?只是它的版本沒(méi)有l(wèi)inux那么多罷了!

首先要知道,內(nèi)核中只要是EXPORT的符號(hào),都會(huì)有一個(gè)crc校驗(yàn)碼,這些校驗(yàn)碼保存在內(nèi)核映像中,這些校驗(yàn)碼用于和載入內(nèi)核的模塊中包含的crc校驗(yàn)碼作比較。模塊編譯的過(guò)程中,genksyms這個(gè)程序起了很大的作用,其實(shí)編譯模塊最終的結(jié)果--一個(gè)ko文件并不僅僅是你的模塊源代碼c文件經(jīng)過(guò)編譯器和鏈接器處理過(guò)后的結(jié)果,而是被genksyms插入了一些額外的數(shù)據(jù),就是這些數(shù)據(jù)作為版本控制的依據(jù)起了很大的作用。簡(jiǎn)單來(lái)說(shuō)就是genksyms分析模塊源代碼文件(編譯預(yù)處理后的),將其中使用的函數(shù),變量等抽出來(lái),然后再為這些函數(shù),變量中的每一個(gè)生成一個(gè)crc校驗(yàn)碼,生成校驗(yàn)碼輸入就是函數(shù)的名稱,參數(shù)類型以及變量的名稱,類型等,然后這些crc校驗(yàn)和被寫入一個(gè).mod.c文件中,最終編譯器和鏈接器將這個(gè).mod.c文件和源代碼文件一起編譯和鏈接,最終生成的ko中就包含了這些由genksyms生成的crc校驗(yàn)和。

當(dāng)模塊加載的時(shí)候,內(nèi)核會(huì)逐一的抽出ko模塊中的每一個(gè)符號(hào)以及其對(duì)應(yīng)的crc校驗(yàn)碼,然后和內(nèi)核本身保存的該符號(hào)的crc校驗(yàn)碼做比較,只要有一個(gè)符號(hào)的crc校驗(yàn)碼不同就說(shuō)明該模塊的版本不正確,因?yàn)槿绻撃K確實(shí)是在當(dāng)前內(nèi)核版本下編譯的,那么其符號(hào)的crc校驗(yàn)碼將會(huì)和內(nèi)核本身相應(yīng)符號(hào)的crc校驗(yàn)碼一致,畢竟它們的算法一樣,輸入信息也一樣。

以上的這種機(jī)制可以被用作一種動(dòng)態(tài)的版本控制,比如動(dòng)態(tài)鏈接庫(kù)的版本控制,這樣可以減輕庫(kù)混亂帶來(lái)的危害,我們需要作的僅僅是為每一個(gè)動(dòng)態(tài)庫(kù)生成一個(gè)類似.mod.c的文件,姑且稱為.version.c,這個(gè)文件中包含所有引用接口的crc校驗(yàn)碼以及引用接口本身,然后修改動(dòng)態(tài)庫(kù)的加載機(jī)制,增加版本檢查相關(guān)的邏輯,也就是一個(gè)crc比對(duì)的邏輯。

總結(jié)

以上是生活随笔為你收集整理的linux内核引入模块机制好处,linux内核模块的版本检查机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。