nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?
我用的是ramdisk.image.gz,烧写在flash的0x10140000处
我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的?
如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊?
答:
你的问题,要分2方面和你解释:
1.将这个文件映射成/目录及各子目录的
不是将这个文件映射根目录成及各子目录的,
而是对应的根文件系统,简称rootfs(root file system),
对应着/根目录及其各个子目录和文件。
发现要解释清楚,要简单说清楚整个系统启动的过程:
【系统启动过程简介】
初始化代码读取uboot到内存里面,然后跳转到uboot那里去执行uboot,
uboot初始化必要的硬件,加载一些驱动,其中包括nand flash的驱动,
然后根据你的uboot里面设置的一个启动命令:
nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
意思就是,先去读取nand flash,从0x100000开始,长度为0x200000的数据到memory的0x30007FC0处,
然后bootm表示从memory的0x30007FC0开始运行。
也就是去运行你的内核镜像了。
此处也就是你的ramdisk.image.gz。
而你的地址是0x10140000,所以,上面中的启动命令,至少0x100000要改成你的地址0x10140000。
然后,内核会自己解压缩,然后执行,
初始化硬件,
加载驱动模块,
最后去挂载rootfs,
而此文件系统是什么格式的,是从uboot里面定义的:
#define CONFIG_BOOTARGS "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
并在从uboot掉转到内核运行时候,传递给内核的,
这样内核在加载rootfs的时候,才知道,要以什么格式,比如上面的yaffs2格式,
去加载此文件系统。
此文件系统,也是你实现自己用相应的文件系统制作工具,制作的,然后烧写到对应的位置的。
上面中root=/dev/mtdblock2,表示,要去/dev/mtdblock2,也就是你的mtd的第3个分区,去加载。
而这里的mtd的第3个分区具体对应的nand flash中的的地址,
是你在内核中,一般是在core.c自己定义的的nand flash的分区。
一般是uboot是第一个分区,内核kernel是第二个,然后就是rootfs是第三个分区,也就是/dev/mtdblock2。
随便网上给你找个别人的分区:
static struct mtd_partition rm9200_partitions[3] =
{
{ /* uboot 256K */
.name = "uboot",
.size = 0x40000,
.offset = 0
},
{ /* kernel 1.768M */
.name = "kernel",
.size = 0x1C0000,
.offset = 0x40000
},
{ /* rootfs 2M */
.name = "rootfs",
.size = 0x200000,
.offset = 0x200000
},
};
如果按照上面分区,定义的/dev/mtdblock2的起始地址是0x200000,还算成大小是2M的位置,
然后,内核启动挂载rootfs的时候,就是,以上面从uboot传过来的参数中yaffs2格式,
到nand flash 的2M的地址读取并加载rootfs,
加载完成后,这样,里面对应的,你说的根目录,以及所有的文件,文件夹就都可以识别了。
然后才会去读取并运行初始化脚本相关的东西,
最后初始化console控制台,然后你才能看到那个常见的#,才可以输入命令,比如ls,才可以和系统交互。
所以,你说的位置或地址如何映射成/根目录的,实际就是这个rootfs,对应着mtdblock2,
对应的某个nand flash上的地址,比如此处的2M的地方。而不是内核kernel这个文件映射的。
内核kernel,对应着是分区里面的mtdblock1,比如上面的地址0x40000。
2.
如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊?
如果地址变化了,那么
uboot中定义的启动参数:
nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
中的0x100000就要换成你的新的地址就可以了。
例子,kermit烧写
Linux 系统的烧写
Uboot的烧写***烧写内核***烧写文件系统
1> Uboot的烧写(把Uboot写入NAND-FLASH中地址0x30000000)
步骤:
把开发板与PC机连接好
打开H-JTAG中的H-Flasher
·在1.Flash-Selection中的NAND-FLASH中选择S3C2440+K9F1G08
·在2.Configuration中的RAN Start Address中写入0x30000000
·在5.Programming中选择Check(擦除),Reset(复位)
·在Program中选择目标文件最后选择Program进行烧写。
2>在超级终端中操作:
指定内存中内核地址为0x33000000,内核在Nand起始地址为0x60000 ,大小为0x3a0000.
内存中文件系统地址为0x30008000,文件系统在Nand起始地址为0x500000 ,大小为0x3e00000.
串口烧写:
命令步骤:
1>烧写内核
loadb 0x33000000 //通过串口下载内核
//同时在超级终端的发送框中以kermit协议发送uImage文件
nand erase 0x60000 0x3a0000 //擦除指定的flash区域
nand write 0x33000000 0x60000 0x3a0000
//将指定的内存区域内容写至flash指定位置
2>烧写文件系统
loadb 0x30008000 //通过串口下载文件系统
//同时在超级终端的发送框中以kermit协议发送root.cramfs文件
nand erase 0x500000 0x3e00000 //擦除指定的flash区域
nand write 0x30008000 0x500000 0x3e00000
//将指定的内存区域内容写至flash指定位置
3>设置环境变量
setenv bootargs root=/dev/mtdblock2 console=ttySAC0 init=/linuxrc
saveenv //保存变量设置
reset //重启
4>开启Linux系统
nand read 0x33000000 0x60000 0x3a0000
//从指定的flash区域读到内存指定位置
bootm 0x33000000 //引导uImage内核
5>进入系统
网络烧写:
命令步骤:
先用printfenv查看一下设备的server IP
把PC机IP修改成server IP 打开tftp服务器
1>烧写内核
tftp 0x33000000 uImage
//通过网口下载内核发送uImage文件
nand erase 0x60000 0x3a0000 //擦除指定的flash区域
nand write 0x33000000 0x60000 0x3a0000
//将指定的内存区域内容写至flash指定位置
2>烧写文件系统
tftp 0x30008000 root.cramfs
//通过网口下载文件系统发送root.cramfs文件
nand erase 0x500000 0x3e00000 //擦除指定的flash区域
nand write 0x30008000 0x500000 0x3e00000
//将指定的内存区域内容写至flash指定位置
3>设置环境变量
setenv bootargs root=/dev/mtdblock2 console=ttySAC0 init=/linuxrc
saveenv //保存变量设置
reset //重启
4>开启Linux系统
nand read 0x33000000 0x60000 0x3a0000
//从指定的flash区域读到内存指定位置
bootm 0x33000000 //引导uImage内核
5>进入系统
nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?的更多相关文章
- Linux第三周——跟踪分析内核的启动过程
跟踪分析内核的启动过程实验 张潇月<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这周主要学习的是对内核 ...
- linux内核学习之三 跟踪分析内核的启动过程
一 前期准备工作 1 搭建环境 1.1下载内核源代码并编译内核 创建目录,并进入该目录: 下载源码: 解压缩,并进入该目录:xz -d linux-3.18.6.tar.xz tar ...
- 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点
跟踪分析Linux内核的启动过程 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.stud ...
- Linux内核分析之跟踪分析Linux内核的启动过程
一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-/arch/x86/boot/bzImage -initrd rootfs.img ...
- 通过gdb调试分析Linux内核的启动过程
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验流程 1.打开环境 执 ...
- 跟踪分析Linux内核的启动过程
潘俊洋 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.准备 搭建环境 1 2 ...
- 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结
实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...
- Linux内核分析 实验三:跟踪分析Linux内核的启动过程
贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...
- 跟踪分析Linux内核的启动过程小解
跟踪分析Linux内核的启动过程 “20135224陈实 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
随机推荐
- xcode 执行时模拟器不可选的问题
好久没写博客了,上一次是什么时候都想不起来了. 之前总认为脑袋记住了,用过了就能够了,干嘛要写博客,简直浪费时间.事实上没事写写博客优点还是挺多的.这样既能够对自己用过的和学到的东西做一个总结,也能提 ...
- POJ 3694 LCA
题意:有N台电脑,他们之间有M条无向边. 然后询问,每次在他们之间加一条边,剩余的桥有多少. 思路:其实这题都不需要缩点了.. 直接记录每条桥的位置,然后每次询问进行一次LCA,当询问到桥时,桥数减1 ...
- .NET中反射机制的使用与分析
.NET中反射机制的使用与分析 [日期:2008-06-30] 来源: 作者:志伟 .NET反射的定义:审查元数据并收集关于它的类型信息的能力. 元数据是一种二进制信息,用以对存储在公共语言 ...
- Apache 2.4.7在CentOS6.4中安装配置反向代理解决单外网IP对应多个内网主机的方法实践
欢迎转载,转载时请保留全文及出处. Apache 2.4.7在CentOS6.4中安装配置反向代理解决单外网IP对应多个内网主机的方法实践 Apache安装 下载源程序(http://httpd.ap ...
- BlockingQueue
BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html BlockingQueue深入分析 http://blog.cs ...
- POJ 2455 Secret Milking Machine (二分 + 最大流)
题目大意: 给出一张无向图,找出T条从1..N的路径,互不重复,求走过的所有边中的最大值最小是多少. 算法讨论: 首先最大值最小就提醒我们用二分,每次二分一个最大值,然后重新构图,把那些边权符合要求的 ...
- Qt 'void QWidget::show()' is inaccessible
今天在编写Qt窗体头文件时,尽然碰到了这样的报错,'void QWidget::show()' is inaccessible,'QWidget' is not an accessible base ...
- chisel中pviews命令无法使用
chisel是用Python写的LLDB调试器插件,用来调试iOS应用非常方便,相关下载安装链接如下:https://github.com/facebook/chisel.本人安装之后,在xcode里 ...
- android 利用重力感应监听 来电时翻转手机后静音。
在CallNotifier.java中 加入如下代码: public void GetSensorManager(Context context) { sm = (SensorManager) ...
- DOM 对象之 document.all
1.document.all是页面内所有元素的一个集合: 2.经测试在chrome,safari,opera,ie中均返回一个HTMLALLCollection[xx]对象,在FF中返回是一个unde ...