zoukankan      html  css  js  c++  java
  • 【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109

    为了弄清内核的组织结构,我们先来实现下面这个简单的例子。

    一、增加内核启动Hello World

    任务:

    内核启动的时候加载Hello驱动,并打印出Hello World

    步骤:

    (1)在drivers目录下新建hello文件夹,在里面实现相应的hello.c、Makefile、Kconfig

    (2)修改上一级(Linux-3.4.2/drivers下)的Makefile、Kconfig

    (3)make menuconfig 进行配置

    (4)编译、烧写、运行

    实现:

    (1)实现驱动程序hello.c

    最简单的驱动程序

    [cpp] view plain copy
     
     print?
    1. #include <linux/module.h>  
    2. #include <linux/kernel.h>  
    3. #include <linux/init.h>  
    4. #include <linux/delay.h>  
    5. static int first_drv_init(void)  
    6. {  
    7.     printk("------------------hello world !--------------------");  
    8.     return 0;  
    9. }  
    10.   
    11. static void first_drv_exit(void)  
    12. {  
    13.     printk("------------------exit hello world !--------------------");  
    14. }  
    15.   
    16. module_init(first_drv_init);  
    17. module_exit(first_drv_exit);  
    18.   
    19.   
    20. MODULE_LICENSE("GPL");  

    (2)实现hello/Makefile

    [cpp] view plain copy
     
     print?
    1. # LED Core  
    2. obj-$(CONFIG_HELLO)         += hello.o  

    注意这里的CONFIG_HELLO,是在.config中定义的,如果配置编译进内核,则在.config中出现CONFIG_HELLO=y,那么hello.o就会被编译进内核。

    (3)实现hello/Kconfig

    [cpp] view plain copy
     
     print?
    1. config HELLO  
    2.     tristate "Hello World for fengyuwuzu"  
    3.     help  
    4.       Hello  for fengyuwuzu  

    config HELLO决定了CONFIG_HELLO这个名字

    Hello World for fengyuwuzu:决定了在make menuconfig时的GUI名字

    (4)修改drivers/Makefile,增加:

    [cpp] view plain copy
     
     print?
    1. obj-y                           += myled/  

    (5)修改drivers/Kconfig,增加:

    [cpp] view plain copy
     
     print?
    1. source "drivers/myled/Kconfig"  

    (6)make menuconfig配置相应项进内核




    (7)make uImage

    (8)烧写新内核启动

    看到"------------------hello world !--------------------"被打印,及相应的驱动被加载。

    二、linux内核中Makefile、Kconfig、.config的关系

    (1)三者的作用

    简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜

    Makefile:一个文本形式的文件,编译源文件的方法。

    Kconfig:一个文本形式的文件,内核的配置菜单。

    .config:编译所依据的配置。

    (2)三者的语法

    1、Makefile

    目标定义:目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。

    直接编译:

    obj-y      += hello.o

    表示要由hello.c或者hello.s文件编译得到hello.o并链接进内核

    而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式 :

    条件编译:

    obj-$(CONFIG_HELLO) += hello.o

    obj-m则表示该文件要作为模块编译。

    除了y,m以外的obj-x形式的目标都不会被编译。

    2、Kconfig

    类型定义: 

    每个config菜单项都要有类型定义: bool布尔类型、 tristate三态(内建、模块、移除)、string字符串、 hex十六进制、integer整型。 
    例如: 
    config HELLO_MODULE 
    bool "hello test module" 
    bool 类型的只能选中或不选中,显示为[ ];

     tristate类型的菜单项多了编译成内核模块的选项,显示为< > , 假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置. hex十六进制类型显示为( )。

    目录层次迭代 
    在Kconfig中有类似语句:source"drivers/usb/Kconfig" 
    用来包含(或嵌套)新的Kconfig文件,这样便可以使各个目录管理各自的配置内容,使不必把那些配置都写在同一个文件里,方便修改和管理。

     配置选项之间的依赖关系:
     depend on:某选项依赖于另外一个选项生成
     select   :反向依赖关系,该选项选中时,同时选中select后面定义的那一项
     requie
     默认值: default(默认y/n/m等值)
     输入提示:prompt
     帮助信息:help

    3、.config

    内核编译参考文件。

    修改方式:

    (1)    make menuconfig

    (2)    make xxx_defconfig

    (3)    直接修改

    !注意如果直接修改,不一定会生效,因为一些配置可能存在依赖关系,make的时候会根据依赖关系,进行规则的检查,不推荐直接在.config进行修改。

  • 相关阅读:
    window下安装jupyter,ipython的方法
    虚拟机中,安装VM tools的小发现
    Perl 与 Python 之间的一些异同
    perl中的grep函数介绍
    基因芯片(Affymetrix)分析1:芯片质量分析
    议员是如何投票的?
    社会网络分析:探索人人网好友推荐系统
    支持向量机(一)
    主成分分析(Principal components analysis)-最小平方误差解释
    因子分析(Factor Analysis)
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7249490.html
Copyright © 2011-2022 走看看