写在前面:本篇主要介绍Linux内核的开发模式、linux代码的组成、vmlinux zImage uImage的区别,以及编译下内核。
正文:
一、Linux内核的开发模式
1、git:是一个分布式的文件版本管理工具,这个在平时工作中必用的工具。
内核下载的方式,直接到 https://mirrors.edge.kernel.org/pub/linux/kernel/ 下载,也可以通过git获取,
第一步:安装git,apt-get install git curl
第二步:找到linux内核的地址:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
页面最下面:
按照第一条clone方法: git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 就可以克隆代码。
git的几个命令:
获取代码: git clone
提交代码: git push
更新代码:git pull
2、 邮件组:mailing list,可订阅。
3、 patch:新的代码和旧代码之间的差异就叫patch。一般听到的对内核打patch,就是将新旧到码做一个对比,找到差异,然后更新到旧代码中。
二、Linux 内核代码的组成结构
arch:跟cpu架构相关
block:跟块设备相关的代码
crypto:加解密算法
drivers:所有驱动的代码
firmware:linux挂在的外设的固件包(一般比较复杂的外设)
fs:文件系统
include:头文件,各种各样的头文件
init:启动共用代码。
ipc:进程间通信代码
kernel:跟操作系统本身相关的内核代码
lib:库文件
mm:内存管理代码
net:网络相关代码
samples:例程
scripts:脚本相关代码
security:安全性相关代码
sound:音频架构代码
tools:工具
usr:生成的一些文件
virt:虚拟化代码
二、vmlinux zImage uImage的区别
vmlinux:原始的、未经压缩的可执行文件。
zImage:压缩过的可执行文件,压缩vmlinux之后,加上一个头,这个头是有一些程序组成,这些程序是用来解压的。
uImage:用于给uboot引导的zImage。
三、编译内核
1、工具链:压缩报arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2、配置内核:就是决定需要编译的代码,一般是把某些模块的宏打开。
linux-3.0.8/ 下的.config文件就是默认的配置内核的文件
make gconfig (图像化配置内核)之前需要 安装apt-get install libglade2-dev
3、编译内核:生成可执行文件的过程,编译基于三星210处理器的内核的过程
第一步:下载 arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar 交叉编译工具链
第二步:修改 linux-3.0.8/Makefile 中的ARCH 和 CROSS_COMPILE 制定cpu架构和交叉编译工具链的位置
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
第三步,解压交叉编译工具链到 /usr/local/arm/
tar -jxvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local/arm/
第四步,编译:
以s5pv210为例,默认的config文件在arch/arm/configs文件下。
cp arch/arm/configs/s5pv210_defconfig linux-3.0.8/
然后给他重命名一下 cp s5pv210_defconfig .config(因为.config是默认的内核配置文件)
make -j4 zImage //四线程编译,目标是zImage
编译出来的zImage在 arch/arm/boot/ 目录下
注意:arch/arm/boot/ 也会生成vmlinux,这个跟linux-3.0.8/ 是不一样的,
arch/arm/boot/compressed/vmlinux是压缩过的,而linux-3.0.8/ 下的vmlinux是未经压缩的
linux-3.0.8/ 下的vmlinux大小
arch/arm/boot/compressed 下的vmlinux大小: