本文转载自:https://blog.csdn.net/lieye_leaves/article/details/78214410
eMMC ext4综述
一.系统的引导启动
1.1系统的引导启动
https://javigon.com/2012/08/24/from-poweron-to-android-the-boot-sequence/
通常,引导设备的块0包含着主引导记录(MasterBoot Record MRB),这个块包含着设备分区表(partition table)的信息。
当设备加电启动的时候,第一个阶段的bootloader放在特定的块上,该阶段执行后会找到下个阶段的bootloader,该过程可以理解为使用了低层的地址块的,即这些地址块用的是硬编码,找到它的时候是采用直接的物理块的,而不是分区,即bootloader和内核的定位是在分区表(partition table)之外的。
使用dd, fdisk, fastboot可以生成MRB和partitiontable,烧写内核和ramdisk。Fdisk和fastboot比dd要更友好和快速。ODROID-A4的分区表如下:
当系统启动的时候,处理器会从一个指定的地方读取并执行代码,这个地址通常是内部ROM,它初始化板上的部件,并引导设备,有的平台是一小段称之为BL0的代码,不同的处理器和开发板有不同。
如果bootloader的第一步执行的时候,比如BL1,它会被复制到内部的RAM中,初始化时钟,SDRAM,加载剩余的bootloader(BL2),不同的平台都类似,如下图所示:
在bootloader(BL0 BL1 BL2)初始化板上的设备后,将kernel加载进RAM中。
1.2 引导方式实例1
Uboot启动以后的一种引导方式,仅做参考(作者,围补):
setenv loadaddr 0x10800000
setenv bootargs_base 'setenvbootargsconsole=ttymxc0,115200'
setenv bootargs_mmc 'setenvbootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24ip=dhcp'
setenv bootcmd_mmc 'run bootargs_base bootargs_mmc;mmcdev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'
setenv bootcmd 'run bootcmd_mmc'
saveenv
run bootcmd
rw是声明启动权限,即以读写方式启动;rootwait是指等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪是就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。
mmc dev 1,意思是将dev 1设置为当前设备
mmc read0x10800000 0x800 0x2000即将存储设备上从块号0x800开始的0x2000个存储块的东西拷贝到内存0x10800000开始的空间内。
1.3引导方式实例2
http://blog.csdn.net/u014645605/article/details/52061034
sprd:
Boot1:u-boot-spl-16k.bin
Boot2:u-boot.bin
RPMB:未使用(指纹相关)
UDA:剩余的烧写文件
高通:
BOOT1:bootloader
BOOT2:boot.img
RPMB:未用(指纹相关)
UDA:剩余文件
1.4引导实例3
下图为exynos4412的启动流程: