linux kernel 移植步骤
linux kernel 移植步骤
1.准备
准备:linux-2.6.32 kernel(linux-2.6.32.tar.bz2)
下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2
2.目录结构
认清kernel的目录结构,了解目录的作用。
2.1 根目录目录文件
解压并查看:
$ tar -xvf linux-2.6.32.tar.bz2 $ cd linux-2.6.32 $ ls |
2.2 目录的作用
arch:
硬件体系结构相关的代码,支持的每种体系结构在arch目录下都有对应的子目录。
crypto:
内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。
fs:
虚拟文件系统(VFS,Virtual FileSystem)的代码,包含所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统。
sound:
声卡驱动以及其他声音相关的代码。
block:
block层的实现。最初block层的代码一部分位于drivers目录,一部分位于fs目录,从2.6.15 开始,block层的核心代码被提取出来放在了顶层的block目录。
Documentation:
存放了与内核相关的文档。
include:
目录包含了内核中大部分的头文件,与平台无关的头文件在include/linux子目录下,include/scsi目录则是有关scsi 设备的头文件目录
kernel:
主要的核心代码,此目录下的文件是内核的最核心部分,包括进程调度、定时器等,实现了大多数Linux 系统的内核函数。同样,和体系结构相关的代码在 arch/*/kernel 中。
mm:
包含了体系结构无关部分的内存管理代码,体系相关的部分位于 arch/*/mm 目录下。
samples:
tools:
drivers:
linux 支持的外围设备或总线的驱动程序,每个不同的驱动占用一个子目录
init:
内核的初始化代码。包括main.c、创建早期用户空间的代码以及其他初始化代码。
lib:
放置核心库代码,实现了一个标准 C 库的通用子集,与arch/lib 下的代码不同,这里的库代码都是使用C 编写的,在内核新的移植版本中可以直接使用。
net:
网络相关代码,实现了各种常见的网络协议
scripts:
该目录下没有内核代码,只包含了用来配置内核的脚本文件。当运行 make menuconfig 或者make xconfig 之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。
usr:
实现了用于打包和压缩的的cpio 等。
firmware:
ipc:
IPC,即进程间通信(interprocess communication)。核心的进程间通讯的代码,它包含了共享内存、信号量以及其他形式IPC的代码。
security:
这个目录包括了不同的Linux 安全模型的代码,比如NSA Security-Enhanced Linux。
virt:
3.编译
大概三个步骤:
make xxxxxxx_defconfig //生成对应平台的的配置信息,如s3c2410则为s3c2410_defconfig make menuconfig //配置内核 make zImage //编译生成zImage文件 |
3.1 生成配置文件
首先确定平台和编译器,如果没有确定平台,就执行make s3c2410_defconfig时会默认平台为当前系统的平台(一般开发用的PC为x86),这有可能与自己的目标平台不一致,就会报错,我的开发平台报错如下:
linux@linux-vm:~/kernel/linux-2.6.32$ make s3c2410_defconfig *** *** Can't find default configuration "arch/x86/configs/s3c2410_defconfig"! *** make[1]: *** [s3c2410_defconfig] Error 1 make: *** [s3c2410_defconfig] Error 2 linux@linux-vm:~/kernel/linux-2.6.32$ |
所以首先确定平台和编译器,方法是修改内核顶层目录下的Makefile文件(ARM平台):
修改前: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 修改后: ARCH ?= arm CROSS_COMPILE ?= arm-linux- |
然后执行make s3c2410_defconfig:
linux@linux-vm:~/kernel/linux-2.6.32$ make s3c2410_defconfig |
这样就生成了.config配置文件。
3.2 配置内核
运行make menuconfig,根据实际需要制定内核。
linux@linux-vm:~/kernel/linux-2.6.32$ make menuconfig |
最后保存退出。
3.3 编译内核
执行make zImage,完成后会在对应平台的boot目录下生成zImage文件,对ARM平台,该路径为arch/arm/boot/。
linux@linux-vm:~/kernel/linux-2.6.32$ make zImage |
在arch/arm/boot/下生成zImage就完成了。
4.错误信息及处理
4.1平台信息不匹配
执行make s3c2410_defconfig时报错,报错信息:
linux@linux-vm:~/kernel/linux-2.6.32$ make s3c2410_defconfig *** *** Can't find default configuration "arch/x86/configs/s3c2410_defconfig"! *** make[1]: *** [s3c2410_defconfig] Error 1 make: *** [s3c2410_defconfig] Error 2 linux@linux-vm:~/kernel/linux-2.6.32$ |
缺少平台信息,应先修改顶层Makefile文件:
修改前: ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 修改后: ARCH ?= arm CROSS_COMPILE ?= arm-linux- |
然后再执行make s3c2410_defconfig命令。
4.2缺少库文件
执行make menuconfig时报错,报错信息:
inux@linux-vm:~/kernel/linux-2.6.32$ make menuconfig *** Unable to find the ncurses libraries or the *** required header files. *** 'make menuconfig' requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1 make: *** [menuconfig] Error 2 |
根据提示,需要安装ncurses-devel的库,解决方法:
sudo apt-get install libncurses5-dev |