实验步骤:
(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内核移植的更多相关文章

  1. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

  2. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  3. linux 内核移植和根文件系统的制作

    1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起. 1.1.1  Linux版本 Linux内核的版本号 ...

  4. 基于tiny4412的Linux内核移植 --- aliases节点解析

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  5. 基于tiny4412的Linux内核移植 -- 设备树的展开

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  6. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  7. 【转】 linux内核移植和网卡驱动(二)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708911.html 一,内核移植步骤: 1, 修改顶层目录下的Makefile ARCH       ...

  8. 基于tiny4412的Linux内核移植 -- 设备树的展开【转】

    转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...

  9. Linux内核移植到JZ2440

    一.准备工作:1.Linux内核:Linux2.6.22.6,可从www.kernel.org上下载:2.交叉工具编译链:arm-linux-gcc-3.4.5-glibc-2.3.6:3.yaffs ...

随机推荐

  1. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  2. java -server 和 -client 的不同,及 java -server 时抛错原因

    在dos窗口运行:java -server Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll' ...

  3. 浏览器中输入URL发生了什么

    浏览器中输入URL会发生什么呢?这是我们经常会问到的一个问题. 我们知道的都是会发送http请求,服务端会处理请求给我们响应的结果,浏览器会渲染html 页面 但其实会遗漏掉一些比较重要的东西.下面的 ...

  4. JavaSE学习总结(十九)—— Java Web 综合应用(JSP、Servlet、IDEA、MySQL、JUnit、AJAX、JSON)

    一.使用Servlet+JDBC+MySQL+IDEA实现商品管理 1.1.创建项目 打开IntelliJ IDEA开发工具.点击Create New Project创建一个新的Web项目 选择Jav ...

  5. Tarjan 模板,高级并查集

    第一个模板有误!!!! 请见谅!!! 要怪就怪HDU吧,竟然让我过了 第二个模板是正确的.请翻到下面看更新 HDU 1269 评论区居然有人说用并查集过了,其实回想一下 求无向图的连通分量,就是并查集 ...

  6. 洛谷 P3159(BZOJ 2668)[CQOI2012]交换棋子

    有一个\(n\)行\(m\)列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子,最终达到目标状态.要求第\(i\)行第\(j\)列的格子只能参与\(m[i][j]\)次交换 ...

  7. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  8. java代码示例(6-3)

    创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...

  9. 获取天气预报API5_统计最容易生病时间段

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  10. POJ - 1905 Expanding Rods(二分+计算几何)

    http://poj.org/problem?id=1905 题意 一根两端固定在两面墙上的杆,受热后变弯曲.求前后两个状态的杆的中点位置的距离 分析 很明显需要推推公式. 由②的限制条件来二分角度, ...