Linux驱动开发(0) – Linux 内核编译加载记录
Linux驱动开发(0) -- Linux 内核编译加载记录
内核编译
- 编译内核和模块的方式
make ARCH=arm zImage
make ARCH=arm modules
- Linux内核的配置系统组成部分:
- Makefile : 分布在Linux内核源码中,定义编译规则
- Kconfig(配置文件):给用户提供配置选择功能
- 配置工具:包扣配置命令解释器和配置用户界面
Makefile和Kconfig
往内核增加程序的步骤:
- 将写好的源代码复制到Linux源代码对应目录下(列:drivers/char/)
- 在此目录下的Kconfig文件中增加新代码对应的编译配置选项
- 在此目录的Makefile文件中添加新代码编译规则
Makefile
- 目标定义
- 定义目标内容是否作为模块编译,或者编译并链接进内核
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
- 多文件模块定义
一个模块由多文件组成,采用模块名加-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中的配置情况;
- 目标层次的迭代
obj-$(CONFIG_EXT2_FS) += ext2/
当CONFIG_EXT2_FS
的值为y或m时,将会把ext2目录列入向下迭代的目标中;
Kconfig
- 配置选项
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>]
- 菜单结构
配置选项在菜单树结构中的位置有两张方式,第一种: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
-
在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-*列表。
-
在test/cpu目录下添加Makefile
由于test/Makefile中包含obj-$(CONFIG_TEST_CPU) += cpu/
,所以需要将CPU目录加入列表中
在cpu目录下创建Makefile ,内容如下:obj-$(CONFIG_TEST_CPU) += cpu.o
-
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
如果不对之处,请各位看官指正!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律