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