本文共 1914 字,大约阅读时间需要 6 分钟。
地址的再次整理与总结
首先MFG工具发送mksdcard.sh到mx53对MMC/SD卡进行分区,使用sfdisk最最主要的目录是在MMC/SD卡上产生MBR信息。这个主引导记录产生在第一个扇区(前512B)上。
1、 uboot相关地址
<CMD type="push"body="send" file="files/u-boot-mx53-smd.bin">Sendingu-boot.bin</CMD>
<CMD type="push"body="$ dd if=$FILE of=/dev/mmcblk0 bs=512 seek=2 skip=2">writeU-Boot to sd card</CMD>
将uboot.bin文件跳过前1KB,剩下的写到同样跳过前1KB的MMC/SD设备上。
设备上跳过1KB是为了防止MBR被覆盖,(是不是跳过512B就可以了呢?)
Uboot.bin文件跳过前1KB又是为了什么?
2、 kernel相关地址
<CMD type="push"body="send" file="files/uImage">Sending kerneluImage</CMD>
<CMD type="push"body="$ dd if=$FILE of=/dev/mmcblk0 bs=512 seek=2048">write kernelimage to sd card</CMD>
将kernel直接烧写到MMC/SD的1MB地址上。
3、 rootfs相关地址
<CMD type="push"body="$ mkfs.ext3 -j /dev/mmcblk0p1">Formatting rootfspartition</CMD>
<CMD type="push"body="$ mkdir -p /mnt/mmcblk0p1"/>
<CMD type="push"body="$ mount -t ext3 /dev/mmcblk0p1 /mnt/mmcblk0p1"/>
<CMD type="push"body="pipe tar -jxv -C /mnt/mmcblk0p1"file="files/rootfs.tar.bz2">Sending and writtingrootfs</CMD>
<CMD type="push"body="frf">Finishing rootfs write</CMD>
<CMD type="push"body="$ umount /mnt/mmcblk0p1">Unmounting rootfspartition</CMD>
这里烧写文件系统没有采用直接往物理地址写入的方法,而是采用mx53预先在RAM中构建的包括MMC/SD卡驱动的内核,借用于它将设备挂载上节点上,然后将文件系统写入。
也就是说文件系统的地址是由内核中对MMC/SD中分区中的代码指定的。
更准确的说应该是由于使用了sfdisk对SD卡进行了分区,并格式化成ext3文件系统了,内核通过VFS调用ext3,读取存储在SD中的相关信息,了解SD是以ext3文件系统来展示的,故再读以相应的分区表。实现挂载与写入的。
使用sfdisk进行分区和产生MBR以及写入uboot和内核都是对设备进行操作的,而格式化是对设备的分区进行操作的,并且分区的时候,第一个分区的偏移已经跳过了uboot和kernel的地址范围,在它们俩之外,所以不会影响已经写入的MBR和内核。
总结一下SD卡的分区如下:
1、partition table 分区表,包括MBR,前1KB
2、bootloader uboot区域
3、kernel 内核区域 地址:1MB开始 0x100000/512=0x800
Mmcread 1 ${loadaddr} 0x800 0x1800就是从1MB地址开始读取
4、rootfs 分区的时候将第一个分区表建立在偏移量为8192*512=4MB地址上,这个地址会被写入到partition table分区表中,内核的ext3文件系统先会读取SD卡头部的分区表,自然就知道了rootfs所在分区的物理地址。因为各个分区的物理地址就存放在分区表中。
明白了,恍然大悟啊。哈哈。
唯一不明白的就是一点:
<CMD type="push" body="$ dd if=$FILEof=/dev/mmcblk0 bs=512 seek=2 skip=2">write U-Boot to sdcard</CMD>
这里uboot.bin为什么要跳过1KB?????
转载地址:http://njzji.baihongyu.com/