kernel mtd 分区与UBOOT 分区的理解

今天做内核移植,准备添加NAND flash的驱动,做到MTD分区时,想起在一本书上看到的一句话,说的是分区时每个区之间没有间隙,前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时,分区如下:

static struct mtd_partition smdk_default_nand_part[] = {

      [0] = {

           .name     = "uboot",

           .offset = 0x00000000,

           .size     = 0x00040000,

      },

      [1] = {

           .name     = "kernel",

           .offset = 0x00200000,

           .size     = 0x00300000,

      },

      [2] = {

           .name     = "yaffs2",

           .offset = 0x00500000,

           .size     = MTDPART_SIZ_FULL

      }

};

很显然,在uboot和kernel分区中存在间隙,心中产生了疑问,难道MTD分区的时候要有注意的问题?通过各方查找资料和查阅书籍,找到了原因。不对的地方还请大家指正。

 

        首先说一下Linux下固态存储设备(NAND flash算其中一种)对系统组件的安排方式,一般为

 

引导加载程序

 

引导参数

 

内核

 

根文件系统

 

也就是说,在NAND flash中,各部分的程序是这样安排的,但哪一端是高地址是依体系结构不同而不同的,对于ARM,引导加载程序在最低地址处,因此,无论是uboot的分区还是内核MTD分区,引导加载程序的分区都放在了最低地址处。那么,两个分区到底怎么联系起来,而我们又该怎么设置MTD分区呢?先给出我的开发板uboot的分区信息:

 

bootargs=noinitrd root=/dev/mtdblock2  init=/linuxrc console=ttySAC0

mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)

 

       然后说一下MTD分区,这个分区是内核可以识别的分区,也就是说,内核的操作都是基于MTD分区的;而uboot的分区只是为了方便操作,例如,我想将内存中0x30000000地址处的内容写到NAND flash的偏移量为2M的地址处,即uboot分区中kernel的起始位置,一般情况,我们要写

nand write 0x30000000 0x00200000

但如果有了uboot的分区,我们可以写

nand write 0x30000000 kernel

 

        说清上面的问题,为了进一步阐述后面的问题,这里再讲一下我对uboot引导过程的理解,当系统启动后,uboot开始执行,他分两个阶段完成工作,主要是一些初始化,然后,加载内核并传递内核参数,之后跳入内核执行,内核完成它的初始化工作,其中包括挂载文件系统。

 

       现在,我们可以翻回头看上面程序中的MTD分区了。MTD分区中的uboot分区明显对应了uboot分区中的bios分区(从0开始,大小为128K),而MTD分区中的kernel和yaffs2分区的起始地址和大小也分别对应uboot分区中的kernel和root分区。而因为我们不需要uboot分区中的其他部分,所以在MTD分区中出现了这一部分空隙。但为什么这么安排呢?

 

       回想我们在烧写程序时候的操作,比如我们选择烧写内核镜像,此时,uboot实际执行了一条语句,类似于

 

#define kernel 0x00200000

memcpy(kernel,0x30000000,SZ_3M)

 

       这里我们烧写程序的入口地址是0x30000000,也就是说,uboot的下载模式将我们烧写到内存0x30000000处的数据,搬到了NAND flash的kernel处,保存了起来,因此,这里要清楚,我们烧写程序时,实际是将程序先烧写到了内存当中,然后由内存搬运到NAND flash中,如果此时我们的MTD分区与uboot中的分区是一致的,那么内核将来运行时可以很方便的找到内核程序所在的位置,同样,对文件系统的yaffs2分区也是如此,而且,与内核分区相比,文件系统的分区将显得更加重要,因为将直接影响到根文件系统能否挂载,这里是因为上面提到的一行

 

bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

 

       这里,uboot指定了根文件系统的代码来自于mtdblock2,也就是MTD分区的第三个分区(第一个编号为0),也就是我上面说到的,uboot完成初始化后,加载内核,而内核要完成文件系统的挂载,他从哪里找文件系统?就是这里!/dev/mtdblock2!

       所以,现在我们看到,MTD分区的原因,而且最关键的在这里,其他分区如果与uboot的分区不一致还情有可原,但如果MTD分区中文件系统的分区与uboot中的root分区不一致,将会直接导致系统无法启动!

当然,之前操作的都是物理地址,当内核真正运行起来以后,将开始使用虚拟地址。

同样的,其他几个引导参数也应该得到满足,系统才可能正常运行起来

init=/linuxrc   init进程的位置。

console=ttySAC0  终端对应tty设备,因此,在引导系统前,串口驱动移植应当完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运放的主要参数详细介绍

1. 引言 运放的作用是调节和放大模拟信号,它是用途十分广泛的器件,接入适当的反馈网络,可用作精密的交流和直流放大器、有源滤波器滤波器、振荡器振荡器及电压比较器。其应用领域包括但不限制通讯、电子、汽车、工业检测等等,并将…

FastDFS 文件上传工具类

FastDFS文件上传工具类 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;import org.csource.fastdfs.StorageClient1;import org.csource.fastdfs.StorageServer;import org.csource.fastdfs.TrackerClient;import org.csource.fastdfs.Tra…

MOS管的主要参数与重要特性

双极性晶体管:NPN和PNP管; 单极性晶体管:场效应管(MOSFET和JFET); MOS管相对三极管具有速度快、输入阻抗高、噪声低、动态范围大、功耗小、容易集成等优点。 下面总结下其主要参数与重要特性&#xff0c…

【Codeforces Round #430 (Div. 2) B】Gleb And Pizza

【链接】点击打开链接 【题意】 在这里写题意【题解】 根据圆心到原点的距离这个东西判断一下圆在不在那个环里面就好【错的次数】 0【反思】 在这了写反思【代码】 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #…

垂直居中方法总结

<style>#box{position: absolute;margin: auto;top:0px;right: 0px;bottom: 0px;left: 0px;width: 100%;height: 30%;background-color: red;text-align: center;} </style> <body><div id"box"><h1>文字居中</h1></div> …

NAND 坏块管理

NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH为例&#xff0c;一片Nand flash为一个设备(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 数据块大小(512Bytes) OOB 块大小(16Bytes&…

js备忘录模式——实现分页点击已经请求过上一页的数据(读js设计模式)

例子&#xff1a;新闻数据实现分页||点击下一页后又点击上一页后不用再次请求数据&#xff0c;避免资源浪费&#xff0c;网速不好&#xff0c;用户体验效果差 备忘录模式&#xff1a;在不破坏对象的封装性的前提下&#xff0c;在对象之外捕获并保存该对象内部的状态以方便日后对…

运放的典型电路举例与计算仿真

运放电路的计算&#xff0c;通过记各种公式很难记住&#xff0c;但是掌握其两个重要概念&#xff0c;所有计算均可迎刃而解。 那就是运放的两个重要特性&#xff1a; 虚断&#xff1a;运放本质特性&#xff0c;输入阻抗大&#xff0c;两个输入端视为等效开路&#xff1b; 虚…

【SPOJ 694】Distinct Substrings (更直接的求法)

【链接】h在这里写链接 【题意】 接上一篇文章【题解】 一个字符串所有不同的子串的个数∑(len-sa[i]-height[i])【错的次数】 0【反思】 在这了写反思【代码】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每个数字的最大…

HTML-锚点

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>锚点</title> <style> .box1,.box2{ height: 600px; border:1px solid; } </style> </head> <body> <a h…

/dev/mtdN和/dev/mtdblockN的区别

1、/dev/mtdn是linux中的MTD架构中&#xff0c;系统自己实现的mtd分区所对应的字符设备&#xff0c;其里面添加了一些ioctl&#xff0c;支持很多命令&#xff0c;如MEMGETINFO&#xff0c;MEMERASE等。 而mtd-util中的flash_eraseall等工具&#xff0c;就是以这些ioctl为基础而…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019独角兽企业重金招聘Python工程师标准>>> 对于不同的计算机体系结构&#xff0c;设备可能是端口映射&#xff0c;也可能是内存映射的。如果系统结构支持独立的IO地址空间&#xff0c;并且是端口映射&#xff0c;就必须使用汇编语言完成实际对设备的控制&#xff…

三极管基本参数介绍与放大电路分析

全称为半导体三极管&#xff0c;也称双极型晶体管、晶体三极管&#xff0c;是一种电流控制电流的半导器件&#xff0c;作用是把微弱信号放大成幅度值较大的电信号&#xff0c; 也用作无触点开关。 两个PN结的排列方式有两种&#xff1a;PNP和NPN。 三个端点依序称为射极&#…

Nand分区及nand erase简解

我的nand flash 32M&#xff0c;kernel 2.6.18, rootfs is emb linux, cramfs.nand flash分区如下&#xff1a;static struct mtd_partition nand_partitions[] {/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */{.name "bootloader",.offset 0,.size 32…

eclipse启动了tomcat,但是浏览器打不开欢迎页

tomcat在eclipse中启动成功&#xff0c;主页却打不开 症状&#xff1a; tomcat在eclipse里面能正常启动&#xff0c;而在浏览器中访问http://localhost:8080/不能访问&#xff0c;且报404错误。同时其他项目页面也不能访问。 关闭eclipse里面的tomcat&#xff0c;在tomcat安装目…

洛谷1011 车站

水题。题目描述有坑&#xff0c;可以先根据样例手算试一试//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn50; int f[50],…

三极管放大电路三种类型

根据三极管三个电极与输入输出端子的连接方式&#xff0c;可归纳为三种&#xff1a;共发射极电路、共基极电路和共集电极电路&#xff1b; 三种电路的共同点&#xff1a;各有两个回路&#xff0c;一个输入回路一个输出回路&#xff0c;两个回路有一个公共 端&#xff0c;而公…

ImportError: No module named 'chardet'

1.使用requsets出现这个错误&#xff0c;ImportError: No module named chardet 原因&#xff1a;requests依赖其他一些模块 解决&#xff1a;依次使用pip安装即可 pip install certifi pip install chardet pip install idna pip install urllib3转载于:https://www.cnblogs.c…

各种组件的js 获取值 / js动态赋值

jQuery获取Select选择的Text和Value:语法解释&#xff1a;1. $("#select_id").change(function(){//code...}); //为Select添加事件&#xff0c;当选择其中一项时触发2. var checkText$("#select_id").find("option:selected").text(); //获取…

Linux下/proc目录简介

1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统&#xff0c;在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 用户…