搞懂Linux内核地图之二:配置内核Makefile、Kconfig

        拿到内核的第二件事是确定哪些目录和文件需要编译,可以通过Makefile来解决

        以arm为例

        一、Makefile 分类和关系

        1、子目录Makefile:

        obj-y:编译进内核

        obj-m:以模块形式编译

        obj-:不编译进去

        各个子目录Makefile形式基本相同,没有目标,目标在主目录Makefile中

        2、主目录 Makefile

        根目录 Makefile通用但又依赖/arch下各体系架构的Makefile,通过include把需要的体系架构Makefile包含进来

        二、内核配置思路和方法

        第一步,配置需要编译的体系架构和交叉编译工具

        因为主Makefile(根目录Makefile)中

        include $(srctree)/arch/$(SRCARCH)/Makefile

        SRCARCH :=$(ARCH)

        ARCH ?=$(SUBARCH) //SUBARCH指当前的体系架构

        所以默认都是编译x86架构的,需要令ARCH=arm指定体系架构

        因为是在x86架构中编译运行在arm上,所以需要通过CROSS_COMPILE=xxx 指定交叉编译工具

        第二步,根据SOC决定哪些文件需要编译

        因为主Makefile里面有很多obj-$(CONFIG__XXX) +=YYY

        所以可以通过设置CONFIG__XXX为y、m或者空来决定哪些文件需要编译

        所以可以通过一个配置单,让主Makefile读这个配置单然后作用于各个子Makefile决定哪些文件需要编译,那这个配置单在哪里?肯定不可能和平台无关,在/arch/arm/configs中有很多默认配置单defconfig,根据你的SOC选取defconfig,需要想办法导出到根目录下让内核用到,通过cp /arch/arm/configs/xxx_defconfig .config,或者自己新增一个配置文件命名为.config但是不推荐

        因为默认的defconfig不能满足实际的需求,所以有了第三步

        第三步,修改defconfig即.config,变成适应于自己的板子

        1、通过vi .config 直接修改但是工作量大

        2、可以通过make menuconfig图形界面来改

        make menuconfig里面的选项值会影响到.config里面宏的值,然后主Makefile读取配置单.config来进行编译

        那么make menuconfig 里面有很多字符串选项,怎么把这些字符串和.config联系起来,这就需要通过Kconfig

        也就是

        Kconfig---->;make menuconfig--->.config--->Makefile

三、Kconfig语法和使用

     可参考内核//Documentation/kbuild/Kconfig/kconfig.txt

     1、source属性:包含作用,相当于Makefile中的include,如下图主Kconfig(根目录下那个)

  

     2、menu、endmenu 属性,通过这两个来在Kconfig中自定义菜单

make menuconfig效果:

      3、config属性

     make menuconfig效果:

     源码目录中.config效果:

     5、bool、tristate属性

     bool:make menuconfig前面的方括号,有编进内核、不编进内核两种选择,如下图:

      tristate:make menuconfig前面的尖括号,有编进内核、不编进内核、编成模块三种选择,如下图:

       6、depend on属性

       配置成功了才在make menuconfig里面显示出来

四、怎么由menuconfig找Kconfig,再由Kconfig找Makefile中的.c文件

   1、menuconfig找Kconfig

   第一步,按H找到对应的宏

    第二步,找到宏为CONFIG_SERIAL_SAMSUNG,说明应该有个属性配置config SERIAL_SAMSUNG

       总结:选中menuconfig的某个选项按H,可以看到对应的宏和Kconfig位置说明,所以可以根据这个位置说明找到对应的Kconfig,也可以通过grep -nR "xxx"来搜索找到Kconfig

     2、找到Kconfig后,找Makefile中对应的.c文件

      在Kconfig相同路径下的Makefile中搜索相应的宏

  五、修改Makefile、Kconfig给内核添加驱动模块 

    以添加led驱动为例,目录结构如下

-----driver

--------char

      ---------myled

                ----myledcdev.c

    1、创建Makefile。需要告诉Makefile将.c驱动文件编译成.o文件,所以先在myledcdev.c的同级目录下创建Makefile并编辑它(推荐复制一个现成的Makefile并在其基础上进行修改)

    

    CONFIG_MYLEDTEST,如果想通过menuconfig来配置需有前缀CONFIG_

    因为这个Makefile会被上级Makefile包含,所以要用+=,不然上级Makefile一旦包含这个Makefile,上级Makefile里面的内容就全没了 

    2、创建好Makefile后,该Makefile只是在myled目录起作用而已,需要告诉内核进入到这个目录读取这个Makefile,所以需要配置上级Makefile,也就是char目录下的Makefile

     3、如果想通过menuconfig控制,则要配置Kconfig,则在myledcdev.c的同级目录下创建Kconfig

    4、同理需要告诉上级的Kconfig把myled下的Kconfig包含进来,所以需要修改上级Kconfig,也就是char下Kconfig 

     效果:

    6、编译好驱动编译成image烧到开发板后,先要确定内核是否运行驱动,可用cat /proc/devices 查看是否有驱动的设备号

    7、创建设备节点

    8、测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值