Android系统有好几个分区。system, data, flash等
以下是jz4770平台上某款设备的分区信息
/dev/block/mmcblk0p1 /system ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/mmcblk0p2 /data ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,nodelalloc,data=ordered,noauto_da_alloc 0 0
/dev/block/mmcblk0p3 /cache ext4 rw,nosuid,nodev,relatime,user_xattr,barrier=1,data=ordered 0 0
/dev/block/vold/179:4 /mnt/flash vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortn0
/dev/block/vold/179:4 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,0
tmpfs /mnt/flash/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
其中,/dev/block/mmcblk0代表的设备是板子上的Nand flash。当前系统的nand大小为4G. 上面安装有bootloader, kernel, Android系统等
其中,bootloader, kernel是在Nand的开头,并没有进行分区,而是直接对mmcblk0进行裸写。后面的mmcblk0p1 ~ mmcblk0p4是在mmcblk0上的4个分区,其中,
mmcblk0p1进行分区的时候,就跳过了开头的bootloader,kernel数据区。
将该四个分区的分区信息做好之后,写到一个mbr.bin的512个字节的文件中。这个代表主引导记录,记录磁盘/介质的分区信息。然后把这个512个字节放到bootloader的
开始之处。在bootloader被烧录到nand之后,分区表就已经建立好。
下面看代码
Makefile
157 MBR:
158 gcc spl/tools/mbr_creater/mbr_creater.c -o spl/tools/mbr_creater/mbr_creater -I$(TOPDIR) -I$(TOPDIR)/include
159 spl/tools/mbr_creater/mbr_creater mbr.bin
在编译的时候,创建mbr.bin 文件
然后
152 mbr-xboot.bin: $(MSC_SPL) MBR $(MBR_XBOOT_DEPEND)
153 $(MAKE) -C spl pad
154 cat spl/msc-spl-pad.bin $(X_BOOT2) > x-boot-msc.bin
155 cat mbr.bin x-boot-msc.bin > mbr-xboot.bin
将此512字节的文件放到bootloader 的顶部。即可完成分区。
下面看下mbr_creater的代码
10 11 int main(int argc,char *argv[]) 12 { 13 int fd; 14 15 uint32_t p1,ps1; 16 uint32_t p2,ps2; 17 uint32_t p3,ps3; 18 uint64_t p4,ps4; 19 20 uint8_t pt1,pt2,pt3,pt4; 21 uint8_t block[512]; 22 23 if(argc != 2) 24 { 25 printf("usage: %s filename.\n",argv[0]); 26 exit(0); 27 } 28 29 p1=p2=p3=p4=0; 30 ps1=ps2=ps3=ps4=0; 31 pt1=pt2=pt3=pt4=0; 32 33 memset(block,0,512); 34 #ifdef MBR_P1_OFFSET 35 p1 = MBR_P1_OFFSET; 36 #endif 37 #ifdef MBR_P1_SIZE 38 ps1 = MBR_P1_SIZE; 39 #endif 40 #ifdef MBR_P1_TYPE 41 pt1 = MBR_P1_TYPE; 42 #endif 43 ///////////////////////////////////////////////// 44 #ifdef MBR_P2_OFFSET 45 p2 = MBR_P2_OFFSET; 46 #endif 47 #ifdef MBR_P2_SIZE 48 ps2 = MBR_P2_SIZE; 49 #endif 50 #ifdef MBR_P2_TYPE 51 pt2 = MBR_P2_TYPE; 52 #endif 53 ///////////////////////////////////////////////// 54 #ifdef MBR_P3_OFFSET 55 p3 = MBR_P3_OFFSET; 56 #endif 57 #ifdef MBR_P3_SIZE 58 ps3 = MBR_P3_SIZE; 59 #endif 60 #ifdef MBR_P3_TYPE 61 pt3 = MBR_P3_TYPE; 62 #endif 63 ///////////////////////////////////////////////// 64 #ifdef MBR_P4_OFFSET 65 p4 = MBR_P4_OFFSET; 66 #endif 67 #ifdef MBR_P4_SIZE 68 ps4 = MBR_P4_SIZE; 69 #endif 70 #ifdef MBR_P4_TYPE 71 pt4 = MBR_P4_TYPE; 72 #endif 73 ///////////////////////////////////////////////// 74 block[0x1fe] = 0x55; 75 block[0x1ff] = 0xaa; 76 77 p1 /= 512; 78 p2 /= 512; 79 p3 /= 512; 80 p4 /= 512; 81 82 ps1 /= 512; 83 ps2 /= 512; 84 ps3 /= 512; 85 ps4 /= 512; 86 87 memcpy(block+0x1c6,&p1,sizeof(uint32_t)); 88 memcpy(block+0x1d6,&p2,sizeof(uint32_t)); 89 memcpy(block+0x1e6,&p3,sizeof(uint32_t)); 90 memcpy(block+0x1f6,&p4,sizeof(uint32_t)); 91 92 memcpy(block+0x1ca,&ps1,sizeof(uint32_t)); 93 memcpy(block+0x1da,&ps2,sizeof(uint32_t)); 94 memcpy(block+0x1ea,&ps3,sizeof(uint32_t)); 95 memcpy(block+0x1fa,&ps4,sizeof(uint32_t)); 96 97 memcpy(block+0x1c2,&pt1,sizeof(uint8_t)); 98 memcpy(block+0x1d2,&pt2,sizeof(uint8_t)); 99 memcpy(block+0x1e2,&pt3,sizeof(uint8_t)); 100 memcpy(block+0x1f2,&pt4,sizeof(uint8_t)); 101 ///////////////////////////////////////////////// 102 103 fd = open(argv[1],O_RDWR | O_TRUNC | O_CREAT,0777); 104 if(fd < 0) 105 { 106 printf("open %s failed.\n",argv[1]); 107 exit(1); 108 } 109 110 write(fd,block,512); 111 112 close(fd); 113 return 0; 114 } 115 代码比较简单,将4个分区的偏移,大小,以及文件系统的类型定义好,然后写到mbr扇区的相应位置就可以了。 ~ ~