ChapLinux设备驱动程序PPT学习教案_第1页
ChapLinux设备驱动程序PPT学习教案_第2页
ChapLinux设备驱动程序PPT学习教案_第3页
ChapLinux设备驱动程序PPT学习教案_第4页
ChapLinux设备驱动程序PPT学习教案_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1ChapLinux设备驱动程序设备驱动程序第1页/共110页设备和使外设正常工作所需BIOS文件的集合。第2页/共110页第3页/共110页第4页/共110页式第5页/共110页第6页/共110页第7页/共110页n第8页/共110页第9页/共110页第10页/共110页第11页/共110页第12页/共110页第13页/共110页第14页/共110页第15页/共110页第16页/共110页第17页/共110页第18页/共110页第19页/共110页第20页/共110页第21页/共110页第22页/共110页第23页/共110页第24页/共110页层细节隐藏起来,提高了软件的可移植性第2

2、5页/共110页第26页/共110页第27页/共110页n级灵活第28页/共110页第29页/共110页第30页/共110页第31页/共110页第32页/共110页第33页/共110页第34页/共110页第35页/共110页第36页/共110页第37页/共110页第38页/共110页kmalloc()第39页/共110页第40页/共110页第41页/共110页第42页/共110页第43页/共110页第44页/共110页nvoid unregister_netdev(struct device *dev);第45页/共110页第46页/共110页第47页/共110页第48页/共110页第49页/

3、共110页第50页/共110页第51页/共110页第52页/共110页第53页/共110页用户程序系统调用接口文件系统高速缓存字符设备块设备驱动程序硬件设备第54页/共110页用户进程用户进程设备无关软件设备无关软件设备设备驱动驱动程序程序设备服务子程序设备服务子程序中断处理程序中断处理程序硬件硬件I/O请求请求I/O应答应答进行进行I/O调用;调用;格式化格式化I/O命名、保护、阻塞、缓命名、保护、阻塞、缓冲、分配冲、分配建立设备寄存器、检测建立设备寄存器、检测状态状态I/O结束时,唤醒设备结束时,唤醒设备服务子程序服务子程序执行执行I/O操作操作第55页/共110页第56页/共110页第5

4、7页/共110页第58页/共110页第59页/共110页第60页/共110页第61页/共110页第62页/共110页第63页/共110页第64页/共110页第65页/共110页第66页/共110页第67页/共110页第68页/共110页第69页/共110页第70页/共110页第71页/共110页第72页/共110页第73页/共110页第74页/共110页第75页/共110页第76页/共110页第77页/共110页第78页/共110页第79页/共110页第80页/共110页第81页/共110页第82页/共110页模块之间的函数调用 内核可以使用其它模块或内核的函数,也可以export一些函数供其

5、他模块或内核使用。 模块栈:如果模块A使用了模块B的函数,那么B必须在A之前加载,否则加载A的命令不成功。模块可以使用的函数: 自身定义; 其他module提供; 内核提供命令ksyms a:列出已经加载的模块的函数或变量。Symbol table:记录module导出的函数或变量。所有声明为global的函数或变量都意味着被导出,可以被其他模块使用。第83页/共110页第84页/共110页第85页/共110页第86页/共110页第87页/共110页内核模块必须有两个函数: int init_module():为内核中的某些东西注册一个句柄,或者把内核中的程序提换成它自己的代码(通常是进行一些

6、工作以后再调用原来工作的代码)。 void clean_module():模块要求撤销init_module进行的所有修改,使得模块可以被安全的卸载。 在insmod和rmmod命令中使用这两个函数。Use count:记录使用本模块的进程数或模块数。 MOD_INC_USE_COUNT:增加use count MOD_DEC_USE_COUNT:减少use count MOD_IN_USE:检查use count是否是0第88页/共110页第89页/共110页struct symbol_table int size; /* 包括string table的总长度 */int n_symbols

7、; int n_refs;struct internal_symbol symbol0; struct module_ref ref0; ; 后面定义的是两个零大小的数组声明,便于动态分配空间。 symbol包含一组字符串指针,指向真正的符号字符串表第90页/共110页struct internal_symbol /*符号信息*/void *addr;const char *name; /*指向string table*/;struct module_ref /*引用信息*/struct module *module;struct module_ref *next;string table的内

8、容是该模块导出的函数名和变量名第91页/共110页nextrefsizenamesymboladdrcleanupstatemodulemodulescodesizen_symbolsn_refsaddraddrmodulenamenamenextnextmodulesymbol_tableinternal_symbol 结构module_ref 结构string tablename ishere图图1 1 m mo od du ul le e与与s sy ym mb bo ol l_ _t ta ab bl le e的的结结构构示示意意图图第92页/共110页第93页/共110页核心空间in

9、smod用户进程空间Mymodule目标文件kernelmodulekernelsymbolmoduleAsymbolAkernel_sym结构MymoduleMymoduleMysymbol磁盘内存1234图图 i in ns sm mo od d M My ym mo od du ul le e的的过过程程第94页/共110页insmod先调用系统调用sys_get_kernel_syms,将当前加到系统中的模块和核心的符号表全部输出到kernel_sym结构中,为后面使用。这个结构的内容在insmod用户进程空间。将Mymodule目标文件读进insmod用户进程空间,成为一个映像。根据

10、第一步得到的信息,将Mymodule映像中的地址没有确定的函数和变量一一修正过来。调用系统调用sys_create_module、sys_init_module,将Mymodule链入到系统中去。 第95页/共110页第96页/共110页第97页/共110页第98页/共110页第99页/共110页sys_setup()device_setup()chr_dev_init()/blk_dev_init()Kernel_thread()init()setup()第100页/共110页第101页/共110页第102页/共110页 释放设备:release() 递减设备使用的计数器 释放设备文件中的私有数据所占空间 如果是独占设备,则要清除忙标志,使其他进程可以使用 如果是最后一个释放,则关闭设备第103页/共110页第104页/共110页第105页/共110页第106页/共110页第107页/共110页将该设备私有的将该设备私有的*.c,*.h复制到目录复制到目录drivers/char下。下。用命令:用命令:make clean;make dep;m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论