初步了解Linux内核 (1)

今天在学习JZ2440中,需要将Linux内核烧写进板子中。
今天谈一下整个烧写内核过程以及对Linux进行分析,当然,只是粗略的去分析,本人还是一枚新手,初步学习希望能记录下整个Linux内核是如何一步步烧写进板子以及Linux内核的启动过程是怎么样。也希望有误的地方各位能指点我一下,还有能一块交流。

当我拿到JZ2440时,如何将内核烧写进板子中呢?
首先使用厂家提供的补丁文件对内核进行打补丁
其次则是对内核进行配置
最后则是编译生成uImage,接着就将其烧写进板子中。
整个流程看起来很简单,但是接下来深入去分析每一个步骤。

当我拿到JZ2440时,厂家提供了相关的Linux内核的源文件,以及相关的补丁包,在我学习过程中,Linux内核使用的的2.6版本的:linux-2.6.22.6.tar.bz2。所以拿到它时首先要进行解压缩。解压命令为:tar jxf linux-2.6.22.6.tar.bz2
然后进到源码目录,使用厂家提供的补丁文件 linux-2.6.22.6_jz2440.patch 进行打补丁,patch -p1 < ../linux-2.6.22.6_jz2440.patch。

接下来则是内核的配置过程:
对于一个内核来说,有三种配置的方法
1.直接执行make menuconfig,重头到尾一项项的进行修改配置
2.使用默认配置,然后再执行make menuconfig进行少量的配置
3.使用厂家提供的配置文件

对于第一种情况工作量十分的大,需要对板子十分了解。
而第二种情况,每个内核源码中都有许多默认配置,对于arm架构的CPU来说,它存在arch/arm/configs目录下,具体如下:

这里写图片描述
在这里能找到与我的板子JZ2440相对应的默认配置文件 s3c2410_defconfig,接着就可以在顶层目录下执行make s3c2410_defconfig,进行默认配置,再接着执行make menuconfig,它会在s3c2410_defconfig的基础上再让用户进行少量的配置。但是怎么知道执行make menuconfig后它能知道s3c2410_defconfig的默认配置呢?原因在于有一个文件:.config,当执行make s3c2410_defconfig它会将默认配置写进去该文件中,而执行make menuconfig时,它会去读取.config文件。从而得知配置项。

对于第三种方面则比较简单,直接将厂家提供的配置文件修改为.config文件即可。

至此配置过程也结束了,接下来只需要执行make uImage则可以进行编译,编译完成后则去arch/arm/boot目录下找到uImage文件,将其烧写到板子即可。

对于配置过程,已经知道默认配置还有make menuconfig去配置都会关联到.config文件,所以打开.config文件,内容大致如下:

...

# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32

...

Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_SMC91X is not set
CONFIG_DM9000=y
# CONFIG_CS89x0 is not set
# CONFIG_NET_POCKET is not set
CONFIG_NETDEV_1000=y
CONFIG_NETDEV_10000=y

...

# CONFIG_CRYPTO_GF128MUL is not set
CONFIG_CRYPTO_ECB=m
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=m

在.config文件中,这些都是配置项,当值等于y、m或者数值的时候,则表示内核支持该设备。
以DM9000为例:

CONFIG_DM9000=y
# CONFIG_CS89x0 is not set

CONFIG_DM9000的值等于y,则表示内核对DM9000网卡的支持,同时将其编译进内核当中,而注释的部分则表示不支持。还有当配置项的值等于m时,如:CONFIG_CRYPTO_ECB=m,表示将其编译成一个模块,以后内核启动后可以动态的去加载。

而设置好了这些配置项之后,该如何被使用?
这里以配置项CONFIG_DM9000为例

首先在内核源目录中进行搜索该关键字,如图会出现以下一连串的匹配:

这里写图片描述

从上图可以看出,首先这些配置项会被与之相关的C源码所使用。其次还会被与之相关的子目录下的Makefile使用,而且还会被include/config目录下的auto.conf文件所使用,还有会被include/linux/autoconf.h文件所使用。

可以进行以下推论,对于在C源码中CONFIG_DM9000在里面肯定会是一个宏,而这个宏会在哪里被定义?能推测出是在头文件中,所以是autoconf.h文件。而autoconf.h是make uImage时,根据.config文件自动生成出来的。打开autoconf.h文件,内容大概如下:

这里写图片描述

它的里面全都是这些定义,即根据.config中配置是否为y、m或者数值,生成相应的宏,若在.config中没有该配置项的话,相应就没有这些宏,而在C源码中则会根据有无该宏判断是否进行编译该C源文件。在.config中CONFIG_DM9000=y,所以在atuoconf.h中会有对应项#define CONFIG_DM9000 1,在相应的C源码中则会根据该宏已经定义而执行编译。

对于include/config目录下的auto.conf文件,它也是执行make uImage时,根据.config文件自动生成出来的。打开该文件,内容如下:

这里写图片描述

也是一些配置项,与顶层目录中.config相似,而auto.conf文件的内容则会被子目录下的Makefile所使用。对于子目录下的Makefile文件十分简单,这里以DM9000的为例,在源码目录中的drivers/net/Makefile中,内容如下:

这里写图片描述

它则根据这些配置项是y、m或者为空进行替换,替换成 obj-y = xxx.o 或 obj-m = xxx.o 或 obj- = xxx.o,在执行make uImage时,会根据这些值判断是编译进内核,还是编译成模块亦或不编译。

至此,配置的过程以及一些涉及到编译的流程大概是这样。至于相关的配置文件是如何生成的,还有各个文件之间如何联系起来,需要根据编译的指令make uImage去顶层Makefile中顺藤摸瓜。分析整个大概的流程。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值