linux kernel 移植步骤
linux kernel 移植步骤
1.准备
准备:linux-2.6.32 kernel(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