資源描述:
《內(nèi)核模塊的加載》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、2009-12-2416:49:50來自:伊拉克蜜棗甜掉牙★虛擬文件系統(tǒng)模塊增加一個虛擬文件系統(tǒng)是非常簡單的.假如你要開發(fā)一個新的文件系統(tǒng)或者支持現(xiàn)存的文件系統(tǒng),就需要寫一個模塊作為接口.同樣的,假如需要調(diào)試已經(jīng)存在的文件系統(tǒng),也需要那樣一個接口.必須確定你的內(nèi)核不支持目標(biāo)文件系統(tǒng).一個虛擬文件系統(tǒng)的模塊的結(jié)構(gòu)應(yīng)該象如下定義:structlkm_vfs{MODTYPElkm_type;intlkm_ver;char*lkm_name;u_longlkm_offset;structvfsconf*lkm_vfsconf;};和前面的例子差不
2、多,我們也有個模塊類型(LM_VFS),一個版本號,一個模塊名和一個偏移值.在這個vfs模塊的例子中,offset值是用不到的.最后我們需要一個指向vfsconf結(jié)構(gòu)的指針,它包括了虛擬文件系統(tǒng)的操作向量以及一些其他信息(vfsconf結(jié)構(gòu)在頭文件/usr/include/sys/mount.h中定義).此結(jié)構(gòu)通過MOD_VFS宏來初始化:MOD_VFS("nullfs",-1,&nullfs_vfsconf)我們看看上面的代碼,第一個參數(shù)是我們的模塊名,第二個參數(shù)offset,這個參數(shù)在我們的vfs模塊中無關(guān)緊要(前面說過,可以不用).
3、最后一個參數(shù)是我們的文件系統(tǒng)的結(jié)構(gòu).在你的模塊的外部接口中,你必須調(diào)用vfs_opv_init_eXPlicit和vfs_opv_init_default來分配和初始化默認操作向量.因為文件系統(tǒng)被編譯進內(nèi)核,所以通過定義在/usr/src/sys/kern/vfs_conf.c里的vfs_opv_desc[]來在系統(tǒng)啟動的時候裝載.一個需要注意的是當(dāng)用需要用ld程序來鏈接多個源代碼文件來為modload提供目標(biāo)文件時,你必須用-r標(biāo)記來創(chuàng)建一個可重定位的目標(biāo)文件.因為modload在把你的模塊鏈接進內(nèi)核的同時需要用到ld程序.可以用mod
4、load的-d標(biāo)記來察看ld運行的內(nèi)部參數(shù).這兒是一個fs模塊的完整代碼(nullmod.c):#include#include#include#include#include#include#include#include#include/**文件系統(tǒng)的操作結(jié)構(gòu)*參考:/usr/src/sys/miscfs/null
5、fs/*/externstructvfsopsnull_vfsops;externstructvnodeopv_descnull_vnodeop_opv_desc;structvfsconfnullfs_vfsconf={&null_vfsops,MOUNT_NULL,9,0,0,NULL,NULL};/**聲明我們的模塊結(jié)構(gòu),通過我們文件系統(tǒng)的模塊名,offset和初始的vfsconf結(jié)構(gòu)*/MOD_VFS("nullfs",-1,&nullfs_vfsconf)/**我們的外部接口.我們初始化文件系統(tǒng)并且用到了DISPATCH宏,在此
6、例中沒有用到句柄*/intnullfsmod(lkmtp,cmd,ver)structlkm_table*lkmtp;intcmd;intver;{vfs_opv_init_explicit(&null_vnodeop_opv_desc);vfs_opv_init_default(&null_vnodeop_opv_desc);DISPATCH(lkmtp,cmd,ver,lkm_nofunc,lkm_nofunc,lkm_nofunc)}好,編譯安裝它:(一些其他的附加代碼在/usr/src/sys/miscfs/nullfs里)[e4
7、gle@openbsd29]#gcc-D_KERNEL-I/sys-cnull_subr.c[e4gle@openbsd29]#gcc-D_KERNEL-I/sys-cnull_vfsops.c[e4gle@openbsd29]#gcc-D_KERNEL-I/sys-cnull_vnops.c[e4gle@openbsd29]#gcc-D_KERNEL-I/sys-cnullmod.c[e4gle@openbsd29]#ld-r-onullfs.onull_vfsops.onull_vnops.onull_subr.onullmod.o[
8、e4gle@openbsd29]#modload-onullfsmod-enullfsmodnullfs.o[e4gle@openbsd29]#modstatTypeIdOffLoadaddr