Linux驱动程序编写复习.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux驱动程序编写复习

* 使内存更加紧凑和灵活。 ? 修改内存时,不必全部重新编译内核,可节省时间。系统中如果需要使用新模块 ,只要编译相应的模块然后使用特定的程序将模块插入即可。 ? 模块可以不依赖于某个固定的硬件平台,即使它依赖于某些特殊的硬件特点。 ? 模块的目标代码一旦被链接到内核,它的作用和静态链接的内核目标代码完全等 价。所以当调用模块的函数时,无需显示的消息传递。 * 因为这两个宏将被扩展为一个特殊变量的声明,该变量必须是全局的。 * 上面已经说过,其实关于模块的操作(如 加载、卸载、查看等)通过两个helloworld的例子已经十分清楚和明了了。再这个题目中 关于内核模块的只是还是那些,但因为这个题目涉及到/proc文件的应用,所以还是很有意 思的。 * 模块程序编译方法的改变 ? ? ? Linux2.4中模块程序(就是欲做为内核模块加载进内核的程序)的编译方法与一般 的程序并没有什么不同,仅仅需要多加几个参数用以标识该程序要作为模块使用。如用C程 序编写的程序就可以用gcc进行编译。 ? 一般的命令为:gcc –Wall –DMODULE –D__KERNEL__ -DLINUX –c 源文件名.c ? 其中: ? ? ? __KERNEL__: ? ?即告诉头文件这些代码将在内核模式下运行。 ? ? ?MODULE: ? ? ? 即告诉头文件要给出适当的内核模块的定义。 ? ? ? LINUX: ? ? ? ? 并非必要,用在写一系列要在不止一个的操作系统上编译模块。 ? ? ? -Wall: ? ? ? ? ? 显示所有warning信息。 ? 而在Linux2.6中这种编译方式已经行不通了。要编译模块程序,就必须写makefile。通 过make命令来编译程序。这就引出了下面一个问题。 ? Makefile写法的改变 在Linux2.4中编译内核文件也可以用makefile的方法,但Linux2.6中makefile的写法已经 发生了较大的变化: Linux2.4中makefile的写法:(以helloworld为例) ? //Makefile ? CC=gcc ? MODCFLAGS:=-Wall –DMODULE -__KERNEL__ -DLINUX ? helloworld.o:helloworld.c /usr/include/linux/version.h ? $(CC) $(MODCFLAGS) –c helloworld.c ? echo insmod helloworld.o to turn it on ? echo rmmod helloworld to turn it off ? echo Linux2.6中makefile的写法:(以helloworld为例) //Makefile obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 注意:这里这里all:下一行的其实为一个“Tab”键,不要写成空格或略去,不然系统无 法识别,报错:nothing to be done for “all”。 * Linux驱动 Linux内核模块的优点与缺点 优点 使得内核更加紧凑和灵活 修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可 模块的目标代码一旦被链接到内核,它的作用域和静态链接的内核目标代码完全等价 缺点 由于内核所占用的内存是不会被换出的,所以链接进内核的模块会给整个系统带来一定的性能和内存利用方面的损失; 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃; 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装入和卸载模块时修改符号表; 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性. Linux内核模块与应用程序的区别 C语言程序 Linux内核模块 运行 用户空间 内核空间 入口 main() module_init()指定; 出口 无 module_exit()指定; 编译 gcc –c Makefile 连接 ld insmod 运行 直接运行 insmod 调试

文档评论(0)

整理王 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档