欢迎来到天天文库
浏览记录
ID:26491345
大小:68.00 KB
页数:13页
时间:2018-11-27
《内核编程实验》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、内核编程实验:hello.c《Linux设备驱动程序》 内核编程入门,就以最为简单的hello.c为例。 环境:Redhat9.0,内核版本2.4.20-8。 虽然现在2.6.x的内核很早就就发布了,但是毕竟很多公司还在使用2.4.x的内核。作为新手,从2.4.x的内核入手是可行的。原因有如下几条: (1)2.4.x比较成熟。可能你遇到的绝大多数问题,网上都有解决方案。在这个过程中,你可以节省大量的时间,同时还可以对比网上的解决方案,加深认识,总结解决问题的方法,调整自己的学习方法和思路。 (2)事物的发展总不可能是一蹴而就
2、的。了解发展的历程,对深入理解问题有很大的好处。所以在2.4.x的内核的基础上学习2.6.x的内核,就能够体会到2.6.x的内核在哪些方面要出色,或者为什么要采取这种改进技术。相信理论清晰了,即时2.6.x的内核也会容易上手。 下面总结了第一个内核程序hello.c的学习过程。 (一)第一阶段:尽量简单 /* *hello.c */#defineMODULE#includeintinit_module(void){ printk("HelloWorld!"); return0;}
3、voidcleanup_module(void){ printk("Goodbye!");}执行,出现错误一:[root@lqmdrivers]#gcc-chello.c[root@lqmdrivers]#insmodhello.ohello.o:kernel-moduleversionmismatch hello.owascompiledforkernelversion2.4.20 whilethiskernelisversion2.4.20-8. 这是因为内核源代码版本和编译器版本不一致造成的。
4、(1)编译器版本/usr/include/linux/version.h#defineUTS_RELEASE"2.4.20"#defineLINUX_VERSION_CODE132116#defineKERNEL_VERSION(a,b,c)(((a)<<16)+((b)<<8)+(c))(2)内核源代码版本/usr/src/linux-2.4.20-8/include/linux/version.h/usr/src/linux-2.4.20-8/include/linux[root@lqmlinux]#catversion.h#include5、inux/rhconfig.h>#ifdefined(__module__smp)#defineUTS_RELEASE"2.4.20-8smp"#elifdefined(__module__BOOT)#defineUTS_RELEASE"2.4.20-8BOOT"#elifdefined(__module__bigmem)#defineUTS_RELEASE"2.4.20-8bigmem"#else#defineUTS_RELEASE"2.4.20-8"#endif#defineLINUX_VERSION_CODE132116#defineKERN6、EL_VERSION(a,b,c)(((a)<<16)+((b)<<8)+(c)) 可以采取修改编译器版本号与内核源代码版本号一致的办法来解决这个问题,即修改/usr/include/linux/version.h中#defineUTS_RELEASE"2.4.20"为#defineUTS_RELEASE"2.4.20-8"执行,出现错误二:[root@lqmdrivers]#gcc-chello.c[root@lqmdrivers]#insmodhello.oWarning:loadinghello.owilltaintthekernel:no7、license Seehttp://www.tux.org/lkml/#export-taintedforinformationabouttaintedmodulesModulehelloloaded,withwarnings[root@lqmdrivers]#tail-n1/var/log/messagesJan3012:02:08lqmkernel:Hello 也就是说出现了nolicense的警告。GNU的软件需要有GPL,所以修改源代码如下:/* *hello.c */#defineMODULE#include8、le.h>MODULE_LICENSE("GPL");intinit_module(void){ print
5、inux/rhconfig.h>#ifdefined(__module__smp)#defineUTS_RELEASE"2.4.20-8smp"#elifdefined(__module__BOOT)#defineUTS_RELEASE"2.4.20-8BOOT"#elifdefined(__module__bigmem)#defineUTS_RELEASE"2.4.20-8bigmem"#else#defineUTS_RELEASE"2.4.20-8"#endif#defineLINUX_VERSION_CODE132116#defineKERN
6、EL_VERSION(a,b,c)(((a)<<16)+((b)<<8)+(c)) 可以采取修改编译器版本号与内核源代码版本号一致的办法来解决这个问题,即修改/usr/include/linux/version.h中#defineUTS_RELEASE"2.4.20"为#defineUTS_RELEASE"2.4.20-8"执行,出现错误二:[root@lqmdrivers]#gcc-chello.c[root@lqmdrivers]#insmodhello.oWarning:loadinghello.owilltaintthekernel:no
7、license Seehttp://www.tux.org/lkml/#export-taintedforinformationabouttaintedmodulesModulehelloloaded,withwarnings[root@lqmdrivers]#tail-n1/var/log/messagesJan3012:02:08lqmkernel:Hello 也就是说出现了nolicense的警告。GNU的软件需要有GPL,所以修改源代码如下:/* *hello.c */#defineMODULE#include8、le.h>MODULE_LICENSE("GPL");intinit_module(void){ print
8、le.h>MODULE_LICENSE("GPL");intinit_module(void){ print
此文档下载收益归作者所有