一。uboot下的logo显示功能中的flash的读取:
mmc read dev_num, addr, flash_addr_start, flash_read_size
mmc read 0 ADDR, (BOOT_LOGO_ADDRESS >> 9), (BOOT_LOGO_SIZE >> 9)
即mmc read有四个参数,从前到后分别是
flash设备的编号;
读取的目标内存地址;
读取的flash的起始扇区的地址
读取的flash的扇区数量
之所以>>9 即除以512, 目的是512字节为一个扇区。
#define CONFIG_BOOTARGS "mem=512M logosize=5M console=ttyAMA0,115200 blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),352M(program),352M(cache),-(data)"
#if (defined QPTSV2R2B10) /* 3516dv300 STM 门禁 16G emmc */
#define BOOT_LOGO_SIZE 0x1000000 /* bootlogo 16M */
#define PROGRAM_SIZE 0x16000000 /* program 352M */
/* 多平台共用 */
#define UBOOT_SIZE 0x100000 /* uboot 1M */
#define KERNEL_SIZE 0x1000000 /* kernel 16M */
#define KERNEL_BAK_SIZE KERNEL_SIZE /* kernel_bak 16M */
#define CONFIG_SIZE 0x1000000 /* config 16M */
#define CONFIG_BAK_SIZE CONFIG_SIZE /* config_bak 16M */
#define CFG_CLINFO_DATA_SIZE 0x100000 /* cliinfo 1M */
#define CFG_CLINFO_DATA_BAK_SIZE CFG_CLINFO_DATA_SIZE /* cliinfo_bak 1M */
#define MTD_RUNTIME_SIZE 0x100000 /* mtd_runtime 1M */
#define CALIBRATION_SIZE 0x2000000 /* calibration 32M */
#define UPDATE_SIZE 0x80000 /* update 512K */
/* 根据各分区大小计算起始地址 */
#define UBOOT_START_ADDRESS 0
#define BOOT_LOGO_ADDRESS (UBOOT_START_ADDRESS + UBOOT_SIZE)
#define KERNEL_START_ADDRESS (BOOT_LOGO_ADDRESS + BOOT_LOGO_SIZE)
#define KERNEL_BAK_START_ADDRESS (KERNEL_START_ADDRESS + KERNEL_BAK_SIZE)
#define CONFIG_BAK_START_ADDRESS (CONFIG_START_ADDRESS + CONFIG_SIZE)
#define CFG_CLINFO_DATA_ADDRESS (CONFIG_BAK_START_ADDRESS + CONFIG_BAK_SIZE)
#define CFG_CLINFO_DATA_BAK_ADDRESS (CFG_CLINFO_DATA_ADDRESS + CFG_CLINFO_DATA_SIZE)
#define MTD_RUNTIME_START_ADDRESS (CFG_CLINFO_DATA_BAK_ADDRESS + CFG_CLINFO_DATA_BAK_SIZE)
#define CALIBRATION_START_ADDRESS (MTD_RUNTIME_START_ADDRESS + MTD_RUNTIME_SIZE)
#define UPDATE_START_ADDRESS (CALIBRATION_START_ADDRESS + CALIBRATION_SIZE)
#define PROGRAM_START_ADDRESS (UPDATE_START_ADDRESS + UPDATE_SIZE)
注意: 上述各个模块在磁盘上的地址是从零开始的。而且各个模块占用的大小相对固定。
指定上述分区如何划分的代码位于uboot下,具体在uboot环境变量的 bootargs字段里面,一般情况下为 blkdevparts 或者 mtdparts :
blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),304M(program),304M(cache),-(data)
mtdparts=rk29xxnand:0x00000040@0x00000000(gpt),0x00000800@0x00004000(uboot),0x00008000@0x00004800(bootlogo),0x00008000@0x0000C800(boot),0x00008000@0x00014800(boot_bak),0x00008000@0x0001C800(config),0x00008000@0x00024800(config_bak),0x00000800@0x0002C800(cliinfo),0x00000800@0x0002D000(cliinfo_bak),0x00000800@0x0002D800(mtd_runtime),0x00010000@0x0002E000(calibration),0x00000400@0x0003E000(update),0x000B0000@0x0003E400(program),0x000B0000@0x000EE400(cache),-@0x0019E400(data:grow)
Mstar: "mtdparts=nand0:4M(uboot),5M(kernel),200M(program),1M(cliinfo),1M(mtd_runtime),8M(config),8M(cfgbak),3M(calibration),512K(update),\
-(other) root=ubi0:program rw rootflags=sync rootfstype=ubifs ubi.mtd=2 LX_MEM=0x003FFE0000 mma_heap=mma_heap_name0,miu=0,sz=0x30000000 mma_heap=mma_heap_ipu,miu=0,sz=0x164000 cma=2M "
两者的格式不一样,但是生效的原理大致相同,即内核会解析上述参数,并且在dev下生成对应的块设备节点,然后我们在启动脚本里方便的将各个节点挂载到根文件系统上。
mstar用的也是mtdparts形式的参数
验证:
在海思的hi3516dv300.h的bootargs中添加mlwmlw分区,系统启动后,会在/dev/下生成对应的mmcblk2p15(15是bootargs中的顺序),然后在S30ambrwfs脚本中用 mount命令 将节点挂载到新建的目录上mlwmlw,注意用mount可df -h均可查看其大概内容:
mem=512M logosize=5M console=ttyAMA0,115200 blkdevparts=mmcblk2:1M(boot),16M(bootlogo),16M(kernel),16M(kernel_bak),16M(config),16M(config_bak),1M(cliinfo),1M(cliinfo_bak),1M(mtd_runtime),32M(calibration),512K(update),352M(program),352M(cache),48M(mlwmlw),-(data)
1. s30ambrwfs脚本中的挂载命令如下:============
MLWMLW_MTD=mmcblk2p14
ln -sf /dev/$MLWMLW_MTD /dev/mtd_mlwmlw
mkdir -p /mlwmlw
mount -t ext4 /dev/$MLWMLW_MTD -o sync,noatime /mlwmlw
if [ $? != 0 ]; then
mkfs.ext4 /dev/$MLWMLW_MTD
mount -t ext4 /dev/$MLWMLW_MTD -o sync,noatime /mlwmlw
echo "recover cache " >> /mlwmlw/ext4_recover
fi
2. df-h的执行结果如下:
root@root:/etc/init.d# df -h
Filesystem Size Used Available Use% Mounted on
tmpfs 250.0M 8.0K 250.0M 0% /var
tmpfs 250.0M 4.0K 250.0M 0% /dev
tmpfs 399.9M 3.4M 396.6M 1% /tmp
/dev/mmcblk2p12 341.0M 269.7M 64.2M 81% /program
/dev/mmcblk2p5 14.5M 1.3M 12.0M 10% /config
/dev/mmcblk2p6 14.5M 700.0K 12.7M 5% /cfgbak
/dev/mmcblk2p10 27.0M 396.0K 24.4M 2% /calibration
/dev/mmcblk2p15 13.5G 34.9M 12.7G 0% /data
/dev/mmcblk2p14 42.5M 979.0K 38.2M 2% /mlwmlw
/dev/mmcblk2p13 332.9M 2.7M 308.6M 1% /cache
3. mount的执行结果:
rootfs on / type rootfs (rw,size=245720k,nr_inodes=61430)
tmpfs on /var type tmpfs (rw,relatime)
proc on /proc type proc (rw,nosuid,nodev,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,relatime)
tmpfs on /dev type tmpfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime,size=409540k)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
/dev/mmcblk2p12 on /program type ext4 (ro,sync,noatime,data=ordered)
/dev/mmcblk2p5 on /config type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p6 on /cfgbak type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p10 on /calibration type ext4 (ro,sync,noatime,data=ordered)
/dev/mmcblk2p15 on /data type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p14 on /mlwmlw type ext4 (rw,sync,noatime,data=ordered)
/dev/mmcblk2p13 on /cache type ext4 (rw,sync,noatime,data=ordered)
即mount命令执行时,并不会指定其中分区大小的参数,应该是mount命令自动判断其大小:
======================================
mount的选项以及具体实现:
/bin/mount -> busybox 即 mount是对busybox的链接。
mount以及umonut的源码分为位于 busybox/util-linux目录下的 mount.c和umount.c中。
===============根文件系统编译进内核==============
内核选项: Initial RAM filesystem and RAM disk (initramfs/initrd) support