- 了解内核源码结构,了解内核启动过程
- 掌握内核配置方法
- 移植内核同时支持S3C2410、S3C2440
- 掌握MTD设备分区方法
- 掌握YAFFS文件系统的移植方法
准备:Linux内核下载:Linux内核官网
1、内核源码结构及Makefile分析
1.1 Linux内核源码结构
目录名 | 描述 |
arch | 体系结构相关的代码,对于每个架构的CPU,arch目录下有一个对应的子目录,比如arch/arm/、arch/i386/ |
block crtpto | 块设备的通用函数 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC加校验算法 |
drivers | 所有的设备驱动程序,里面每一个子目录对应一类驱动程序,比如/drivers/block/为块设备驱动程序,drivers/char/为字符设备驱动程序,drivers/mtd/为nor flash、nand flash等存储设备的驱动程序 |
fs | Linux支持的文件系统的代码,每个子目录对应一种文件系统,比如fs/jffs2/、fs/ext2/、fs/ext3/ |
include | 内核头文件,有几本文件(存放在/linux目录下面)、各种驱动和功能部件的头文件(比如include/media/、include/mtd、include/net/)、各种体系相关的头文件(比如include/asm-arm/、include/asm-i386/)。当配置内核后,include/asm/是某个include/asm-xxx/(比如include/asm-arm/)的链接 |
init | 内核的初始化代码(不是系统的引导代码),其中的man.c文件中的start_kernel函数是内核引导后运行的第一个函数 |
Kernel | 内核管理地核心代码,预处理其相关的代码位于arch/*/kernel/目录下 |
lib | 内核用到的一些函数代码,比如crc32.c、string.c,预处理其相关的库函数代码位于arck/*/lib目录下 |
mm | 内存管理代码,预处理其相关的内存管理代码位于arch/*/mm/目录下 |
security | 安全、密钥相关的代码 |
sound | 音频设备相关的代码 |
usr | 用来制作一个压缩cpio归档文件:initrd的镜像,他可以作为内核启动后挂接的第一个文件系统(一般用不到) |
Documentation | 内核文档 |
scripts | 用于配置内核、编译内核的脚本文件 |
1.2 Linux Makefile分析
2、内核移植
2.1 配置内核
1. 修改Makefile(/CROSS_COMPILE)
ARCH ?= arm
CROSS_COMPILE = arn-linux-
2. vi arch/arm/mach-s3c24xx/mach-smdk2440.c(保证波特率为115200)
//将 s3c24xx_init_clocks(16934400);
//改为 s3c24xx_init_clocks(12000000);
3. 内核分区
查找分区文件位置:grep "\Boot\Agent\" * -nR
修改分区:vi arch/arm/mach-s3c24xx/common-smdk.c
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,//MTDPART_OFS_APPEND:紧跟上一个分区
.size = SZ_128K,//注意是大写K
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,//MTDPART_SIZ_FULL:生下来所有空间
}
};
4. 使用默认配置
make s3c2410_deconfig
生成.config
5. 修改内核配置,使其支持EABI接口(可执行程序的二进制接口),进而支持jffs2镜像文件
make menuconfig
-> kernel Features
[*] Use the Arm EABI to Compile the kernel
6. make uImage
生成uImage位于arch/arm/boot/文件下面
2.2 下载内核到开发板(下面命令式把uImage下载到SDRAM里面)
tftp 0x30000000 uImage
或者
nfs 0x30000000 192.168.0.3:/home/ztaotao/work/uImage
2.3 修改机器ID
方法1. 在u-boot文件中更改默认的机器ID
cd board/samsung/smdl2440
将gd->bd->bi_arch_number = MACH_TYPE_SMDK2410(机器ID是16a)
该问gd->bd->bi_arch_number = MACH_TYPE_SMDK2440(机器ID是193)
方法2. 在u-boot启动界面设置machid
set machid 16a //smdk2440 mach-smdk2440.c
set machid 7cf //mini2440 mach_mini2440.c
//如果machid设置错误,启动时候打印:
//Error,unrecgnized/unsupported machid(r1 = ...)
2.4 设置u-boot启动参数
set bootargs console=ttySAC0,115200
save
bootm 0x30000000
正常启动(串口输出内核启动信息,由于没有挂载文件系统,所以会有错误)