淺談Linux驅(qū)動程序(final)鄭重.ppt
《淺談Linux驅(qū)動程序(final)鄭重.ppt》由會員分享,可在線閱讀,更多相關(guān)《淺談Linux驅(qū)動程序(final)鄭重.ppt(32頁珍藏版)》請在裝配圖網(wǎng)上搜索。
淺談Linux驅(qū)動程序編寫 鄭重2010 04 27 內(nèi)容 簡單的內(nèi)核模塊Helloworld include includestaticinthello init void printk Hello world n return0 staticinthello exit void printk Goodbye n module init hello init module exit hello exit Helloword分析 hello init模塊裝載到內(nèi)核時調(diào)用hello exit模塊從內(nèi)核中移除時調(diào)用module init hello init 這個宏說明hello init函數(shù)是裝載該模塊時調(diào)用module exit hello exit 這個宏說明hello exit函數(shù)是卸載該模塊時調(diào)用也就是說 函數(shù)名字可以隨意 只要用module init和module exit宏說明即可 編譯模塊的Makefile obj m helloworld o 需要構(gòu)建的模塊名KDIR lib modules uname r buildPWD shellpwd EXTRA CFLAGS ggdbmodules MAKE C KDIR M PWD modules 多個文件 helloworld objs helloworld1 ohelloworld2 oobj m helloworld o 安裝模塊 編譯模塊只需make裝載模塊insmodhelloworld ko從此helloworld成為內(nèi)核的一部分卸載模塊rmmodhelloworldhelloworld從內(nèi)核中移除 看看發(fā)生了什么 通過dmesg命令查看內(nèi)核中的輸出 內(nèi)核編程的注意 無C語言提供的類庫 只能使用內(nèi)核函數(shù) 幸好一般的C函數(shù)在內(nèi)核中均有對應的內(nèi)核函數(shù) printf和printkfopen和filp open根據(jù)需要可以Google一下不能對用戶空間的數(shù)據(jù)直接操作 一般需要copy到內(nèi)核空間copy from usercopy to user 內(nèi)容 scull字符驅(qū)動 SimpleCharacterUtilityforLoadingLocalities 區(qū)域裝載的簡單字符工具操作內(nèi)存區(qū)域的字符設備驅(qū)動程序這片內(nèi)存區(qū)域就相當于一個設備該驅(qū)動不與硬件相關(guān) 學習驅(qū)動程序的極好例子 Scull初始化 設備號 內(nèi)核中用一個32位數(shù)保存設備編號dev t類型12位表示主設備號20位表示次設備號MKDEV intmajor intminor 將主次設備號轉(zhuǎn)化為dev t類型MAJOR dev tdev 得到主設備號MINOR dev tdev 得到次設備號 分配和釋放設備號 分配intregister chrdev region dev tfirst 分配的設備編號的起始值unsignedintcount 連續(xù)設備編號的個數(shù)char name 設備的名稱 出現(xiàn)在 proc decives和sysfs釋放voidunregister chrdev region dev tfirst 分配的設備編號的起始值unsignedingcount 連續(xù)設備編號的個數(shù) 操作設備 我們已經(jīng)知道 在Linux中對用戶來說操作設備和操作文件基本是一樣的 我們的驅(qū)動程序需要提供文件的相關(guān)操作的函數(shù) 填充file結(jié)構(gòu)中的file operations類型的f op字段 主要需要實現(xiàn)的函數(shù) structmodule owner指向擁有該結(jié)構(gòu)的指針 不是函數(shù) 其他的文件操作函數(shù)readwritellseek 自定義需要實現(xiàn)的函數(shù) 沒實現(xiàn)的在調(diào)用時系統(tǒng)會返回默認的錯誤 文件操作函數(shù)初始化 structfile operationsscull fops owner THIS MODULE llseek scull llseek read scull read write scull write ioctl scull ioctl open scull open release scull release 設備注冊 內(nèi)核內(nèi)部使用structcdev結(jié)構(gòu)表示字符設備 內(nèi)核調(diào)用設備操作之前 必須分配并注冊一個或多個以上cdev結(jié)構(gòu) scull內(nèi)部 用scull dev表示每個設備 structscull dev structscull qset data intqset structcdevcdev 初始化和添加cdev到系統(tǒng) 內(nèi)核和設備之間的接口cdev 必須要初始化并添加到系統(tǒng)中 devno MKDEV scull major scull minor index cdev init scull open intscull open structinode inode structfile filp structscull dev dev dev container of inode i cdev structscull dev cdev filp private data dev 用kmalloc函數(shù)在內(nèi)核申請內(nèi)存空間 用于驅(qū)動程序的數(shù)據(jù)存放 這個宏返回包含cdev類型的inode i cdev的scull dev指針 找到我們要操作的scull dev 保存到file結(jié)構(gòu)的private data字段方便我們以后讀寫等操作使用 scull read ssize tscull read structfile filpchar user buf size tcount loff t f pos structscull dev dev filp private datacopy to user buf dptr data s pos count 將驅(qū)動程序的數(shù)據(jù)拷貝到用戶空間 用到了在open函數(shù)中保存的設備指針 scull write ssize tscull write structfile filpchar user buf size tcount loff t f pos structscull dev dev filp private datacopy from user dptr data s pos buf count 將數(shù)據(jù)從用戶空間拷貝到驅(qū)動程序 測試該驅(qū)動程序 編寫用戶空間的程序 內(nèi)容 過濾驅(qū)動實現(xiàn)加解密 使用helloworld的基本模塊結(jié)構(gòu)編寫帶有加解密功能的read和write函數(shù) 與系統(tǒng)調(diào)用相同的函數(shù)原型 在模塊裝載的時候替換以下系統(tǒng)調(diào)用sys readsys write模塊卸載時恢復原來的系統(tǒng)調(diào)用用戶每處理一個加密文件均需裝載和卸載模塊一次 模塊初始化 獲得系統(tǒng)調(diào)用表的首地址sys call table getscTable 保存原來的系統(tǒng)調(diào)用函數(shù)orig read ssize t int void size t sys call table NR read 替換為帶有解密功能的函數(shù)sys call table NR read unsignedlong hacked read 注意 該函數(shù)需要自己編寫 解密函數(shù)hacked read 首先調(diào)用原來的讀文件 讀取文件數(shù)據(jù)判斷是否為要解密的文件if strcmp file f dentry d name name filename 如果是copy from user data buf buf count Decryption key data buf count copy to user buf data buf count 加密函數(shù)hacked write 在將內(nèi)容寫到文件中時加密判斷是否為要解密的文件if strcmp file f dentry d name name filename 如果是copy from user data buf buf count Encrypt key data buf count copy to user buf data buf count 調(diào)用原來的寫函數(shù) 寫到文件 卸載模塊 替換系統(tǒng)調(diào)用原來的函數(shù)sys call table NR read unsignedlong orig read sys call table NR write unsignedlong orig write 傳入?yún)?shù) 由于加密對用戶透明如何輸入需要處理的文件名 如何輸入加解密的密碼 模塊加載時 是可以傳入?yún)?shù)的 staticchar key world staticchar filename ttt c module param key charp S IRUGO module param filename charp S IRUGO 模塊的測試 make 生成過濾驅(qū)動模塊insmodencryption kokey XX filename test c vitest crmmodencryptionvitest c 與驅(qū)動相關(guān)的其他實驗 利用動態(tài)加載內(nèi)核模塊將特定功能函數(shù)插入open及close系統(tǒng)調(diào)用處理過程 以記錄用戶對資源的使用信息可類同于過濾驅(qū)動的實現(xiàn) 將open和close系統(tǒng)調(diào)用替換 并統(tǒng)計相關(guān)的信息 設計一個驅(qū)動程序?qū)崿F(xiàn)有名管道 類似于scull驅(qū)動程序 但是要按照有名管道的規(guī)則加強讀寫的控制 謝謝 Thankyouverymuch- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 淺談 Linux 驅(qū)動程序 final 鄭重
鏈接地址:http://ioszen.com/p-8591542.html