Linux设备驱动开发-1 内核模块的概念.docVIP

  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设备驱动程序① -Hello, world!模块 ? Linux设备驱动程序的第一个例程: /* * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ */ #include linux/init.h #include linux/module.h MODULE_LICENSE(Dual BSD/GPL); static int hello_init(void) { printk(Hello, world\n); return 0; } static void hello_exit(void) { printk(Goodbye, cruel world\n); } module_init(hello_init); module_exit(hello_exit); 我将其复制到我的工作目录,并编写了一个简单的Makefile文件: obj-m :=hello.o CROSS_COMPILE = arm-linux- CC = $(CROSS_COMPILE)gcc KDIR :=/work/kernel/linux-2.6.14 #KDIR :=/lib/modules/2.6.21-1.3194.fc7/build PWD :=$(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.o* *~ core .depend .*.cmd *.ko *.mod.c rm -rf .tmp_versions/ install: cp *.ko /work/rootfile/rootfs/lib/modules/2.6.14/ 在我的开发板上的操作: [root@NEU/]# insmod /lib/modules/2.6.14/hello.ko Hello, world [root@NEU/]# lsmod hello 1024 0 - Live 0xbf000000 [root@NEU/]# rmmod hello Goodbye, world [root@NEU/]# lsmod [root@NEU/]# 学习心得: (1)驱动模块运行在内核空间,运行时不能依赖于用户空间的任何函数库和模块连接,所以在写驱动时所调用的函数只能是作为内核一部分的函数,或者说只能调用内核的API函数。 (2)驱动模块和应用程序的一个重要不同是:应用程序退出时可不管资源释放或者其他的清除工作,但模块的退出函数必须仔细撤销初始化函数所作的一切,否则,在系统重新引导之前某些东西就会残留在系统中。 (3)处理器的多种工作模式(级别)其实就是为了操作系统的用户空间和内核空间设计的。在Unix类的操作系统中只用到了两个级别:最高和最低级别。 (4)要十分注意驱动程序的并发处理。 (5)内核API中具有双下划线(_ _)的函数,通常是接口的底层组件,应慎用。 (6)内核代码不能实现浮点数运算。 (7)Makefile文件分析: obj-m := hello.o? 代表了我们要构造的模块名为hell.ko,make 会在该目录下自动找到hello.c文件进行编译。 如果 hello.o是由其他的源文件生成(比如file1.c和file2.c)的,则在下面加上(注意红色字体的对应关系): hello-objs := file1.o file2.o ...... ??? $(MAKE) -C $(KDIR) M=$(PWD) modules 其中 -C $(KDIR) 指定了内核源代码的位置,其中保存有内核的顶层makefile文件。而且zImage一定要编译出来,否则编译模块化得驱动的时候会有错误。 ??? M=$(PWD)?指定了模块源代码的位置 (8)所有模块代码中都包含一下两个头文件: #include linux/init.h #include linux/module.h (9)所有模块代码都应该指定所使用的许可证: MODULE_LICENSE(Dual BSD/GPL); 此外还有可选的其他描述性定义: MODULE_AUTHOR(); MODULE_DESCRIPTION(); MODULE_VERSION(); MODULE_ALIAS(); MODULE_DEVICE_TABLE(); 上述MODULE_声明习惯上放在文件最后。

文档评论(0)

小教资源库 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档