Linux驱动开发(0) – Linux 内核编译加载记录

Linux驱动开发(0) – Linux 内核编译加载记录

内核编译

  1. 编译内核和模块的方式
    make ARCH=arm zImage
    make ARCH=arm modules
  1. Linux内核的配置系统组成部分:
  • Makefile : 分布在Linux内核源码中,定义编译规则
  • Kconfig(配置文件):给用户提供配置选择功能
  • 配置工具:包扣配置命令解释器和配置用户界面

Makefile和Kconfig

往内核增加程序的步骤:

  • 将写好的源代码复制到Linux源代码对应目录下(列:drivers/char/)
  • 在此目录下的Kconfig文件中增加新代码对应的编译配置选项
  • 在此目录的Makefile文件中添加新代码编译规则

Makefile

  1. 目标定义
  • 定义目标内容是否作为模块编译,或者编译并链接进内核
obj-y +=foo.o

表示要由foo.c或者foo.s文件编译得到foo.o并链接进入内核。而obj-m表示作为模块编译,obj-n表示目标不会被编译

  • 更加常用的做法是根据make menuconfig生成的config文件中的CONFIG_变量来决定文件编译方式,例如:
 obj-$(CONFIG_ISDN) += isdn.o
 obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
  1. 多文件模块定义
    一个模块由多文件组成,采用模块名加-y或者-objs后缀的形式来定义模块组成;
obj-$(CONFIG_EXT2_FS)  += ext2.o
ext2-y := balloc.o dir.o file.o ialloc.o
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 

上面代码表示模块名为ext2,由balloc.o,dir.o,file.o等多个目标文件链接生成ext2.o,最终后的ext2.ko文件,并且 是否包含xattr.o文件取决于Kconfig中的配置情况;

  1. 目标层次的迭代
obj-$(CONFIG_EXT2_FS) += ext2/

CONFIG_EXT2_FS的值为y或m时,将会把ext2目录列入向下迭代的目标中;

Kconfig

  1. 配置选项
config MODVERSIONS
    bool "Module Versioning support"
    help 
        Usually,you have to use modules compiled with you kernel.
  • config关键字定义新的配置选项,之后的几行代码定义了配置选项的属性。
  • 每个配置选项都必须指定类型,类型包括bool,tristate,string,hex,int 。类型定义后可以紧跟输入提示;
  • 默认值的格式:
default <expr> [if <expr>]
  • 依赖关系格式
depends on <expr>

如果定了多重依赖关系,可以使用‘&&’间隔。也可以应用到菜单中所有的其他选项内:

bool "foo" if BAR
default y if BAR

等价于

depends on BAR
bool "foo"
default y
  • 选择关系(反向依赖)
select <symbol> [if <expr>]
  1. 菜单结构
    配置选项在菜单树结构中的位置有两张方式,第一种:
    menu "Network device support"
     depends on NET
    config NETDEVICES
    ...
    endmenu
    

所有处于menu和endmenu之间的配置选项都作为“Network device support”的子菜单,并且所有的子菜单(config)选项都会继承父菜单的依赖关系;

应用实例

假设我们要在内核源码drivers目录下为ARM体系结构新增test driver ,test的树形目录:

  |--test
    |--cpu
        | -- cpu.c
    |-- test.c
    |-- test_client.c
    |-- test_ioctl.c
    |-- test_proc.c
    |-- test_queue.c 
  1. 在test目录下创建Makefile和Kconfig文件
    Kconfig文件内容如下:

    menu "TEST DRIVER"
    comment "TEST Driver"
    config CONFIG_TEST
        bool "TEST support"
    config CONFIG_TEST_USER
        tristate "TEST user-space interface"
        depends on CONFIG_TEST
    endmenu
    

    首先test driver 对于内核来说是一个新功能,所以创建一个菜单 “TEST DRIVER”。

    Makefile文件内容如下:

    obj-$(CONFIG_TEST)      += test.o test_queue.o test_client.o
    obj-$(CONFIG_TEST_USER) += test_ioctl.o
    obj-$(CONFIG_PROC_FS)   += test_proc.o
    obj-$(CONFIG_TEST_CPU)  += cpu/
    

    该脚本根据变量取值,构建obj-*列表。

  2. 在test/cpu目录下添加Makefile
    由于test/Makefile中包含obj-$(CONFIG_TEST_CPU) += cpu/,所以需要将CPU目录加入列表中
    在cpu目录下创建Makefile ,内容如下:

    obj-$(CONFIG_TEST_CPU) += cpu.o
    
  3. test父目录中的Kconfig和Makefile进行修改

    Kconfig中需要添加 source "drivers/test/Kconfig"

    Makefile中需要添加 obj-$(CONFIG_TEST) += test/

最后,所有的文件添加完成,test目录下的结构如下:

  |--test
    |--cpu
        | -- cpu.c
        | -- Makefile
    |-- test.c
    |-- test_client.c
    |-- test_ioctl.c
    |-- test_proc.c
    |-- test_queue.c 
    |-- Makefile 
    |-- Kconfig

如果不对之处,请各位看官指正!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值