【内核移植】编译内核文件uImage

本文围绕Linux内核展开,先分析了内核源码结构及Makefile,接着介绍内核移植步骤,包括配置内核、下载到开发板、修改机器ID和设置u-boot启动参数等,还提及掌握MTD设备分区和YAFFS文件系统移植方法,帮助读者了解内核启动过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


  • 了解内核源码结构,了解内核启动过程
  • 掌握内核配置方法
  • 移植内核同时支持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等存储设备的驱动程序
fsLinux支持的文件系统的代码,每个子目录对应一种文件系统,比如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

正常启动(串口输出内核启动信息,由于没有挂载文件系统,所以会有错误)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值