Linux内核配置编译初探

内核配置问题

在进行 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

具体细节:

  1. SUBARCH 默认就是X86,内核默认配置按照X86
    ARCH 这个变量改为 arm 单词
    交叉编译
    CROSS_COMPILE
  2. 哪些文件编译?
    CONFIG_xxx
    配置单:linux-3.0.8/arch/arm/configs
    导出配置单到主目录 export------> .config
    defconfig
  3. 修改 defconfig 变成 适用于板子

具体实现

具体如下 ,

  1. 修改主目录下(linux-3.0.8)的Makefile 如下 195行左右
ARCH            ?= arm
CROSS_COMPILE   ?= arm-linux-
  1. 拷贝相应的 defconfig
cp arch/arm/configs/s3c6400_defconfig .config
  1. 之后执行 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驱动到内核

  1. 在 driver/char/ 目录下创建 myled 文件夹,之后把驱动程序 led.c 文件拷贝到 这个目录下:
mkdir myled
cp led.c   /home/zhangbin/mini6410/linux-2.6.38/driver/char/myled/ 
  1. 在myled目创建录下创建 Makefile (格式可以参考其他目录下的 Makefile )
    在这里插入图片描述
  2. 之后修改上级目录的 (driver/char 目录)Makefile 如下(第81行) obj-y += 目录名/
    在这里插入图片描述
  3. 在myled目录下创建 Kconfig 内容如下
    在这里插入图片描述
  4. 修改上级目录的 Kconfig 包含 myled目录下的 Kconfig
    source
    在这里插入图片描述
    最后执行 make menuconfig 进行配置

猜你喜欢

转载自blog.csdn.net/qq_41782149/article/details/90176646