内核配置问题
在进行 linux 内核配置时,我们需要思考几个问题:
(1)配置哪些目录需要编译
(2)配置哪些文件需要编译
(3)编译时,到底文件时哪个目录
比如 <mach/hardware.h>
解决方法:
Makefile make
- 主目录 Makefile
arch下的Makefile相关联
通过 include 包含到其他文件 - 各个子目录的 Makefile
obj-y :编译进内核
obj- :不编译进去
obj-m : 以模块形式编译
$(hdr-arch)
-I$(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH=arm
hrd-arch arm
怎么配置内核
配置步骤:
(1)配置仓库选取
(2)交叉编译器的修改
(3)体系结构体的选择
(4)增删改查(make menuconfig)
具体细节:
- SUBARCH 默认就是X86,内核默认配置按照X86
ARCH 这个变量改为 arm 单词
交叉编译
CROSS_COMPILE - 哪些文件编译?
CONFIG_xxx
配置单:linux-3.0.8/arch/arm/configs
导出配置单到主目录 export------> .config
defconfig - 修改 defconfig 变成 适用于板子
具体实现
具体如下 ,
- 修改主目录下(linux-3.0.8)的Makefile 如下 195行左右
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
- 拷贝相应的 defconfig
cp arch/arm/configs/s3c6400_defconfig .config
- 之后执行 make menuconfig 进行增删改查
配置完成后,执行make uImage
如果出现这个错误---------------------------
Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
---------------------->
解决方案:
- 其实,提示的错误信息已经明确告诉你了,你应该省略defined().
这里,我们打开 kernel/timeconst.pl
@val = @{ KaTeX parse error: Expected '}', got 'EOF' at end of input: canned_values{ hz}};
if (defined(@val)) {
@val = compute_values(KaTeX parse error: Expected 'EOF', got '}' at position 7: hz); }̲ output(hz, @val);
将if (defined(@val)) 改为if (@val),再次编译就可以通过了。
查了一下更新,发现其中有一项是perl版本升级到了 v5.22.1,然后查了perl官方文档,发现官网因为一个bug,该版本将defined(@array)去掉了。可以直接使用数组判断非空。
三种image关系
vmlinux : OS elf file(操作系统可执行的elf文件)
Image(比较大) ---------> zImage(解压缩,但是不符合uboot的引导规则,所以产生了uboot支持引导的uImage) ---------> uImage
Kconfig 语法
主目录下的 Kconfig
- ---------> source “arch/$SRCARCH/Kconfig”
代表的就是 包含 arch/arm/Kconfig
source : 包含 - menu 与 endmuenu 语法:显示的菜单,可以添加,如下:
- config语法:配置纤信息
执行后的出现的现象 在 .config 中 出现了 CONFIG_ABC=y
作用在Makefile为:obj-$(CONFIG_ABC) += XX.c
bool :信息
tristate :三态 (编译进内核,不编译进内核,以模块形式加入内核)
添加led驱动到内核
- 在 driver/char/ 目录下创建 myled 文件夹,之后把驱动程序 led.c 文件拷贝到 这个目录下:
mkdir myled
cp led.c /home/zhangbin/mini6410/linux-2.6.38/driver/char/myled/
- 在myled目创建录下创建 Makefile (格式可以参考其他目录下的 Makefile )
- 之后修改上级目录的 (driver/char 目录)Makefile 如下(第81行) obj-y += 目录名/
- 在myled目录下创建 Kconfig 内容如下
- 修改上级目录的 Kconfig 包含 myled目录下的 Kconfig
source
最后执行 make menuconfig 进行配置