一般的嵌入式Linux开发人员是要清晰区分不同器材的作用和名称的。比如系统,内核所有保存在Nand Flash之上,断电后仍然存在,而运行后程序是装入SDRAM或Mobile DDR之类的内存设备运行。
       但一般用户不大明白这几个芯片的区别,一般是就用ROM来指Nand Flash,RAM来指SDRAM之类设备。虽然在嵌入式编程,是专门有称作ROM的器材,比如EEPROM。这里就是大家约定俗说法吧。因此这里的Android ROM实际就是指烧录Nand Flash的各种二进制文件。
       另外,卖数码产品的喜欢把Nand Flash称为内存,SD卡称为外存,所以交流也只好这样了。
  
 
从分区表看,
 <<Android Partitions Explained: boot, system, recovery, data, cache & misc>>
   http://www.addictivetips.com/mobile/android-partitions-explained-boot-system-recovery-data-cache-misc/
 <<HOWTO: Unpack, Edit, and Re-Pack Boot Images>>
  http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images

一、手机的分区说明

我的HTC G8信息是 ,注意这里是Android的LINUX内核能看到分区,并不表示Flash上的所有分区,我的理解Hboot和radio分区在toolbox就看不到。

cat /proc/mtd
dev: size erasesize name
mtd0: 000a0000 00020000   "misc"
mtd1: 00420000 00020000   "recovery"
mtd2: 002c0000 00020000   "boot"
mtd3: 0fa00000 00020000   "system"
mtd4: 02800000 00020000   "cache"
mtd5: 0af20000 00020000   "userdata"

MISC分区


       其中misc分区信息第一篇文章有解释:保存设备配置信息:CID (Carrier or Region ID),USB和其它硬件设备配置信息,大约20K的样子。引自  http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94411 可能结构是

0x00  CID
0x10  enter_bootloader
0x20  cold boot   (DeviceWarmBoot)
0x30  goupdateloader
0x40  (NBH)
0x50  CE Serial InUse\0
0x60  Debug Cable Ena\0
0x70  CE USB   InUse\0
0x80  (IMG)
0x90  ClearAutoImage \0
0xa0  *.**.***.*\0(HBoot version)

recovery分区


       recovery 分区即恢复分区,在正常分区被破坏后,仍可以进入这一分区进行备份和恢复.我的理解是这个分区保存一个简单的OS或底层软件,在Android的内核被破坏后可以用bootloader从这个分区引导进行操作。

boot 分区


一般的嵌入式Linux的设备中.bootloader,内核,根文件系统被分为三个不同分区。在Android做得比较复杂,从这个手机分区和来看,这里boot分区是把内核和ramdisk file的根文件系统打包在一起了,是编译生成boot.img来烧录的。它有如下格式。

 boot header  1 page
 kernel   n pages
 ramdisk  m pages
 second stage  o pages

n = (kernel_size + page_size - 1) / page_sizem = (ramdisk_size + page_size - 1) / page_sizeo = (second_size + page_size - 1) / page_size0. all entities are page_size aligned in flash1. kernel and ramdisk are required (size != 0)2. second is optional (second_size == 0 -> no second)这里表示boot分区有四个部分,其中前三部分是必须的,而第四部分 second stage 可选。 每部分的大小是一个flash page的倍数,不足一页的需要加入空格字符补齐成一页。其中bootl header是一些特定的数据结构。每种手机有细微的差别。但是它是有一个统一个数据结构参见 bootloader/legacy/include/boot/bootimg.h 中 boot_img_hdr

typedef struct boot_img_hdr boot_img_hdr;
#define BOOT_MAGIC   "ANDROID!"
#define BOOT_MAGIC_SIZE 8
#define BOOT_NAME_SIZE 16
#define   BOOT_ARGS_SIZE 512
struct   boot_img_hdr
{    unsigned char   magic[BOOT_MAGIC_SIZE];            /*幻数,一般固定为   ANDROID! */
    unsigned kernel_size; /* size in bytes */          /*内核长度                  */
    unsigned kernel_addr; /* physical   load addr */   /*内核装入地址               */
    unsigned ramdisk_size; /* size in bytes */         /*ramdisk 长度              */
    unsigned ramdisk_addr; /* physical load addr   */  /* ramdisk 装入地址          */

    unsigned second_size; /* size in   bytes */        /* second stage 长度        */
    unsigned second_addr; /* physical load addr   */   /* second staget 装入地址  */
    unsigned   tags_addr; /* physical addr for kernel tags */ /*内核tags 即内核参数 物理地址 ?   */
    unsigned page_size; /* flash page size we assume   */   /* flash页尺寸,取决于flash型号 */
    unsigned   unused[2]; /* future expansion: should be 0 */ /* 保留未用字段   */
    unsigned char name[BOOT_NAME_SIZE]; /* asciiz   product name */  /*产品名称   */
    unsigned char   cmdline[BOOT_ARGS_SIZE];                     /* Linux 内核引导参数,*/
    unsigned id[8]; /*   timestamp / checksum / sha1 / etc */   /*检验值   */
};
 这里的内核tags,应该就是指内核命令行参数,在头文件里有如下注释注明了,bootloader在引导LINUX 内核时,将会把寄存器r2保存tags addr,而在ARM-LINUX定义里 r1是机器码,而r2就是引志命令行参数的偏移量,
** 4. prepare tags at tag_addr. kernel_args[] is ** appended to the kernel commandline in the tags. ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
而kernel 和ramdisk则是LINUX标准的zImage和zip格式,这里略掉其说明
文件系统分区. Linux必须有一个根文件系统分区,可以为多种格式,这里用的是可读的ramdisk 格式,它启动分隔一部分内存,挂载到/目录下。 然后再用分三个不同权限分区来装载不同子目录.这里二个子目录是 /system ,/userdata 并且内容是完全只读的它将必须用root用户 这种设计结构的出发点是这样考虑,内核和根文件系统的由手机制造商控制,不让用户修改,而且system的分区保存重要的系统命令和框架程序。由官方来升级,对于用户是只读的。而且userdata目录才是用户自行管理的,比如下载的应用。 而启动时最重要的root用户并未对用户公开,应用程序都是用普通用户的如 app_xx这样的帐号来运行。这样可以有效保护/system的程序。 但是第三方的自制rom往往要修改/system的内容,因此刷机时要通过破解方法来取得root用户权限。
system 分区

这里是挂载到/system目录下的分区,是一个yaffs2的文件系统,用普通的adb 命令是无法操作这个目录的。这里有 /system/bin 和 /system/sbin 保存很多系统命令。它是由编译出来的system.img来烧入。

userdata 分区 

它也是一个yaffs2文件系统,它将挂载到 /data 目录下, 它是由编译出来的userdata.img来烧入。cache 分区 它也是一个yaffs2文件系统,它将挂载到 /cache 目录下,看一般解释,这里主要用升级的缓存,内容由运行而定.

cat /proc/mounts
rootfs / rootfs ro,relatime 0 0 #根文件系统的格式,只读
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0 #system分区,只读
/dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0 #data分区,可读写
/dev/block/mtdblock4 /cache yaffs2 rw,nosuid,nodev,relatime 0 0 #cache分区,可读写
其它隐藏分区:

  HBOOT 这里没有看,保存的bootloader HBOOT,从源码看不是u-boot的变种。
Radio分区  保存是基带芯片的固件代码,Linux不认识其格式,在手机启动时装入特定内存中用于驱动芯片。所有与电信网络交互就是靠它了,一般往往用专用开发环境来开发。
splash分区  这里是启动画面。
SD卡分区  一般默认的是挂载在/sdcard目录,从我的机器看,好象没有挂上。
SD卡扩展分区

   它的目录名是 /sd-ext ,它不是一个标准的Android分区,是运行APP2D软件扩展出来分区。目的是为了多扩展一个安装程序空间,这个对于Flash空间(或者说ROM空间)不够,又喜欢安装软件的人是有用应用。
二.各分区详细分析
  各个分区的内容,可以用cat命令直接导出,用一般的二进制的软件来分析,我一般用WinHex,并且自己写了几个模板。
导出分区内容,如果用adb 导出,必须有root权限,

Android Nand Flash 分区相关推荐

  1. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...

    关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题 主要是设置struct mtd_partition中的mask_flags标志位 具体含义为: 1 ...

  2. jffs2挂载Nand Flash分区失败问题

    在使用 #flash_erase -j /dev/mtd6 0 0 擦除对应分区后,进行挂载 #mount -t jffs2 /dev/mtdblock6 /wellav_data 时,报错: jff ...

  3. u-boot nand flash read/write cmd

    支援的命令函數說明 1. nand info/nand device 功能:顯示當前nand flash晶片資訊. 函數調用關係如下(按先後順序): static void nand_print(st ...

  4. Linux NAND FLASH驱动程序分析(mini2440)

    Linux NAND FLASH驱动程序分析(mini2440) 一.Linux-MTD Subsystem介绍 FLASH在嵌入式系统中是必不可少的,它是bootloader.linux内核和文件系 ...

  5. 如何为SD卡与NAND Flash的uboot加上menu菜单!

    亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容 ...

  6. 关于NAND flash的MTD分区与uboot中分区的理解 .

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

  7. linux擦除nandflash分区,【Linux公开课】NAND Flash存储器分区、烧写流程图、格式化NAND Flash...

    摘要本章主要讲述EasyARM-iMX283A Linux固件的烧写方法,可以通过TF卡.USB两种方式进行整体固件烧写,也可以通过网络进行局部固件升级. 第9章 系统固件烧写 本章主要讲述EasyA ...

  8. Android Flash分区大小查看

    正常的8G Flash有多少可以用的 这样算吧: 硬盘和U盘厂家的算法:8GB*1000=8000MB*1000=8000000KB*1000=8000000000B 电脑系统的算法:80000000 ...

  9. 什么是MTD分区和NAND flash?

    NOR和NAND是现在市场上两种主要的非易失闪存技术. Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面.紧接着,1989年,东芝公司发表 ...

最新文章

  1. php写一个shell脚本文件格式,一篇文章学会——shell脚本编写
  2. 求求你别再用offset和limit分页了
  3. 我的android绘图学习笔记(二)
  4. dht11 python mysql,自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)
  5. 响应json数据之过滤静态资源
  6. Spring的Lifecycle
  7. 新俊飞六合一口红机完整源码
  8. python中bar函数的用法_Python:如何在函数中使用progressbar
  9. Bailian2697 迭代法解方程【二分+迭代】
  10. VUE 自定义取色器组件
  11. 2021-05-12
  12. 守望先锋战网服务器维护多长时间,守望先锋国服压力测试多长时间 压力测试删档吗等问题解答...
  13. 硬核干货 | 基于Impala的网易有数BI查询优化总结
  14. Android_插值器
  15. 卫星遥感加持,农业更高效精准
  16. docker出现问题:The container name “/XXX“ is already in use by container 解决方案
  17. 获取linkedin上指定公司下的职员信息
  18. 5059页,Python3.x最新版「官方中文教程」已经发布,内含教程、标准库、语言参考,及新版本特性!...
  19. 【buildroot】buildroot常用文件夹
  20. 贴片红外LED灯珠封装失效怎么应对

热门文章

  1. [H5表单]一些html5表单知识及EventUtil对象完善
  2. 3.1_栈_顺序存储结构(数组形式)
  3. iOS 去除导航栏下的黑线
  4. 使用Grunt搭建自动化的web前端开发环境-完整教程
  5. {HTML5}JQueryMobile页面跳转参数的传递解决方案
  6. Latent dirichlet allocation note -- Prepare
  7. 物理光学 计算倏逝波/渐逝波在界面上存在的范围
  8. R语言数据可视化 ggplot2基础2 创建单图层的散点图 创建facet
  9. css hack 学习总结
  10. 操作系统pv操作学习总结