操作系統(tǒng)_清華、參考changlan-lkm_第1頁
操作系統(tǒng)_清華、參考changlan-lkm_第2頁
操作系統(tǒng)_清華、參考changlan-lkm_第3頁
操作系統(tǒng)_清華、參考changlan-lkm_第4頁
操作系統(tǒng)_清華、參考changlan-lkm_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、可加載內(nèi)核模塊藍(lán)昶Outline什么是可加載內(nèi)核模塊實(shí)現(xiàn)概要以文件系統(tǒng)為例說明如何模塊化什么是內(nèi)核可加載模塊可加載內(nèi)核模塊(從內(nèi)核的 1.2 版本開始引入)是 Linux 內(nèi)核的最重要?jiǎng)?chuàng)新之一。它們提供了可伸縮的、動(dòng)態(tài)的內(nèi)核??杉虞d內(nèi)核模塊是內(nèi)核的擴(kuò)展,可以在需要時(shí)附加到內(nèi)核中,或從內(nèi)核中刪除。一段可以被編譯成目標(biāo)文件 (*.o) 的程序,操作系統(tǒng)在運(yùn)行時(shí)可以將目標(biāo)程序載入到內(nèi)核地址空間中insmod / rmmodLKM 代碼結(jié)構(gòu)一言以蔽之能夠復(fù)制到內(nèi)核區(qū),并被操作系統(tǒng)調(diào)用的二進(jìn)制程序,就是 LKM加載實(shí)現(xiàn)概要把 .o 文件讀入內(nèi)核空間里修正符號(hào)表(重定位)執(zhí)行模塊初始化函數(shù)ELF 文件解析

2、遍歷各個(gè) Section:對(duì)于 SH_TYPE_SYMTAB,遍歷各個(gè)符號(hào)項(xiàng):mod_touch_symbol 函數(shù)把符號(hào)加入符號(hào)表如果符號(hào)對(duì)應(yīng)模塊加載/卸載的函數(shù),記錄下函數(shù)地址如果是 MON類型,ELF 文件里沒有對(duì)應(yīng)的地址,需要自己分配對(duì)于 SHT_NOBITS,即定義了數(shù)據(jù)長(zhǎng)度但并未在 ELF 中分配空間,需要自己分配重定位重定位是指將未定義的符號(hào)關(guān)聯(lián)上對(duì)應(yīng)的內(nèi)存地址ELF 重定位使用 Relocation Table 完成重定位,每個(gè)表項(xiàng)包含:offset 段內(nèi)地址偏移, info 符號(hào)表索引以及重定位類型, addend 額外的數(shù)字(作用隨著類型不同而不同)重定位地址計(jì)算:內(nèi)核符號(hào)

3、 SHN_UNDEF:從導(dǎo)出的符號(hào)表里直接提取地址普通符號(hào):ELF 起始地址 + 符號(hào)段偏移 + 符號(hào)表項(xiàng)中的地址 MON:分配的起始地址 + 符號(hào)表項(xiàng)中的地址重定位重定位有多種類型,主要是由于平臺(tái)的多樣和歷史原因,因此要做好兼容性。對(duì)于x86_64,重定位有如下方式:R_X86_64_NONE: 不用重定位R_X86_64_64: 重定位地址R_X86_64_32: 重定位地址的低32位,無符號(hào)R_X86_64_32S: 重定位地址的低32位,有符號(hào)R_X86_64_PC32: (重定位地址與當(dāng)前地址的偏移)的的低32位,無符號(hào)Caveat: IA32 未實(shí)現(xiàn)存在的問題要求內(nèi)核模塊的所有符號(hào)

4、都在地址 0 xffffffff00000000-0 xfffffffffffffffff否則在重定位時(shí)如果發(fā)生 32 位截?cái)啵囟ㄎ缓蟮牡刂峰e(cuò)誤,引起 Page Faultx86_64 特有實(shí)例:文件系統(tǒng)模塊化文件系統(tǒng)注冊(cè)導(dǎo)出內(nèi)核符號(hào)把文件系統(tǒng)編譯成模塊文件系統(tǒng)注冊(cè)功能維護(hù)一個(gè)雙向鏈表,管理一系列 struct file_system_type 的結(jié)構(gòu),每一個(gè)代表一種文件系統(tǒng)struct file_system_type const char *name; int (*mount)(const char *devname); list_entry_t file_system_type_lin

5、k;文件系統(tǒng)注冊(cè)功能void file_system_type_list_init(void);int register_filesystem(const char *name, int (*mount)(const char *devname); / 注冊(cè)一個(gè)新的文件系統(tǒng)int unregister_filesystem(const char *name); / 取消注冊(cè)文件系統(tǒng)int do_mount(const char *devname, const char *fsname); / 系統(tǒng)調(diào)用,掛載設(shè)備int do_umount(const char *devname); / 系統(tǒng)調(diào)用

6、,取消掛載內(nèi)核符號(hào)表導(dǎo)出導(dǎo)出內(nèi)核符號(hào)到符號(hào)表,供模塊調(diào)用例如在 module/mod.c 中的 mod_init() 函數(shù)中添加 EXPORT(kprintf) 即可將 kprintf 函數(shù)導(dǎo)出文件系統(tǒng)模塊化以 SFS 為例只要對(duì) sfs.c 略加改動(dòng)即可原來的 ucore 開機(jī)時(shí)調(diào)用 sfs_init 函數(shù),用sfs文件系統(tǒng)掛載代碼中固定 hard-coded 的設(shè)備名現(xiàn)在的機(jī)制是系統(tǒng)啟動(dòng)后,用戶選擇加載 mod-sfs 模塊模塊加載時(shí)自動(dòng)調(diào)用 sfs.c 的 init_module 函數(shù),執(zhí)行 register_filesystem(“sfs”, sfs_mount) 注冊(cè)文件系統(tǒng)文件系統(tǒng)模塊化同樣的,卸載模塊時(shí)在 cleanup_module() 調(diào)用 unregister_filesystem(“sfs”) 即可文件系統(tǒng)模塊化的方案對(duì)于其他部分模塊化亦

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論