有关内核的操作主要分为两个板块
配置Makefile 完成对文件或目录编译
配置Kconfig 提供内核的配置菜单选项 (.config 是内核的配置文件)
实验环境
主机:ubuntu12.04发行版
开发平台:FS4412平台
交叉编译工具:arm-none-linux-gnueabi-gcc
过程
1.解压内核
将 linux-3.14.tar.xz 拷贝到/home/linux 下并解压,这里单独创建了一个内核文件夹,把linux-3.14.tar.xz 复制到该目录下了(我已经解压过了)
这里有几个较为重要的路径,可以记一下
(1)arch 目录 :存放架构相关的代码
arch/arm/boot/compressed 存放的是内核的自解压代码
arch/arm/kernel/head.S Linux 内核的开始代码
|解压代码|压缩的Linux 内核|
-----------------------------
arch/arm/boot/dts(device tree source) 存放的是开发板相关的设备树文件(硬件信息)
arch/arm/configs 存放的SOC芯片相关的内核配置文件
(2)driver 目录: 设备驱动代码
(3)net 目录: 网络协议栈的实现代码
2.配置Makefile和Kconfig
开发板是fs4412,这里是LED的驱动
配置路径是在当前路径下,配置具体如下:
左边是Kconfig,右边是Makefile
一般情况下:
Makefile 配置的基本语法有两种方式
(1)0obj-y += dir/ 或 obj-y += file.o 表示对应目录需要编译进内核或指定的文件需要编译进内核
(2)obj-$(CONFIG_XXX) += dir/ 或 obj-$(CONFIG_XXX) += file.o
表示对应目录或文件是否需要编译进内核,取决于CONFIG_XXX宏的定义,也就是在.config是否有这个宏的定义:
CONFIG_XXX=y
Kconfig配置
config 选项名
属性1
属性2
...
解析:
[1]选项名
config HELLO
展现的形式:CONFIG_HELLO,在.config文件中定义
[2]属性
(1)选择类型
<1>tristate(三态) y:编译进内核 m:编译成模块 n:不编译 < >
<2>bool y:编译进内核 n:不编译 [ ]
<3>string CONFIG_选项名="字符串" ()
<4>int CONFIG_选项名=整数
<5>hex CONFIG_选项名=十六进制数
(2)提示字符串
prompt "提示字符串" (配置菜单中显示)
(3)range 指定值的范围
(4)help 帮助信息
help
"test help ..."
(5)default 当没有进行配置的时候,默认的选择是什么
例如:
config HELLO
tristate
prompt "hello support"
default y
(6)depends on 配置选项名
[1]depends on 配置选项名
[2]depends on 配置选项名1(m) || 配置选项名2(y)
[3]depends on 配置选项名1(y) && 配置选项名3(m)
y:2 m:1 n:0
&& -> 最小值
|| -> 最大值
注意:如果依赖的结果为0:不可见, 2:三态 , 1:两态
(7)select 配置选项名
当前配置选项被选中的时候,同时选择select 指定的配置型选项
(8)source 路径/Kconfig
将这个路径下的Kconfig文件包含进来
注意:(1)和(2)必须有,其它可选择
总的来说,关于Makefile和Kconfig的配置格式大概如下:
Makefile:
obj-$(CONFIG_XXX) += file.o
Kconfig:
config XXX
tristate "....."
这里注意,如下不是在内核当前目录下配置的Makefile,需要回到上层目录再对这两个文件进行配置,如果在当前目录下,那便没必要再配置一次,这里我不是在当前目录配置的
回到上一层配置是这样,修改这两个地方
配置完成后,运行build.sh