1 linux启动的几个阶段:
对应关系
阶段1 |
阶段2 |
阶段3 |
|
Boise(引导从u盘,硬盘,cdrom等启动) |
Grub |
Kernel |
系统 |
preloader(完成下载+启动引导) |
Lk |
kernel |
Systermimg |
android智能机上 分区表再各个阶段的作用:
注意:Dumchar是debug信息用(用户模式读写某分区镜像等),分区表的建立等由内核block子系统来完成。dumchar调试如下:
Dumchar_info的分区信息在哪里创建:???
/dev/bootimg
/dev/otp
/dev/nvram
dumchar_probe () ---
{
for (l = 0; l<PART_NUM; l++){
if(!strcmp(dumchar_devices[l].dumname,"otp")){
dumchar_device[l]= device_create(dumchar_class, NULL, MKDEV(major, l),NULL,"otp_bak");
}else{
dumchar_device[l]= device_create(dumchar_class, NULL,MKDEV(major, l),NULL, dumchar_devices[l].dumname);
}
}
。。。。。
}
而且绑定了dumchar_fops:
structfile_operations dumchar_fops = {
.owner= THIS_MODULE,
.llseek= dumchar_llseek,
.read = dumchar_read,
.write = dumchar_write,
.unlocked_ioctl= dumchar_ioctl,
.open= dumchar_open,
.release= dumchar_release,
};
所以可以读写分区。获取分区的方法:
1.flashtool :---根据scat读取分区
2.adb 获取:
Adb shell dd if=/dev/bootimg of=/sdcard/boot.img bs=6291456 count=1
-----获取bootimg分区 bs=6291456 (mtk一般是6MB)。这里是把整个bootimage分区读出,也是可以的,正确的读法是根据
---------然后可以使用split_bootimg.pl 脚本从bootimg中提取出roofs;
Adb pull /dev/bootimg 就是bootimg分区开始 读取flash
Adb pull /dev/mbr 就是mbr分区开始 读取flash,
2 分析MBR:
主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNUGRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
------这里为00,应为不需要操作系统引导,只是单系统,所以我们是可以做一个手机多个操作系统的。
3 内核什么时候读取MBR的分区表和建立block设备的节点呢?以及其作用?
首先建立磁盘(比如一块emmc,一块sd卡,一个硬盘)的块设备节点,先了解两个知识点:
1)linux内核中支持的磁盘类型:(做分区表都是根据磁盘类型来做的分区)
static int(*check_part[])(struct parsed_partitions *) = {
/*
* Probe partition formats with tables at diskaddress 0
* that also have an ADFS boot block at 0xdc0.
*/
#ifdefCONFIG_ACORN_PARTITION_ICS
adfspart_check_ICS,
#endif
#ifdefCONFIG_ACORN_PARTITION_POWERTEC
adfspart_check_POWERTEC,
#endif
#ifdefCONFIG_ACORN_PARTITION_EESOX
adfspart_check_EESOX,
#endif
/*
* Now move on to formats that only havepartition info at
* disk address 0xdc0. Since these may also have stale
* PC/BIOS partition tables, they need to comebefore
* the msdos entry.
*/
#ifdefCONFIG_ACORN_PARTITION_CUMANA
adfspart_check_CUMANA,
#endif
#ifdefCONFIG_ACORN_PARTITION_ADFS
adfspart_check_ADFS,
#endif
#ifdefCONFIG_EFI_PARTITION
efi_partition, /*this must come before msdos */
#endif
#ifdefCONFIG_SGI_PARTITION
sgi_partition,
#endif
#ifdefCONFIG_LDM_PARTITION
ldm_partition, /*this must come before msdos */
#endif
#ifdefCONFIG_MSDOS_PARTITION
msdos_partition,---------------》手机上基本上是这种。
#endif
#ifdefCONFIG_OSF_PARTITION
osf_partition,
#endif
#ifdefCONFIG_SUN_PARTITION
sun_partition,
#endif
#ifdefCONFIG_AMIGA_PARTITION
amiga_partition,
#endif
#ifdefCONFIG_ATARI_PARTITION
atari_partition,
#endif