移植Linux内核 - 内核配置裁剪及启动流程

本章内容对应《嵌入式Linux应用开发完全手册》第16章 - 移植Linux内核。

一、第001节_内核启动流程分析之编译体验

1.1、解压、打补丁

首先找到文件:
linux-2.6.22.6.tar.bz2
linux-2.6.22.6_jz2440_v1.patch
把这两个文件放到Ubuntu上。
然后解压、打补丁,如下:
在这里插入图片描述

1.2、配置内核

建议用方法2

方法1

执行:make clean

执行find -name “* defconfig*”,去查找文件名为defconfig的文件,你会在里面发现了arm架构的comfig:
在这里插入图片描述
因此我们到./srch/arm/config下去看看:
在这里插入图片描述
发现其中有一个s3c2410_defcofig,那我们就可以使用s3c2410_defcofig来配置,如下面两幅如所示:
在这里插入图片描述
注意下图中有一个configuration written to .config,意思是说把make s3c2410_defcofig命令是把所有的配置项写到.config文件中。
在这里插入图片描述

最后执行命令make menuconfig(这条命令是在s3c2410_defcofig的基础上的显示一个菜单(菜单里面是一些配置项),如下图。在这个菜单中我们就可以选择、修改配置项了)(这些配置项是从.config文件中读取的)。
Ubuntu终端出现如下:
这个菜单的使用:下图最上面的文字已经给出了操作说明。
在这里插入图片描述
退出菜单。

方法2 使用厂家提供的配置文件

执行:make clean

执行find -name “* defconfig*”,去查找文件名为defconfig的文件,你会在里面发现了arm架构的comfig:
在这里插入图片描述
因此我们到./srch/arm/config下去看看:
在这里插入图片描述
发现其中有一个s3c2410_defcofig,那我们就可以使用s3c2410_defcofig来配置

执行cp ./srch/arm/configs/s3c2410_defcofig .config

执行命令make menuconfig , Ubuntu终端出现如下:
在这里插入图片描述
直接退出菜单。

1.3、 编译

1.3.1.编译内核

执行make 或者 执行make -j4,就会把内核编译了。

1.3.2编译内核并生成uImage

如果你想生成一个uImage,你可以在Ubuntu中输入make uImage命令,然后就会生成一各uImage文件。(我们说我们把“内核”烧写到开发板上,其实就是烧写的这个“uImage”文件)

uImage是什么?补充一下uImage概念:
内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。
那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。

1.4、实验

我们想试试,把内核烧写进2440并运行它。
步骤:
先把u-boot烧写进2440(有了u-boot才可以启动内核)
然后在串口执行u-boot,显示如下:
在这里插入图片描述
然后需要执行u-boot的 [k] 命令。[k]命令是把内核下载到2440板子。
(要知道,你要想执行[k]命令,需要连接2440与电脑之间的USB device线)。
连接上USB线之后,我们使用一个软件名为dnw.exe文件(在F:\1\002_JZ2440资料光盘_20180516(免费)\资料光盘\B盘\工具和驱动\USB DNW\for win7 & win8 & win10)去把uImage发送到2440,然后就完成内核的烧写了。
再看u-boot菜单,[b] 表示启动system(操作系统的核心部分就是内核),因此我们在uboot里输入b,就启动了操作系统。
u-boot中k命令与b命令输入之后串口如下图所示:
在这里插入图片描述
在这里插入图片描述
上图就是内核启动过程的信息。

好,我们这节课是体验内核的启动,完成了!

二、第002节_内核启动流程分析之配置

上节课,关于配置项,咱们没有具体讲。这节课来讲这个内核配置。
由第一节课可知,make s3c2410_defcofig会生成一个.comfig文件,我们可以执行vi .config命令去查看一下这个文件,这个文件里面就是各种配置项。

我们以DM9000为例,分析一下配置。
输入grep “CONFIG_DM9000” * -nwR命令,终端上会打印出所有的含有CONFIG_DM9000的文件:
在这里插入图片描述
但是含有CONFIG_DM9000的这些文件,只以下四者对我们有用,并且我们对这4者进行分析:
1、C源码中有CONFIG_DM9000,可以大胆猜想CONFIG_DM9000肯定是个宏,而只有头文件中有宏,因此我们又可以猜出此头文件即为④include/linux/autoconf.h,我们可以vi autoconf.h查看autoconf.h,发现autoconf.h中的CONFIG_DM9000的值为1。
2、再来看②makefile。
你看下图最左侧内容“内核子目录”的内容以及下下一幅图,就是说如果obi后面为-y,则dm9000.c就会被编译到内核里面去,如果后面是-m,则dm9000.c被编译成一个模块dm9ks.o。看下下一幅图,obj后面是配置项CONFIG_DM9000,而这个配置项CONFIG_DM9000到底是等于y还是等于m,就是在③include/config/auto.cinf文件中定义的。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45519751/article/details/107714997