谈一谈linu驱动分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
应用程序与驱动程序通过设备文件进行通信 每个设备文件都有主设备号与次设备号 主设备号表示设备的类型 次设备号表示具体的设备 在内核中 就是根据主设备号来调用相应的驱动程序 驱动根据次设备号分辩具体设备以区分操作 主设备号由 linux 统一分配 但是也可以使用临时设备 在注册驱动时把主设备号输入为 0 则由内核自动分配 设备的类型: 主要类型有下面三种 字符设备:它的保存是以字符流的形式保存 块设备:它的保存是以块为单位保存,提供和字符驱动一样的接口,当然有自己块操作的接口,如 mount,同时支持像字符设备那样的访问方式, 上面两个都是映射到一个设备文件,设备文件通常保存在/dev/目录下,当然你可以保存在任意地方 网络接口:用于进行网络通信,可能针对某个硬件,如网卡,或是纯软件,如 loopback,网络接口只是面向数据包而不是数据流,所以内核的处理也不同,没有映射成任何设备文件,而是按 unix 标准给它们分配一个唯一的名字 驱动开发时注意点: 只提供机制,不限制策略,调用者可以按照自己的要求自己订制策略 权限的判断, 应该尽量让系统管理员决定而不是在驱动中指定,除非这个设备对整个系统有影响 安全编程,从用户进程得到的输入必须检查,返回给用户进程的内存必须初始化(如果这块内存刚好保存 口令信息 或是其它就会破坏系统安全性) 内核不连接 libc,所以不可以使用 libc 里面的函数 如 printf 等,必须使用内核自己提供的函数,如果你不 知道有哪些函数,那看看内核头文件是不错的选择 避免名字空间污染,不需要输出的符号就不输出 如果你的符号被其它模块引用,那使用EXPORT_SYMBLE 声明被输出,要输出的模块最好加上模块名前缀 避免冲突 . 不对外开放的使用 static 限制在本地使用 注意可重入性问题,必须考虑到执行到某步时任务切换或是中断处理时应该怎样处理. 在 2.6 下开发简单的驱动 2.6 驱动的开发相对以前各版本来说有了很大的改变 先是初始化与退出函数 以前使用init_module 函数来声明模块初始化过程 使用cleanup_module 来定义模块退出时的清除过程而在 2.6 中 必须使用 module_init 标志来说明初始化函数 使用 module_exit 来说明清理函数 在 2.4 中,可以单独编译一个模块 而在 2.6 中,一个模块的编译,必须编译全部所有模块 下面是一个 2.6 内核的模板#define MODULE #include linux/module.h #include linux/config.h #include linux/init.h static int init name_of_initialization_routine(void) { /* * code here */ } static void exit name_of_cleanup_routine(void) { /* * code here */ } module_init(name_of_initialization_routine); module_exit(name_of_cleanup_routine); MODULE 宏也不再是必须的了,在编译时可不定义 编译过程的区别 2.4 的编译过程如下 gcc -D KERNEL -DMODULE -I/usr/src/linux-2.4.21/include -O2 -c testmod.c 要定义 KERNEL 是因为在内核头文件中,某些符号只在定义这个宏后才会公开 2.6 的编译过程 写一个简单的 Makefile 只有一行 obj-m := testmod.o 然后使用如下命令编译 make -C /usr/src/linux-2.6.1 SUBDIRS=$WD modules $WD 是你的内核模块所在的目录 使用如上命令时会自动重编译系统的内核模块与你的模块所以 保存内核源目录中的版本号与配置文件与你当前运行内核相同是必要的 一个简单的例子: testmod.c #define MODULE #include linux/module.h #include linux/config.h #include linux/init.h static int init testmod_init(void) { printk(1hello world\n); return 0; } static void exit testmod_cleanup(void) { printk(1exit module\n); } module_init(testmod_init); module_exit(testmod_cleanup);

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档