Linux可加載內(nèi)核模塊機(jī)制的研究與應(yīng)用
5. LKM與普通應(yīng)用程序的比較
LKM與普通應(yīng)用程序之間的區(qū)別主要體現(xiàn)在四個(gè)方面。
第一,也是最重要的區(qū)別,普通應(yīng)用程序運(yùn)行在用戶空間,而LKM運(yùn)行在內(nèi)核空間。通過(guò)區(qū)分不同的運(yùn)行空間,操作系統(tǒng)能夠安全地保護(hù)操作系統(tǒng)中一些重要數(shù)據(jù)結(jié)構(gòu)的內(nèi)容不被普通應(yīng)用程序所修改,達(dá)到保證操作系統(tǒng)正常運(yùn)轉(zhuǎn)的目的。
第二,普通應(yīng)用程序的目標(biāo)很明確,它們從頭至尾都是為了完成某一項(xiàng)特定任務(wù)。而LKM是在內(nèi)核中注冊(cè)并為后續(xù)應(yīng)用程序的請(qǐng)求提供服務(wù)的。
第三,普通應(yīng)用程序可以調(diào)用并沒(méi)有在其中定義的函數(shù),但一個(gè)LKM是鏈接到內(nèi)核上的,它所能調(diào)用的函數(shù)只有內(nèi)核導(dǎo)出來(lái)的那些函數(shù)。
第四,普通應(yīng)用程序和LKM處理錯(cuò)誤的方式不同。當(dāng)應(yīng)用程序中出現(xiàn)錯(cuò)誤時(shí)并不會(huì)給系統(tǒng)造成很大的傷害。LKM則不然,在其中出現(xiàn)的錯(cuò)誤對(duì)子系統(tǒng)來(lái)說(shuō)通常是致命的,至少對(duì)于當(dāng)前正在運(yùn)行的進(jìn)程而言。LKM中的一個(gè)錯(cuò)誤常常會(huì)導(dǎo)致整個(gè)系統(tǒng)崩潰。
6. 編寫(xiě)LKM需要注意的問(wèn)題
LKM運(yùn)行在內(nèi)核空間,它們擁有對(duì)整個(gè)系統(tǒng)所有資源的訪問(wèn)權(quán)限,因此,編寫(xiě)LKM首先要注意就是安全問(wèn)題,而且還應(yīng)該避免將可能導(dǎo)致出現(xiàn)安全問(wèn)題的代碼帶到LKM中。
LKM加載后是作為操作系統(tǒng)內(nèi)核的一部分運(yùn)行的,因此,在設(shè)計(jì)、編寫(xiě)操作系統(tǒng)內(nèi)核過(guò)程中應(yīng)該注意的問(wèn)題在LKM中也應(yīng)該引起足夠的重視。在這里,主要指的是并發(fā)問(wèn)題和指針引用問(wèn)題。并發(fā)是指在同一時(shí)間有多個(gè)進(jìn)程在操作系統(tǒng)內(nèi)核中同時(shí)運(yùn)行。并發(fā)結(jié)合共享資源最終會(huì)導(dǎo)致競(jìng)態(tài)條件,在這種情況下應(yīng)該對(duì)各個(gè)并發(fā)進(jìn)程訪問(wèn)共享資源進(jìn)行嚴(yán)格的控制。如果在LKM中出現(xiàn)指針引用錯(cuò)誤,內(nèi)核將沒(méi)有辦法將內(nèi)存的虛擬地址映射到物理地址,從而導(dǎo)致出現(xiàn)內(nèi)核中的意外,如內(nèi)存訪問(wèn)沖突、除0以及非法操作等。
7. LKM的不足之處
LKM雖然在設(shè)備驅(qū)動(dòng)程序的編寫(xiě)和擴(kuò)充內(nèi)核功能中扮演著非常重要的角色,但它仍有許多不足的地方。
第一,LKM對(duì)于內(nèi)核版本的依賴性過(guò)強(qiáng),每一個(gè)LKM都是靠?jī)?nèi)核提供的函數(shù)和數(shù)據(jù)結(jié)構(gòu)組織起來(lái)的。當(dāng)這些內(nèi)核函數(shù)和數(shù)據(jù)結(jié)構(gòu)因?yàn)閮?nèi)核版本變化而發(fā)生變動(dòng)時(shí),原先的LKM不經(jīng)過(guò)修改就可能不能正常運(yùn)行。
第二,雖然現(xiàn)在有針對(duì)內(nèi)核編程調(diào)試的工具kgdb,但是在LKM編寫(xiě)過(guò)程中調(diào)試仍非常麻煩,而且在調(diào)試過(guò)程中,系統(tǒng)所能提供的出錯(cuò)信息極為晦澀。
本文作者創(chuàng)新點(diǎn):針對(duì)Linux內(nèi)核,利用LKM,在實(shí)現(xiàn)了數(shù)據(jù)的零拷貝(Zero-copy)的過(guò)程中,將LKM與普通應(yīng)用程序進(jìn)行比較,提出了LKM的優(yōu)勢(shì)和不足。
參考文獻(xiàn)
[1] 任家東,梁哲,趙黎.網(wǎng)絡(luò)協(xié)議的構(gòu)件化方法研究與實(shí)現(xiàn),微計(jì)算機(jī)信息,2006,22-17,85-87.
[2] Peter Jay Salzman, Michael Burian, Ori Pomerantz. The Linux Kernel Module Program- ming Guide [M], 2001: 5-43.
[3] Henderson B. Linux Loadable Kernel Module HOWTO, http://www6.uniovi.es/linux/H- OWTO/Module-HOWTO/, 2002.
[4] 徐偉,賈春福.?dāng)U充Linux系統(tǒng)功能的LKM技術(shù)[J],計(jì)算機(jī)應(yīng)用研究,2003,第四期:100-102.
[5] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M],浙江:浙江大學(xué)出版社,2001年9月,277-280.
[6] Alessandro Rubini, Jonathan Corbet, Greg Kroah-Hartman. Linux Device Drivers Third Edition [M], O’Reilly
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論