欢迎来到天天文库
浏览记录
ID:9336532
大小:33.27 KB
页数:12页
时间:2018-04-28
《嵌入式linux内核模块的配置与编译》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式Linux内核模块的配置与编译一、简介 随着Linux操作系统在嵌入式领域的快速发展,越来越多的人开始投身到这方面的开发中来。但是,面对庞大的Linux内核源代码,开发者如何开始自己的开发工作,在完成自己的代码后,该如何编译测试,以及如何将自己的代码编译进内核中,所有的这些问题都直接和Linux的驱动的编译以及Linux的内核配置系统相关。 内核模块是一些在操作系统内核需要时载入和执行的代码,它们扩展了操作系统内核的功能却不需要重新启动系统,在不需要时可以被操作系统卸载,又节约了系统的资源占用。设备驱动程序模块就是一种内核模块,它们可以
2、用来让操作系统正确识别和使用使用安装在系统上的硬件设备。 Linux内核是由分布在全球的Linux爱好者共同开发的,为了方便开发者修改内核,Linux的内核采用了模块化的内核配置系统,从而保证内核扩展的简单与方便。 本文通过一个简单的示例,首先介绍了如何在Linux下编译出一个内核模块,然后介绍了Linux内核中的配置系统,讲述了如何将一个自定义的模块作为系统源码的一部分编译出新的操作系统,注意,在这里我们介绍的内容均在内核2.6.13.2(也是笔者的开发平台的版本)上编译运行通过,在2.6.*的版本上基本上是可以通用的。 二、单独编译内
3、核模块 首先,我们先来写一个最简单的内核模块: #include #include #include #defineDRIVER_VERSION"v1.0" #defineDRIVER_AUTHOR"RF" #defineDRIVER_DESC"justfortest" MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICE
4、NSE("GPL"); staticintrfmodule_init(void) { printk("hello,world:modele_init"); return0; } staticvoidrfmodule_exit(void) { printk("hello,world:modele_exit"); } module_init(rfmodule_init); module_exit(rfmodule_exit); 这个内核模块除了在载入和卸载的时候打印2条信息之外,没有任何其
5、他功能,不过,对于我们这个编译的例子来讲,已经足够了。 将上述源代码保存到一个test.c文件中,然后开始我们的内核模块的编译工作。 内核模块的编译与普通应用程序的编译一样,也使用的GCC,但是内核模块在用GCC编译的时候时需要使用特定的参数并定义一些宏。这是因为在编译普通应用程序的可执行文件和内核模块时,内核头文件起的作用是不同的。在以往的内核版本需要我们去在Makefile中手动设置这些设定,虽然这些Makefile都是按目录分层次存放的,但使用维护起来还是比较伏在。幸运的是,一种称为kbuild的新方法被引入,现在外部的可加载内核模块的
6、编译的方法已经同内核编译统一起来,编译新的内核模块或者将自己的内核模块集成到内核源码中都已经变得非常简单了。 现在让我们看一下如何编译一个名字叫做test.c的模块。 首先,我们需要写一个简单的Makefile文件: obj-m+=test.o 将test.c和Makefile文件放在同一个目录下,然后就可以开始编译了,使用编译命令: make-C/usr/src/linux-2.6.13.2/SUBDIRS=$PWDmodules 回车后,也许你会发现有一堆的报错,请检查如下配置是否正确: 1、在/usr/src/下有无
7、放置你需要使用的内核源码树?如果没有,请上网down一个你需要的内核源码版本,解压后放在这里。 2、如果你已经将内核源码解压在/usr/src/下了,那么请先使用在内核源码的主目录下,在笔者的系统中就是/usr/src/linux-2.6.13.2/,使用: makeconfig或者makemenuconfig或者makegconfig等命令来配置内核,然后使用makeall将整个内核完整编译一次。 3、上述命令中的linux-2.6.13.2是笔者使用的内核源码的目录名,你需要将它改成你自己使用对应版本的的内核源码的目录名。 经过上
8、述三步,一般来将,该内核模块都可以编译通过了,生成的test.ko就是我们需要的内核模块的最终版本,你可以使
此文档下载收益归作者所有