内核移植阶段内核是操作系统最基本的部分。
它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。
直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。
硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。
内核和用户界面共同为用户提供了操作计算机的方便方式。
也就是我们在windows下看到的操作系统了。
由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。
一.移植准备1. 目标板我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址:/thread-80832-5-1.html。
bootloader移植准备。
2. 内核源码这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是ftp:///pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。
3. 烧写工具我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持4. 知识储备要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进行简单介绍。
(1)arch/: arch子目录包括了所有和体系结构相关的核心代码。
它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。
PC机一般都基于此目录。
(2)block/:部分块设备驱动程序。
(3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
(4) documentation/:文档目录,没有内核代码,只是一套有用的文档。
(5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。
(6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统, 例如fat和ext2。
(7)include/: include子目录包括编译核心所需要的大部分头文件。
与平台无关的头文件在include/linux子目录下,与intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录。
(8) init/:这个目录包含核心的初始化代码(注:不是系统的引导代码),主要包含两个文件main.c和Version.c,这是研究核心如何工作的好的起点之一。
(9)ipc/:这个目录包含核心的进程间通讯的代码。
(10)kernel/: 主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c。
(11)lib/:放置核心的库代码。
(12) mm/:这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等(13)net/:核心与网络相关的代码。
(14)scripts/:描述文件,脚本,用于对核心的配置。
(15)security:主要是一个SELinux的模块。
(16)sound:常用音频设备的驱动程序等;(17)usr:实现了一个cpio。
(18)COPYING: GPL版权申明;(19)CREDITS:光荣榜;(20) Kbuild:一个包含了某些通用规则的编译文件;(21)MAINTAINERS:维护人员列表,对当前版本的内核各部分都有谁负责;(22) Makefile: 第一个Makefile文件。
用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系,编译时使用;仔细阅读各子目录下的Makefile文件对弄清各个文件这间的联系和依托关系很有帮助;(23)ReadMe: 核心及其编译配置方法简单介绍;(24)REPORTING-BUGS:有关报告Bug 的一些内容;一般在每个目录下都有一个.depend文件和一个Makefile文件。
这两个文件都是编译时使用的辅助文件。
仔细阅读这两个文件对弄清各个文件之间的联系和依托关系很有帮助。
另外有的目录下还有Readme文件,它是对该目录下文件的一些说明,同样有利于对内核源码的理解。
二.内核源码修改1.解压内核解压内核源码到计算机的工作环境中,我们下载的内核源码是.bz2格式压缩包使用解压命令:#tar xvfj linux-2.6.25.8.tar.bz2 解压到当前目录。
2.添加arm支持进如解压好的内核源码文件夹中,#cd linux-2.6.25.8修改“Makefile”文件,在大概193行“ARCH ?=(SUBARCH)”和194行“CROSS_COMPILE ?=”,将其修改为“ARCH ?=arm”和“CROSS_COMPILE ?=arm-linux-”(根据自己的实际情况添加自己的交叉编译工具的路径),然后保存。
如下图:3.修改平台时钟修改平台的时钟频率,以满足开发板的工作频率。
修改内核源码“arch/arm/mach-s3c2440/mach-s3c2440.c”文件的162行,把16.9344MHz改为12MHz,因为我们选用的开发板使用的就是12MHz的外部时钟源输入。
如下图所示:5.制作开发板配置文件我们选用的是比较通用配置的开发板,所以用内核中自带的配置文件,进行修改是比较方便的做法。
该配置单在内核源码的“arch/arm/configs/”目录下面,名为:“s3c2410_defconfig”,该配置文件里面选择了几乎所有的和S3C24XX系列CPU相关的配置选项,我们完全可以在该配置单的基础上进行配置。
首先将该文件考到根目录命名为.config 指令为:# cp arch/arm/configs/s3c2410default_config .config然后返回到配置界面,进入到内核配置单输入指令为:#make menuconfig出现如图所示的配置界面:选择“System Type”选项,然后配置各个平台如下所示:System Type --->S3C2410 Machines --->[*] SMDK2410/A9M2410[ ] IPAQ H1940[ ] Acer N30[ ] Simtec Electronics BAST (EB2410ITX)[ ] NexVision OTOM Board[ ] AML M5900 Series[ ] Thorcom VR1000[ ] QT2410S3C2412 Machines --->[ ] SMDK2413[ ] SMDK2412[ ] VMSTMSS3C2440 Machines --->[ ] Simtec Electronics ANUBIS[ ] Simtec IM2440D20 (OSIRIS) module[ ] HP iPAQ rx3715[*] SMDK2440[ ] NexVision NEXCODER 2440 Light Board[*] SMDK2440 with S3C2440 CPU moduleS3C2442 Machines --->[ ] SMDM2440 with S3C2442 CPU moduleS3C2443 Machines --->[ ] SMDK2443配置完毕这个地方后,退回到最初的配置单。
然后选择选项:“Save an Alternate Configuration File”,将其保存为:“.config”文件,因为编译系统时会调用该文件。
如下面的图所示:保存为“.config”文件后,退出配置单。
6.修改机器码在我们之前移植的uboot的机器码是168,这里需要修改机器码,否则会出现不能启动的情况。
机器码保存在内核源码的“arch/arm/tools/mach-types”文件中,在大概379行,把原来的362改为168保存即可。
如下图:7.修改nandflash分区修改内核源码中的“arch/arm/liat-s3c24xx/common-smdk.c”文件,在109行附近会有名为smdk_nand_part[]的结构体将其修改为:static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name = "Top-E:u-boot",.size = 0x40000,.offset = 0,},[1] = {.name = "Top-E:kernel",.offset = 0x40000,.size = 0x4c0000,},[2] = {.name = "Top-E:fs",.offset = 0x500000,.size = 0x3b00000,}};其中name为内核启动时的标注,内容可根据自己需要填写,便于自己他人识别。
offset为分区的起始地址,size为分区的大小。
如下图所示:三.制作镜像然后输入:#make zImage,就可以进行编译了,编译完毕后,会在内核源码的“arch/arm/boot/”目录下面生成名为“zImage”的镜像,利用mkimage工具把生成的zImage转换成uIamge,(可以直接烧写zImage启动,我比较习惯用uImage)使用命令:#./mkimage –A arm –O linux –T kernel –C none –a 30008000 –e 30008040 –n “linux kernel” –d arch/arm/boot/zImage uImage参数说明:-A 指定CPU 的体系结构:取值表示的体系结构alpha Alphaarm A RMx86 Intel x86ia64 IA64mips MIPSmips64 MIPS 64 Bitppc PowerPCs390 IBM S390sh SuperHsparc SPARCsparc64 SPARC 64 Bitm68k MC68000我们选arm-O 指定操作系统类型,可以取以下值:openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos我们选linux。