#目录
文章目录
##准备工作
去官网下载Linux内核 http://www.kernel.org./
然后解压
tar sjf linux-2.6.22.6.tar.bz2
版本当然要根据实际情况来
##认识Makefile
- 打开下载好了的Linux内核之后,我们可以发现,Linux内核中有上万个文件。这上万个文件包含了许许多多芯片的驱动程序,能供很多芯片同时使用
s3c2440
就是这茫茫多Linux内核所支持的芯片中的一款。 - 这么多的文件,就是通过
Makefile
组织起来的。 Makefile
决定了我的ubuntu去编译哪些文件,以及怎样去编译和如何去将这些成千上万的零散的文件链接在一起。- Linux内核在编译的过程中是首先从顶层的
Makefile
开始的,对你没有听错,在linux内核文件中,不仅仅只有一个Makefile
文件,在最顶层的文件夹中有Makefile
文件,在里面的子文件夹里面还有Makefile
文件!编译的过程中,先从顶层的Makefile
文件开始,然后递归的进入各级子目录中调用他们的Makefile
文件。- 顶层的
Makefile
文件来决定哪个文件夹可以被编进内核。
- 顶层的
- 子文件夹中的文件的
Makefile
将决定这个子文件夹中的哪些文件又将要被编内核,哪些文件要编成模块,模块就是以前经常说的驱动程序啦。哪些文件还要继续进入自己的目录中使用第三级的Makefile
。
##认识Kconfig
- 在上面一步,当我们将下载好了的Linux内核放入ubuntu之后,我们进入这个目录后输入make menuconfig之后,我们就可以进入Kconfig界面了。如下图:
在这个界面中,我们可以使用命令来配置我们的内核支持哪个芯片,以及使用哪个文件系统等等等等。我进去稍稍看了一眼,就发现了官方已经帮我们写好了的许许多多的驱动文件了,例如我们以前经常会用到的i2c等等非常底层的驱动文件,官方都已经帮我们准备好了,我们只需要再这个界面点点按钮,就可以使用了。但是往往,在系统的开发过程中,我们并不是一个一个去点击,去挑选我们的功能,以为可以用的功能实在是太多啦有没有,所以一般情况下,很多人都是先下载一个大概配置好了的内核,然后在这个已经大概配置好了的内核上进行修改,来达到自己的目的。
##移植Linux内核
- 在移植我们所需要的Linux内核之前我们应该要搞清楚我们需要一个什么样子的内核。首先,我使用的开发板是jz2440,韦小宝一块板子。芯片为三星的s3c2440。那么很明显,我们的内核也必须要支持s3c2440,内核肯定是支持2440的,我的意思就是我们可以删减的别的不用的支持的芯片,但是不要删除有关2440的支持文件就可以了。
- 移植Linux内核会涉及到两个部分。首先是架构、开发板的【引导过程】。然后就是后续通用的【启动过程】。
- 【引导过程】是用汇编代码写成的。他的工作就是引导对应的芯片的启动,如设置列表,使能MMU。调用C语言start_kernel之前的常规工作。
- 【启动过程】是用C语言写的。他的工作就是完成内核初始化的所有项目。
- 我们首先进入顶层的Makefile文件中进行如下的修改。将185行修改为
ARCH ?= arm
下面一行修改为CROSS_COMPILE ?= arm-linux-
- 之后,再
make uImage
即可。最终的生成结果如下图:
这样,我们就已经编译好了一个Linux内核文件了。并且将这个uImage存储在了arch/arm/boot/路径下。