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 ...
随机推荐
- 【洛谷P3224】永无乡 并查集+Splay启发式合并
题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...
- java -server 和 -client 的不同,及 java -server 时抛错原因
在dos窗口运行:java -server Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll' ...
- 浏览器中输入URL发生了什么
浏览器中输入URL会发生什么呢?这是我们经常会问到的一个问题. 我们知道的都是会发送http请求,服务端会处理请求给我们响应的结果,浏览器会渲染html 页面 但其实会遗漏掉一些比较重要的东西.下面的 ...
- JavaSE学习总结(十九)—— Java Web 综合应用(JSP、Servlet、IDEA、MySQL、JUnit、AJAX、JSON)
一.使用Servlet+JDBC+MySQL+IDEA实现商品管理 1.1.创建项目 打开IntelliJ IDEA开发工具.点击Create New Project创建一个新的Web项目 选择Jav ...
- Tarjan 模板,高级并查集
第一个模板有误!!!! 请见谅!!! 要怪就怪HDU吧,竟然让我过了 第二个模板是正确的.请翻到下面看更新 HDU 1269 评论区居然有人说用并查集过了,其实回想一下 求无向图的连通分量,就是并查集 ...
- 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子
有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...
- WCF开发实战系列四:使用Windows服务发布WCF服务
WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...
- java代码示例(6-3)
创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...
- 获取天气预报API5_统计最容易生病时间段
sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...
- POJ - 1905 Expanding Rods(二分+计算几何)
http://poj.org/problem?id=1905 题意 一根两端固定在两面墙上的杆,受热后变弯曲.求前后两个状态的杆的中点位置的距离 分析 很明显需要推推公式. 由②的限制条件来二分角度, ...