启动参数bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0中kernel在哪定义,为什么可以直接引用?针对这个问题展开思考最终定位到了MTD分区的实现。 在u-boot之start_armboot函数分析中提到过实现nand flash的分区。执行run_command("mtdparts default", 0)可以实现分区功能,run_command函数在u-boot之内核是怎么启动的已经详细介绍过,现在只是说明mtdparts命令的执行函数do_jffs2_mtdparts,它位于Cmd_jffs2.c (common)文件下。

1、环境变量的初始化

2、mtdparts default命令分析(实现分区)

3、nand read.jffs2 0x30007FC0 kernel命令中kernel的值

1、环境变量的初始化

环境变量的初始化在u-boot之start_armboot函数分析的时候已经粗略的提及过,但是没有具体分析,现在接着详细分析下,首先是在初始化数组中初始化的环境变量:

env_init,        /*initialize environment*///初始化环境变量,采用默认环境变量  by andy

具体的函数为:

    int env_init(void)
{#if defined(ENV_IS_EMBEDDED)//ENV_IS_EMBEDDED表示环境变量存放在ram中,不存储在flash上
/****此处省略******/
#else /* ENV_IS_EMBEDDED */gd->env_addr  = (ulong)&default_environment[0];//取得默认的环境变量地址gd->env_valid = 1;                             //环境变量已经存在标志
#endif /* ENV_IS_EMBEDDED */return (0);
}

接着继续重新定位环境变量,函数如下

/*initialize environment*/env_relocate ();//初始化环境变量,crc有效的话从nand中读取存储的环境变量,否则采用默认的环境变量

对env_relocate分析

void env_relocate (void)
{DEBUGF ("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__,gd->reloc_off);#ifdef ENV_IS_EMBEDDED/*******省略*********/
#else/** We must allocate a buffer for the environment*/env_ptr= (env_t *)malloc (CFG_ENV_SIZE);//在RAM中为环境变量的存放分配一个堆区DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);#endif/** After relocation to RAM, we can always use the "memory" functions*/env_get_char= env_get_char_memory;//得到环境变量的地址的函数if (gd->env_valid == 0) {//如果环境变量在一开始初始化的时候无效,重新定位默认环境变量
#if defined(CONFIG_GTH)    || defined(CFG_ENV_IS_NOWHERE)    /* Environment not changable */puts ("Using default environment\n\n");#elseputs ("*** Warning - bad CRC, using default environment\n\n");SHOW_BOOT_PROGRESS (-1);#endifif (sizeof(default_environment) >ENV_SIZE){puts ("*** Error - default environment is too large\n\n");return;}memset (env_ptr,0, sizeof(env_t));memcpy (env_ptr->data,default_environment,sizeof(default_environment));
#ifdef CFG_REDUNDAND_ENVIRONMENTenv_ptr->flags = 0xFF;#endifenv_crc_update ();gd->env_valid = 1;}else{env_relocate_spec ();//从nand中取出有效的数据,如果无效,还是使用默认的环境变量
}gd->env_addr = (ulong)&(env_ptr->data);//取得首个环境变量的地址env_ptr为一个结构体,包含了crc、flags、以及data指针
}

2、mtdparts default命令分析(实现分区)

跟着do_jffs2_mtdparts函数往里看,setenv为设置环境变量函数。

    if (argc == 2) {//如果参数个数为2个if (strcmp(argv[1], "default") == 0) {           //默认参数setenv("mtdids", (char *)mtdids_default);    //设置mtdids环境变量setenv("mtdparts", (char *)mtdparts_default);//设置mtdparts环境变量setenv("partition", NULL);                   //设置partition环境变量
mtdparts_init();//分区初始化  by andyreturn 0;}else if (strcmp(argv[1], "delall") == 0) {//删除所有分区/*this may be the first run, initialize lists if needed*/mtdparts_init();setenv("mtdparts", NULL);/*devices_init() calls current_save()*/returndevices_init();}}

继续往里看mtdparts_init函数,这函数比较复杂,先看一下它的调用层次。

mtdparts_init();//分区初始化  by andyparse_mtdids(ids);    //添加mtdids到mtdids链表 nand0=nandflash0parse_mtdparts(parts);//添加分区partsdevices_init();//0初始化成功,主要是做了删除所有分区设备的工作device_parse(p, &p, &dev);//添加分区设备,返回的设备为dev,p为从环境变量取得的字符串id_find_by_mtd_id(mtd_id, mtd_id_len - 1);//找到parse_mtdids(ids);中添加的mtdids以及名称nandflash0while (p && (*p != '\0') && (*p != ';')) {{part_parse(p,&p, &part);//分区解析,填充part,添加解析过后的part的链表。这个函数解析MTDPARTS_DEFAULT然后分区}

总的来说就是根据MTDIDS_DEFAULT 与MTDPARTS_DEFAULT解析它们然后进行分区

#define MTDIDS_DEFAULT "nand0=nandflash0"//分区设备为nand
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \//bootloader分区"128k(params)," \                       //参数分区"2m(kernel)," \                         //内核分区"-(root)"                               //用户分区

3、nand read.jffs2 0x30007FC0 kernel中kernel的值

实现了分区之后就可以调用分区的名称了,kernel就是其中一个分区的名称。同样的切换到nand命令的运行函数do_nand。同样对它进行层次分析,找到kernel。

do_nandarg_off_size(argc- 3, argv + 3, nand, &off, &size)//5个参数分别代表参数个数、参数位于的地址、分区设备结构地址、返回的偏移值、返回的大小find_dev_and_part(argv[0], &dev, &pnum, &part)//查找有哪个设备存在argv[0]分区,即kernel分区,找到分区信息存放在part中*off  = part->offset;//找到了nand设备,取得偏移值*size = part->size;  //取得大小

转载于:https://www.cnblogs.com/andyfly/p/9358928.html

u-boot之怎么实现分区相关推荐

  1. 借助磁盘修理工具解决Boot Camp助理的分区问题

    现在很多Mac用户都会选择在自己的苹果电脑上安装Windows,而行之有效的方法就是使用系统自带的Boot Camp工具 .正常情况下这些操作是非常简单的,但偶尔也可能会遇上一些麻烦,比如:在使用Bo ...

  2. linux要不要home分区,有必要建/home/boot分区吗

    ciscobhl 于 2010-01-26 14:05:35发表: 还可以把 看个人情况啊 litkt 于 2009-03-05 09:44:25发表: 如果 /home分区单设, 重装系统后, /h ...

  3. linux 根目录分配多少好,Linux下硬盘怎么分区才合适:根分区(/)交换分区(/swap)和/boot分区需要多大...

    Linux下硬盘怎么分区才合适:根分区(/)交换分区(/swap)和/boot分区需要多大 : 在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题. 第一点也是 ...

  4. Linux主分区文件系统,Linux_Linux磁盘和文件系统管理,1、 分区MBR(Master Boot Recor - phpStudy...

    Linux磁盘和文件系统管理 1. 分区 MBR(Master Boot Recorder)主引导分区仅提供最多4个分区,主分区(Primary,P)与扩展分区(Extended,E),如3P+1E, ...

  5. Android分区详解:boot, system, recovery, data, cache 以及 misc

    [声明] 本文原文在<Android Partitions Explained: boot, system, recovery, data, cache & misc>. [正文] ...

  6. linux boot分区 恢复出厂设置,linux系统启动流程及 MBR损坏,grub内容,文件误删,boot目录,分区误删修复...

    转自http://tanxin.blog.51cto.com/6114226/1167151 操作环境:linux Redhat 5.8 一.首先简单看一下系统启动的流程图,然后再作详细的解释 二. ...

  7. 解释Linux文件系统:Boot Loading, 磁盘分区,BIOS,UEFI和文件系统类型

    Boot loading,磁盘分区,分区表,BIOS,UEFI,文件系统类型等概念对我们来说所知甚少.我们经常遇到这些术语,但很少花费力气详细地了解这些术语和它们的含义.本文努力用最简单的方式填补这一 ...

  8. 关于linux安装前规划分区二三事

    安装linux之前,要先做好规划,主要依据以下原则: 磁盘的容量. 系统的规模. 系统的用途. 预期的备份方法与备份空间. 主要讲一下按系统用途而要做的分区. 首先要有一个 /boot 分区,大概10 ...

  9. 服务器硬盘如何增加分区,服务器硬盘分区方法是什么?

    服务器硬盘,顾名思义,就是服务器上使用的硬盘.如果说服务器是网络数据的核心,那么服务器硬盘就是这个核心的数据仓库,所有的软件和用户数据都存储在这里.用户用久了服务器硬盘就可能会出现空间不足的情况,那么 ...

  10. Linux分区的认识

    有时候为了便于管理硬盘或允许在一块硬盘上使用多个文件系统或操作系统,需要对硬盘进行分区操作.硬盘的分区分为3种:主分区.扩展分区.逻辑分区.通常因为计算机BIOS和MBR的限制,一块硬盘最多只能有4个 ...

最新文章

  1. c语言规定预处理命令必须以什么开头,C语言规定预处理命令必须以___________开头...
  2. RANSAC算法做直线拟合
  3. python3的样子_python3与python2不一样的地方
  4. 擦地机器人修理_自带眼睛还有嘴,喷水式擦地机器人效果实测
  5. python爬虫基础扫盲之urllib.pase解析URL
  6. 单选按钮必填会有红色选中提示吗_视频切割怎么弄?视频剪辑软件可以切割视频吗?...
  7. 光纤光信号闪红灯_电信光纤光猫光信号闪红灯怎么处理
  8. Golang并发模式--管线
  9. IE6下链接onclick事件处理中的请求被aborted
  10. Docker容器中bash: ip: command not found
  11. 【NOIP2016普及组复赛模拟赛】买装备(equipment)
  12. 手把手带你搭建Linux环境(保姆级,包含vivado与petalinux)
  13. cuda10安装——在CentOS上安装的艰难过程
  14. 共享单车骑行及锁车定位方式分析
  15. CTRL键不能使用(非硬件问题)
  16. html5 手绘效果,浅谈基于Canvas的手绘风格图形库Rough.js
  17. 区块链 liquity源代码分析之一 赎回奖励trove_open_liquidate
  18. Linux 内存分配
  19. Avira AntiVir Personal 8 - FREE Antivirus/免费的杀毒软件
  20. PHP反射ReflectionClass、ReflectionMethod

热门文章

  1. python是动态编程语言吗-python是一种跨平台、开源、免费的高级动态编程语言,对么...
  2. python代码写好了怎么运行不了-python代码可以直接运行吗 Python写了代码如何运行...
  3. java好还是python好-Python和Java哪个薪资更高、远景更好?
  4. python安装教程3.8.5-怎么安装最新Python3.8.5-新手入门教程必看
  5. python小程序-Python基本小程序
  6. 精通python设计模式-Python设计模式
  7. python在线教学-微软推出 Python 免费在线教程视频
  8. python代码大全o-Python 文件I/O
  9. pythonexe32位-如何使用pyinstaller打包32位的exe
  10. python在中国的发展-python在中国的现状和发展趋势