- 1、本文档共71页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Driver 核心模组vs 应用程式 - 网路前瞻技术实验室
Driver 核心模組 vs 應用程式 應用程式啟動後從頭到尾都只執行同一件任務. 模組被載入核心之後必須先向核心註冊它自己. ?init_module()函式(模組的入口點)任務是將模組的功能準備好 以便事後可被invocation(調用). ?cleanup_module()在模組離開之前必須要被呼叫. 模組只能與核心連結所以模組只能呼叫核心所提供的程式 ex: printfk(). 由於上一點,模組的原始碼不能引入一般的標頭檔. ?有關核心相關事物放在 /usr/src/linux下的 include/linux 與 include/asm/ 目錄下的標頭檔. 使用者空間與核心空間 模組存活在kernel space(核心空間)而應用程式存在user space(使用者空間). 作業系統必須負責讓程式得以獨立運作並保護系統資源避免非授權的存取. 由CPU來保護系統軟體所以CPU本身提供了不同層級的作業模式(operating modality). Unix系統提供兩個層級而現在CPU也至少有兩種層級,故Unix系統只使用最高與最低層級,Unix核心運作在最高層級(supervisor mode)應用程式運作在最低層級(user mode). execution mode:包括kernel-space 與user-space分別有各自的memory mapping(記憶體對應關係)的關係與各自的address space(定址空間). insmod 載入 ?insmod對模組的作用:將模組內的任何unresolved symbol(懸置 符號)連結到目前核心(函式庫)的符號表. ?核心如何支援insmod? 依賴定義在kernel/module.c的system call函式: 1) sys_create_module():配置一塊可以容納模組的核心記憶空間. 2) sys_get_kernel_syms():傳回核心符號表,解決模組的懸置符號. 3) sys_init_module():將insmod改好的relocated object code移到 預先配置的核心空間. 系統呼叫大略表: kernel/ 目錄執行 egrep “sys_.*\)$” *.c 版本依存性 模組與連結對象核心息息相關每當升級何新版本時模組就必須再新版本核心下重新編譯一次. 編譯器會在ELF(executable Linking and Format).的.modifo(chap 11)區定義_module_kernel_version符號 insmod會依照此符號與當時的核心作比較. 定義在linux/module.h. 可使用insmod –f來略過版本檢查. 針對特定版本的核心來編譯模組必須引入該版本核心的標頭檔?再Makefile定義一個KERNELDIR環境變數讓他指另一個不同的位置. 核心符號表 模組化驅動程式所需的[核心全域項目(函式與變數)]的位置都紀錄在符號表裡 可從/proc/ksyms取的此表. 若模組能被順利載入核心,模組所釋放的符號也會成為核心符號的一部分. 模組所釋出的符號可以被新模組使用?新模組可以疊在其他模組之上. ex: msdos檔案系統得仰賴fat模組所釋出的符號 模組的生與死 init_module()會註冊模組所提供的任何facility(功能性). 模組可以註冊許多不同類型的facility,對於每一個facility都有一個特定的核心函式來完成其註冊程序. 傳給核心註冊函式的引數:facility註冊名稱,指標(指向此facility的資料結構). facility種類:序列阜,雜項裝置,/proc檔案,作業領域(executable domain),管制線路(line discipline). Init_module的錯誤處置 註冊失敗:系統沒有足夠空間或某資源已被其他驅動程式佔用… 模組自己要負責回復(undo)到註冊失敗之前的狀態,如果init_module()在中途失敗,模組必須自己主動註銷(unregister)那些已經註冊成功的facility. 不能藉由重新載入模組來重新註冊facility,也不太可能註銷他們,因為需要當初註冊所用的相同指標. 使用goto解決. 卸載模組 使用rmmod可卸載(unload)沒用的模組. 原理: rmmod觸發delete_module() system call,如果模組的用量為零,則delete_module()會呼叫模組本身的cleanup_module(
您可能关注的文档
- Cisco WebEx Meetings Server 常见问题解答15 发行版.PDF
- CING天然气展邀请函 - 中国国际天然气技术装备展览会.DOC
- Cayin CDT-17A MK2 钻石版评测 - Cayin 专注发烧音响.PDF
- CJO - 高雄第一科技大学图书馆 - 第一科大.PPT
- Citysphere 安装服务手册 - 欢迎来到Spheros!.PDF
- Claim Form - 中国平安保险.PDF
- CAD2CRASH24: 驱动整车碰撞分析降低到24 小时 - PBS Works.PDF
- CM-230K电导率仪电子版说明书.DOC
- CN-0359:全自动高性能电导率测量系统 - Analog Devices.PDF
- CNG 双燃料车辆安全管理系统项目技术建议方案 - 浩海易通科技(北京).PDF
文档评论(0)