ARM-Linux内核移植之(二)——Linux2.6.22内核移植
平台:mini2440 交叉工具链:arm-linux-gcc-4.3.2
一、内核移植基本知识
移植内核也叫构建BSP(boardsupprot packet)。BSP的作用有两个:一是为内核运行提供底层支持,二是屏蔽与板相关的细节。
BSP的构建分三个层次
1、体系结构层次
对一些体系结提供linux内核支持,比如说ARM,X86等芯片。这一类工作一般在arc/xxx/下面额除了palt-xxx和mach-xxx目录的其他目录完成。
2、SOC层次
对一些公司提供的SOC微处理器提供linux内核支持,比如说三星公司的 S3C2440。这一类工作一般在arch/xxx/plat-xxxxarch/xxx/mach-xxxx目录下完成。我们可以看到在arch/arm/目录下同时有plat-s3c24xx和mach-s3c2440两个目录,这样做是因为plat-s3c24xx目录下存放了所有s3c24系列相同的代码,mach-s3c2440则只存放了与S3C2440有关的代码。
2,板级层次
这是我们一般的菜鸟要做的,上面两个层次一般有芯片公司的大牛完成了,但是不同的电路板的板级层次则需要由我们菜鸟完成的。这一类工作主要在mach-xxxx/目录下面的板文件完成,比如说mach-s3c2440/smdk-s3c2440.c这个S3C2440标准板文件。很多文档很多书籍都都直接在这个文件里面进行修改,这样是不对的,对于不同的电路板应该建立不同的板文件,比如说我的是mini2440,就应该建立一个smdk-mini2440.c文件或者mach-mini2440.c文件在mach-s3c2440下面。如果直接在里面修改是非常不规范的做法,这样不是在移植内核,这样是在破坏内核!(这一句是宋宝华说的)。
下面开始移植。
二、BSP构建
1.建立板文件支持
这一步我会重新建立一个板文件mach-mini2440.c,而不是直接在smdk-s3c2440.c里面修改,这样或许麻烦一些,但是为了保持对内核尊重的态度和规范的做法,认为应该这样做。
如果我们重新建立一个空的板文件将会导致大量的工作量,幸运的是smdk-s3c2440.c文件已经帮我们做了大量的工作,我们直接拷贝过来命名为mach-mini2440.c
cp arch/arm/mach-s3c2440/smdks3c2440.c arch/arm/mach-s3c2440/mach-mini2440.c
修改arch/arm/mach-s3c2440/mach-mini2440.c文件将MACHINE_START宏括号里面的名字换成ID换成MINI2440,名字随便取,我们取“MINI2440”,这个ID最终会被扩展为MACH_TYPE_MINI2440,然后到arch/arm/tools/mach_types里面找对应的ID号,所有做完以这一步我们要在mach_types添加我们机器的ID
MACHINE_START(MINI2440,"MINI2440")
/*Maintainer: Ben Dooks <ben@fluff.org> */
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18)& 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
然后在mach_types里面添加我们机器的ID,再最后一行添加
mini2440 MACH_MINI2440 MINI2440 1999
第一个表示机器名字,这个也随便取,第二个在Kconfig配置项里面定义的宏名称,下面一步我们会定义到,我们取名为MACH_MINI2440,第三表示MACH_START第一个参数ID名字,第四个是ID号。ID号我们取为1999。
修改arch/arm/mach-s3c2440/目录下的Kconfig和Makefile,以建立内核对板文件的支持使其可以被配置和编译进内核。
首先修改Kconfig,在endmenu之前加入下面的内容:
87 config MACH_MINI2440 // 开发板名称宏定义
88 bool "mini2440" // 开发板名称
89 select CPU_S3C2440 // 开发板使用的处理器类型
90 help
91 Say Y here if you are using the mini2440. // 帮助信息
再修改Makefile
obj-$(CONFIG_MACH_MINI2440)+= mach-mini2440.o
注意这一行要添加在obj-$(CONFIG_ARCH_S3C2440)+= smdk-s3c2440.o后面,否则会编译错误。
这样我们就可以通过makemenuconfig配置mini2440的板文件是否编译进内核。
我们再跳到linux-2.6.22目录,执行makemenuconfig
执行加载默认配置文件后,可以开始配置新增加的菜单。进入System Types菜单项,打开S3C24XX Implementations菜单,出现一个目标开发板的列表:
[ ] Simtec ElectronicsBAST (EB2410ITX)
[ ] IPAQ H1940
[ ] Acer N30
[ ] SMDK2410/A9M2410
[ ] SMDK2440
[ ] AESOP2440
[ ] Thorcom VR1000
[ ] HP iPAQ rx3715
[ ] NexVision OTOM Board
[ ] NexVision NEXCODER2440 Light Board
[ ] mini2440
选中mini2440选项
然后执行makezImage,如果能够正常编译,已经能够将mini2440板文件编译进内核了。如果不行,请检查上述步骤。
2.修改机器码
将编译在arch/arm/boot下面生成的zImage烧写到nand的kernel分区,然后启动。
Copylinux kernel from 0x00060000 to 0x30008000, size = 0x00500000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "console=ttySAC0 root=/dev/nfsnfsroot=192.168.1.101:/home/work/shiyan/rootfsip=192.168.1.102:192.168.1.101:192.168.1.1:255.255.255.0:mini2440:eth0:off"
MACH_TYPE = 362
NOW, Booting Linux......
UncompressingLinux.................................................................................................done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x0000016a).
内核提示不能识别的机器ID,于是修改bootloader的参数使其机器ID为1999,我用的是supervivi使用命令set parammach_type 1999
3.修改时钟源频率
启动内核,出现一系列的乱码,这是因为时钟源设置的不对,我的开发板用的是12M的晶振,所以在arch/arm/mach-s3c2440.c的s3c24xx_init_clocks(16934400);处将16924400修改为12000000。即改为s3c24xx_init_clocks(12000000);
4.添加nand分区信息
再启动,发现还是不能启动,这是因为内核中填写的nand分区信息不对。于是修改nand分区信息,很多人的做法是直接修改arch/arm/plat-s3c24xx/Common-smdk.c文件里面的smdk_default_nand_part数据结构,这样是不提倡的做法,因为还是那句话,破坏了内核。我们应该再arch/arm/mach-s3c2440/mach-mini2440.c文件中建立我们自己板文件的nand信息。我们在mach-mini2440.c的staticstruct platform_device
*smdk2440_devices[]前面添加
static struct mtd_partition smdk_default_nand_part[] = {
/*这里面填的是我用的mini2440分区信息*/
[0] = {
.name = "patition1 supervivi",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "patition2 param",
.offset =0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "patition3 kernel",
.offset =0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "patition4 root",
.offset = 0x00560000,
.size = 64*1024*1024,
},
[4] = {
.name = "patition5 nand",
.offset = 0,
.size = 64*1024*1024,
},
};
static struct s3c2410_nand_set smdk_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(smdk_default_nand_part),
.partitions = smdk_default_nand_part,
},
};
再修改mach-mini2440.c的smdk2440_machine_init函数,将我们的nand传给给nand设备
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);
/*将我们的nand信息传给nand设备*/
s3c_device_nand.dev.platform_data= &smdk_nand_info; //set nand infoto nand
platform_add_devices(smdk2440_devices,ARRAY_SIZE(smdk2440_devices));
//smdk_machine_init();
//smdk_machine_init()函数屏蔽,因为他会将arch/arm/plat-s3c24xx/Common-smdk.c里面的分区信息传给nand,这样我们的自己的nand信息就被覆盖了
s3c2410_pm_init();//添加加这个函数是因为smdk_machine_init()里面调用了。
}
再修改mach-mini2440.c的smdk2440_devices
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_nand,//向内核添加nand设备
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
};
6.添加YAFFS文件系统支持
完成上述步骤工作后,还是不能正常挂载根文件系统,因为内核还没对yaffs文件系统进行支持。
下载cvs-root-yaffs.tar.gz补丁包文件,解压,运行yaffs2文件夹里面的脚本文件patch-ker.sh来给内核打补丁,用法如下
Usage: ./patch-ker.sh c/l kernelpath
if c/l is c,then copy, if l then link
如果是l则yaffs2源码被链接到内核,如果是c则复制
我们运行./patch-ker.sh c work/kernel_make/linux2.6.22
给内核打上yaffs2补丁,然后使用makemenuconfig配置内核使其支持yaffs2文件系统
File systems --->
Miscellaneous filesystems --->
<*>YAFFS2 file system support
7.配置内核支持EABI接口
完成上面的步骤之后运行,内核会在输出
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 132K
之后卡住,这个打印反应出内核实际上已经挂接上了根文件系统,之所以卡在这里是因为无法启动根文件系统上的init进程。是由于内核和根文件系统的应用程序的接口不一致。所以在内核中使用make menuconfig配置EABI支持
Kernel Features --->
Memory split...--->
[ ]preemptible Kernel...
[*]Use the ARM EABI to compile thekernel
[*] Allow old ABI binaries to run......
Memory model(flatMemory)--->
[ ]Add lru list to tarcknon-evictable pages
ARM-Linux内核移植之(二)——Linux2.6.22内核移植的更多相关文章
- linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)
一.介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion.重写了 writeback 代码.改进了 Btrfs 文件系统.添加了 ATI ...
- linux2.6.30.4内核移植(2)——Nand Flash驱动移植
内核源码:linux2.6.30.4 交叉编译工具:3.4.5 移植linux内核至:TQ2440 工作基础:http://www.cnblogs.com/nufangrensheng/p/36696 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Linux内核分析(二)----内核模块简介|简单内核模块实现
原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某 ...
- Linux内核剖析(二)Linux内核绪论
什么是内核 内核是操作系统最基本的部分.它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间.内核的分类可分为单内核和双内 ...
- 【内核】linux2.6版本内核编译配置选项(二)
目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s ...
随机推荐
- C# 语言版本
(摘自:维基百科)https://en.wikipedia.org/wiki/C_Sharp_(programming_language) Versions Version Language spec ...
- <mvc:default-servlet-handler/>的作用
优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...
- 一步一步写jQuery插件
转载自:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquer ...
- hdu-5117 Fluorescent(状压dp)
题目链接: Fluorescent Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Oth ...
- I.MX6 Android 设备节点权限
/********************************************************************************** * I.MX6 Android ...
- 伪元素:target
:target 伪类选择器 :target 是 CSS3 新增的一个伪类,可用于选取当前活动的目标元素.当 URL 末尾带有锚名称 #,就可以指向文档内某个具体的元素.这个被链接的元素就是目标元素(t ...
- RabbitMQ学习系列三-C#代码接收处理消息
RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...
- kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance
from:http://www.jianshu.com/p/5aa8776868bb kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance 时之结绳 ...
- 【操作系统】总结五(I/O管理)
输入输出管理本章主要内容: I/O管理概述(I/O控制方式.I/O软件层次结构)和I/O核心子系统(I/O调度概念.局速缓存与缓冲区.设备分配与回收.假脱机技术(SPOOLing)). 5.1 I/O ...
- Django-rest-framework多条件查询/分页/多表Json
http://www.mamicode.com/info-detail-1648765.html