Linux内核移植
实验步骤:
(1)准备工作
(2)修改顶层Makefile
(3)修改falsh 分区
(4)配置编译内核
下面以Linux2.6.30.4内核移植到gec2440为例:
一、准备工作:
建立工作目录,下载内核源码并解压:linux-2.6.30.4.tar.bz2。步骤如下:
Mkdir
cd /root/build_kernel
tar -xvf linux-2.6.30.4.tar.gz
cd linux-2.6.30.4
解压后会在当前目录下生成一个linux-2.6.30.4 的内核源码目录
安装交叉工具链,然后修改环境变量,添加新工具链的路径信息,步骤如下:
#vi /etc/bashrc
在bashrc 脚本的最后一行添加工具链的路劲信息:
#export PATH=/usr/local/arm/4.1.2/bin:$PATH
使bashrc 脚本生效
#source /etc/bashrc
二、修改内核源码顶层 Makefile
修改内核目录树根下的的Makefile,指明体系结构是arm,交叉编译工具是arm-linux- 。
#vi Makefile
找到ARCH 和CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/4.1.2/bin/arm-linux-
保存退出。
三、修改机器码
在u-boot-2009.11 的/board/samsun/gec2440/gec2440.c 设置了MACH_TYPE 的类型为
MACH_TYPE_SMDK2410,查看u-boot 里的include/asm-arm/mach-types.h 文件,有下
面定义:
#define MACH_TYPE_SMDK2410 193
//针对2440 的MACH_TYPE 码的值定义为193
而linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
smdk2410 MACH_SMDK2410 SMDK2410 193
即u-boot 和linux 内核的同样类型的机器码都为193。
那么我们就修改kernel 的MACH_TYPE 代码引用部分,确定kernel 的MACH_TYPE。
如下,修改arch/arm/mach-s3c2440/mach-smdk2440.c :
//修改文件最后面
将MACHINE_START(S3C2440, "SMDK2440") 修改为:MACHINE_START(SMDK2410, "SMDK2440")
修改arch/arm/kernel/head.S
//在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0xc1 // MACH_TYPE_SMDK2410 值193 换成十六进制就是0xc1
ldr r2, =0x30000100 //Linux kernel parameter
第二种改法:
查linux 内核源码的arch/arm/tools/mach-types 文件有如下定义:
smdk2440 MACH_SMDK2440 SMDK2440 1008
做如下修改
# vi arch/arm/mach-s3c2440/mach-smdk2440.c
将MACHINE_START(S3C2440, "SMDK2440")修改为:MACHINE_START(SMDK2440, "SMDK2440")
修改arch/arm/kernel/head.S
//在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0x3f0 // MACH_TYPE_SMDK2440 值1008 换成十六进制就是0x3f0
ldr r2, =0x30000100 //Linux kernel parameter
这种改法中会出现如下问题:
定义在arch/arm/mach-s3c2410/mach-smdk2410.c 中的设备驱动没能链接进来。
四、设置 flash分区
1、找到修改的内核文件,此处需要修改以下文件:
arch/arm/plat-s3c24xx/common-smdk.c ;修改分区信息
2、确定内核分区表
3.1、修改分区信息(默认 8个分区,具体分区数目可以根据项目而定,本初设置为 3个)
vi arch/arm/plat-s3c24xx/common-smdk.c
修改内核分区信息(本示例分设四个分区)。
意义:要让内核知道nand flash 的分区信息,设置成跟bootloader 一致。修改如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "U-Boot",
.size = 16*SZ_16K, //分区大小256k
.offset = 0, // 本分区起始地址0x0
},
[1] = {
.name = "Kernel",
.offset = 16*SZ_16K, // 本分区起始地址0x40000
.size =3*SZ_1M, // 分区大小3M
},
[2] = {
.name = "Rootfs",
.offset = MTDPART_OFS_APPEND, // 紧接上一分区地址
// 本区起始地址0x340000
.size = MTDPART_SIZ_FULL, // 使用剩余全部空间
} //本分区大小0x3cc0000
}; // 62208K
name: 代表分区名字
size: 代表flash 分区大小(单位:字节)
offset: 代表flash 分区的起始地址(相对于0x0 的偏移)
保存退出。
另外在该文件中修改smdk_nand_info 如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls =0, //default is 20 参数设置需参看datasheet,上有描述
.twrph0 =30, //default is 60
.twrph1 =0, //defualt is 20
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
3.2、修改时钟 (终端输出若有乱码则需修改)
在arch/arm/mach-s3c2440/mach-smdk2440.c 中修改smdk2440_map_io 如下
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //default is 0
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.3、修改 nand Flash的校验方式,去掉 ECC校验,否则上电启动会提示ECC错误或者 I/O读取错误。
在drivers/mtd/nand/s3c2410.c 中
将chip->ecc.mode = NAND_ECC_SOFT; 改为 chip->ecc.mode = NAND_ECC_NONE;
五、配置编译内核
#make s3c2410_defconfig
#make menuconfig
在s3c2410_defconfig 基础上,增删的内核配置项如下:
这里约定“#”后面的是注释部分。
Boot options --> Default kernel command string:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 (接下行)
rootfstype=jffs2
#说明:mtdblock2 代表第3 个flash 分区,它是预设的rootfs 分区
# console=ttySAC0,115200 使kernel 启动期间的信息全部输出到串口0 上.
# 2.6 内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0 等
#接下来做的是针对文件系统的设置,实验时目标板上要上的文件系统是cramfs
与jffs2,故做如下配置
File systems -->
<> Second extended fs support
#去除对ext2 的支持
Miscellaneous filesystems -->
[*] JFFS2 XATTR support (EXPERIMENTAL)
#支持jffs2 和cramfs 文件系统
Network File Systems --> #支持NFS 文件系统
[ ] NFS client support for the NFSv3 ACL protocol extension
[*]NFS client support for NFS version 4 (EXPERIMENTAL)
<*> NFS server support
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
# 一定要选上, 否则会出现内核恐慌(内核指针跑飞)
保存退出,产生.config 内核配置文件,该文件会在make 的时候被调用。
编译内核:make
编译完成后会在arch/arm/boot/目录下生产zImage 内核映象。zImage 映象是可引导的,
压缩的内核映象,就是我们要移植到开发板上的内核映象文件。
uImage 镜像制作:
[root@localhost tools]# ./mkimage -n 'linux-2.6.30.4' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d /root/build_kernel/linux-2.6.30.4/arch/arm/boot/zImage /root/build_kernel/linux-2.6.30.4/arch/arm/boot/uImage
上述步骤仅添加了外设flash 与串口等一些基本的驱动,实现一个能在开发板上运行的内核镜像。根据项目要求,需要继续移植的还有:
CD、触摸DM9000 网卡、L 屏、USB、音频等驱动。
详细文档下载链接: http://download.csdn.net/detail/klcf0220/5749067
http://download.csdn.net/detail/klcf0220/5823991
S5PV210的Linux-2.6.35内核移植: http://download.csdn.net/detail/klcf0220/5751173
S5PV210的u-boot移植:http://download.csdn.net/detail/klcf0220/5823953
Linux内核移植的更多相关文章
- 【转】 linux内核移植和驱动添加(三)
原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- linux 内核移植和根文件系统的制作
1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1 Linux版本 Linux内核的版本号 ...
- 基于tiny4412的Linux内核移植 --- aliases节点解析
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 【转】 linux内核移植和网卡驱动(二)
原文网址:http://blog.chinaunix.net/uid-29589379-id-4708911.html 一,内核移植步骤: 1, 修改顶层目录下的Makefile ARCH ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...
- Linux内核移植到JZ2440
一.准备工作:1.Linux内核:Linux2.6.22.6,可从www.kernel.org上下载:2.交叉工具编译链:arm-linux-gcc-3.4.5-glibc-2.3.6:3.yaffs ...
随机推荐
- CRT&EXCRT 中国剩余定理及其扩展
前言: 中国剩余定理又名孙子定理.因孙子二字歧义,常以段子形式广泛流传. 中国剩余定理并不是很好理解,我也理解了很多次. CRT 中国剩余定理 中国剩余定理,就是一个解同余方程组的算法. 求满足n个条 ...
- A1050. String Subtraction
Given two strings S1 and S2, S = S1 - S2 is defined to be the remaining string after taking all the ...
- 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)
迭代器: l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) ...
- poj3070_斐波那契数列(Fibonacci)
用矩阵求斐波那契数列,快速幂log(n),只用求最后4位(加和乘的运算中前面的位数无用) #include <stdio.h> #include <stdlib.h> int ...
- (java保留n位小数)precise math function 北京信息科技大学第十届ACM程序设计竞赛 第2题
precise math function Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Othe ...
- sizeof 与 字节对齐
转:http://baike.baidu.com/view/1356720.htm sizeof是运算符,可用于任何变量名.类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号. ...
- maveb安装与配置(win10)
转载:https://www.cnblogs.com/eagle6688/p/7838224.html 看了几篇博客,感觉这篇博客写的含金量最高了,因为我电脑的系统是win10的,所以配置有细微的差别 ...
- 函数和常用模块【day06】:xml模块(六)
本节内容 1.简述 2.xml格式 3.xml节点操作 4.创建新的xml文件 一.简述 xml是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过,古时候 ...
- Oracle导出数据中的prompt,set feedback 等是什么意思
prompt 显示后面的提示,相当于一般的操作系统命令echo,输出后面的信息Importing table t_testset feedback off 1.set feedback 有三种方式: ...
- CentOS6.8下安装xz命令
我们有时候会下载到.xz结尾的压缩文件,这时候需要用到xz命令来解压这类文件,而当我们想要用yum -y install xz时,又没有关于xz的安装包,因此就找到一个xz的编译安装包进行编译安装. ...