首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux内核的配备机制及其编译过程

2012-06-22 
linux内核的配置机制及其编译过程。linux内核的配置机制及其编译过程。或者通过 make ARCHarm menuconfig命

linux内核的配置机制及其编译过程。

linux内核的配置机制及其编译过程。


或者通过 make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的

    比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arm/arm/kconfig文件生成配置选项(选择了arm科的卷子),系统还提供了x86科、milps科等10几门功课的考试题


3)假设教务处比较“仁慈”,为了怕某些同学做不错试题,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:

linux内核的配备机制及其编译过程

    此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)

#cp arch/arm/configs/s3c2410_defconfig .config

4).config

    假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项

    但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.

5)经过以上两步,我们可以正确的读取、配置我们需要的界面了

那么他们如何跟makefile文件建立编译关系呢?

当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在

Linux内核根目录下的 include/generated/autoconf.h文件下

linux内核的配备机制及其编译过程

内核中的源代码就都会包含以上.h文件,跟宏的定义情况进行条件编译。

当我们需要对一个文件整体选择如是否编译时,还需要修改对应的makefile文件,例如:

linux内核的配备机制及其编译过程

    我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。

    最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件。

    比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其声称过程

    首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;

    其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;

    最后修改对应目录下的makefile文件完成编译选项的添加;

    最后的最后执行make zImage命令进行编译。

三、具体实例

下面我们以前面做过的模块实验为例,讲解如何通过make menuconfig机制将前面单独编译的模块编译进内核或编译为模块

假设我已经有了这么一个驱动:

modules.c

[cpp] view plaincopyprint?
  1. #include <linux/module.h>       /*module_init()*/  #include <linux/kernel.h> /* printk() */  
  2. #include <linux/init.h>       /* __init __exit */    
  3. #define DEBUG   //open debug message    
  4. #ifdef DEBUG  #define PRINTK(fmt, arg...)     printk(KERN_WARNING fmt, ##arg)  
  5. #else  #define PRINTK(fmt, arg...)     printk(KERN_DEBUG fmt, ##arg)  
  6. #endif    
  7. /* Module Init & Exit function */  static int __init myModule_init(void)  
  8. {      /* Module init code */  
  9.     PRINTK("myModule_init\n");      return 0;  
  10. }    
  11. static void __exit myModule_exit(void)  {  
  12.     /* Module exit code */      PRINTK("myModule_exit\n");  
  13.     return;  }  
  14.   module_init(myModule_init);  
  15. module_exit(myModule_exit);    
  16. MODULE_AUTHOR("dengwei");                          /*模块作者,可选*/  MODULE_LICENSE("GPL");                             /*模块许可证明,描述内核模块的许可权限,必须*/  
  17. MODULE_DESCRIPTION("A simple Hello World Module"); /*模块说明,可选*/  

Step1:将modules.c拷到drivers/char/目录下(这个文件夹一般存放常见的字符驱动)
Step2: vi driver/char/Kconfig,在    config DEVKMEM后添加以下信息
config MODULES
tristate "modules device support"
default y
help
 Say Y here,the modules will be build in kernel.
 Say M here,the modules willbe build to modules.
 Say N here,there will be nothing to be do. 

Step3:make menuconfig      Device driver-character devices           [*]modules device suppor
Step4:vi driver/char/Makefile,在js-rtc后添加obj-$(CONFIG_MODULES)+= modules.o
CONFIG_MODULES 必须跟上面的Kconfig中保持一致,系统会自动添加CONFIG_前缀

modules.o必须跟你加入的.c文件名一致

最后执行:make zImage modules就会被编译进内核中


第三步:

Step3:make menuconfig     Device driver-character devices           [M]modules device suppor把星号在配置界面通过空格改为M,最后执行make modules,在driver/char/目录下会生成一个modules.ko文件

跟我们前面讲的单独编译模块效果一样,也会生成一个模块,将它考入开发板执行insmod moudles.ko,即可将生成的模块插入内核使用

热点排行