在此之前,加入一些Linux启动过程和Android启动过程的细分,不想看的可以分级标题跳转到:烧写Uboot实验 部分
Linux启动和Android启动的细分
在嵌入式中
Linux:做工控或者医疗设备使用Linux的多一些
Android:做消费电子,追求用户体验多一些
1)Linux的启动顺序
先启动Uboot(bootloader)--->启动uImage/zImage(Linux内核)--->rootfs(根文件系统)
先启动Uboot,Uboot启动之后引导内核,内核启动之后挂载根文件系统(根文件系统在硬盘上<如果是开发板就是EMMC>)
在EMMC中首先是Uboot,Uboot不在分区里面,uImage可以放在分区也可以不放在分区中
对于Linux来说EMMC中至少有一个分区,放的是根文件洗系统
未分区空间 | 已分区空间 | |
EMMC(8GB) | Uboot 和 uImage | rootfs |
2)Android的启动顺序
先启动Uboot(bootloader)--->启动uImage/zImage(安卓内核)--->启动ramdisk(虚拟内存盘)--->对于安卓系统进行简单的初始化--->初始化之后会去挂载
PS:其实ramdisk相当于系统的根(由于其是虚拟内存盘,所以这个根在内存里面)
在ramdisk(根)目录下有这几个目录文件,需要进行分区挂载,
--->system(只有超级用户可以操作的<系统自带的软件“电话”“短信”等>)
--->data(普通用户可以操作的<相当于是安卓操作系统下的一个家目录,用户自己下载的文件放置在这里>)
--->cache(放的是一些缓存文件)
--->storage(可以存放用户自己的一些文件)
对于安卓系统来说硬盘翻去最少需要这四个
没有Uboot就没有办法进入recovery模式(刷过机的都知道,recovery模式是属于Uboot的一个工具,恢复出厂设置,相当于是格式化data分区)
EMMC(8GB)|Uboot uImage ramdisk | cache | data | storage | system|
看上去分区比Linux麻烦些。
烧写Uboot的实验
对于我的S5P6818的开发板来说,板子的启动设备有:
- 第一启动设备是SD0
- 第二启动设备是EMMC
- 第三启动设备是USB
我们拿到一个新的开发板之后,EMMC是新的,里面什么都没有
所以我们不能通过EMMC启动,只能从SD0或者USB启动
SD0启动更方便,需要SD卡中有启动代码就是Uboot
所以需要先吧Uboot烧写到SD卡中
需要把Uboot放到SD卡的第513个字节,也就是说SD卡需要在前面空出512个字节。
问我原因的话,只能说是S5P6818要求的
1)为啥要第513字节?
主要是因为S5P6818内部有一块rom,里面存储的三星公司固化好的程序,当S5P6818芯片启动之后先执行ROM中的代码,执行之后获取SD卡中读bootloader。
把bootloader读到6818内部的RAM中执行bootloader的第一阶段。
第一阶段的功能就是初始化核心板上的DDR3内存,然后在核心板上的DDR中执行bootloader的第二阶段。
bootloader必须要放到SD卡的第513个字节上,要不然6818的rom找不到bootloader
2)为啥不放到第0个字节?
主要是因为SD卡的前512个字节(第一个扇区),存放的是分区表(分区的开始、结束、大小...)
3)如何准确的写入到SD卡的第513个字节?
可以使用高编学过的知识,在Linux下一切皆文件。使用lseek进行偏移值操作
SD卡插入到Linux系统中就是一个文件
是用open close read write lseek
我们是这样给SD卡分区,SD卡开头512byte之后给它预留100MB或者SD卡1/100的空间。(给Uboot和Uimage留的空间)
把分区格式化为FAT32格式
SD卡[512byte + 100MB | ---FAT32--- |]
首先,你需要一张SD卡和Linux操作系统(自行搜索安装虚拟机及乌班图系统),前置硬件准备是必须的
创建SD卡分区
- 先把SD卡插入到PC机中
- 驱动在Linux系统中识别
一般来说sda是PC机的硬盘分区,sdb就是SD卡
/dev/sdb是整个SD卡设备
/dev/sdb1是SD卡里面的第一个分区
所以我们要写入bootloader到/dev/sdb文件的513个字节 - 确定SD卡是否挂载到了Linux操作系统中
在Linux命令行中使用mount命令(查询挂载)
即使没有找到挂载的SD卡分区,也没关系
因为我们需要重新分区,需要把挂载的分区卸载掉 - 卸载挂载的分区
umount /dev/sdb1 来进行卸载 - 去报卸载成功,重新查询一下
- 重新建立分区
需要使用fdisk命令(可用于对磁盘分区的操作)- sudo fdisk /dev/sdb
- p 命令(查看sd卡信息)
- d 命令(删除分区)
- p 命令(再次查看是否已经删除分区)
- n 命令(选择分区类型)(然后双回车,默认分区类型为p(主分区),分区号1
- 扇区大小 直接/100,例如我的是15728639,则写入157286,然后回车,(如果是新卡,此处没有移除签名选项,如果不是新卡,则有签名选项,Y即可
- t 命令,选择分区 1,L (大写)查看所有代码,选择FAT32的,也就是代码 b
- p 命令,(再次查看确认类型为 W95 FAT32)
- w 命令(同步磁盘,确认分区表)
- sudo fdisk /dev/sdb
- 给SD卡新创建的出来的分区进行格式化
在终端命令行输入
sudo mkfs.vfat -F 32 /dev/sdb1 -n red
(-n 后是自己想要起的名字,自行决定即可)