x86架构芯片启动过程分析

1、上电启动顺序

x86架构芯片启动过程分析_第1张图片

上电自检
读取ROM里的bios程序
bios程序会进行硬件检测,比如:内存、硬盘、显卡等
bios完成自检后,需要选择引导设备。比如设备上有U盘、SSD、eMMC、机械硬盘,bios需要知道从哪个启动介质去启动计算机
bios操作界面是有默认的启动顺序,也可以在bios阶段手动修改启动顺序
确定好启动介质后,bios会去启动介质读取MBR分区表或者gpt分区表
在引导分区中存放了启动配置文件grub.cfg
grub.cfg文件里会指明内核放在哪个分区、根文件系统位置等
解析grub.cfg文件,启动内核、挂载根文件系统
备注:截图来自《史上最牛的Linux视频教程—兄弟连》

2、MBR和GPT分区

MBR分区:
(1)MBR(MasterBootRecord)是主引导记录的缩写,引导扇区是每个每个分区的第一个扇区,而主引导扇区是硬盘的第一个扇区;
(2)MBR分区最多支持4个主分区或者三个主分区+一个扩展分区,最多只能识别2TB的空间;
GPT分区:
(1)GPT是GUID磁碟分割表(GUID Partition Table)的缩写,中文含义“全局唯一标识磁盘分区表”,每个分区表有唯一的一串标识符来表示;
(2)GPT可以识别超过2T的空间,理论上可以有无数多个分区,但是实际上会有限制,在Windows中gpt最多支持128个主分区;
总结:GPT的出现晚于MBR,GPT分区方案比MBR更先进,目前推荐使用GPT分区方案;
.

3、把存储介质制作成启动盘

3.1、场景介绍

(1)有重装过电脑Windows系统经历的博友应该知道,重装过程就是制作一个启动U盘,从U盘启动然后去烧录硬盘;
(2)启动U盘里是一个完整的系统,在启动后能识别硬盘并且能把系统烧录到硬盘里,经过烧录后,硬盘里也有一个完整的系统,只需要修改启动顺序,这样电脑每次都从硬盘启动,这时候就不需要U盘了;
(3)下面介绍的脚本,就是启动U盘里用于烧录系统到硬盘/SSD的过程;

3.2、制作启动盘的脚本

#清楚掉ssd的分区信息
dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=1 
sectors_of_ssd=`cat /sys/block/nvme0n1/size`
dd if=/dev/zero of=/dev/nvme0n1 seek=$((${sectors_of_ssd}-32)) bs=512 count=32 > /dev/null 2>&1
sync

建立gpt格式分区表
parted /dev/nvme0n1 --script mklabel gpt		

#建立新的主分区,partion_start是分区起始地址,partion_end是分区结束地址
parted /dev/nvme0n1 --script mkpart primary ${partion_start} ${partion_end} 	

#设置第一个分区为引导分区
# set的格式:set number flag state
#如果你想从某个分区引导,那么你应该将这个分区的boot标记设置为on
parted /dev/nvme0n1 --script set 1 boot on    

#打印分区表
parted /dev/nvme0n1 --script print 

#格式化第一个分区为vfat格式,并设置卷名为ESP分区
mkfs.vfat -n 'ESP' /dev/nvme0n1p1

#格式化除第一分区之外的其他分区为ext4格式或者其他的文件系统格式
mke2fs -t ext4 -F -b 4096 -L "分区的标签名" /dev/nvme0n1p2 > /dev/null 2>&1

#挂载第一个启动分区,拷贝启动文件,比如:grub.cfg
mount -t vfat /dev/nvme0n1p1 /mnt/boot 
mkdir -p /mnt/boot/efi/boot
cp /system_files/efi/grub.cfg /mnt/boot/efi/boot/

# 拷贝内核、文件系统到指定分区
······

3、grub.cfg

set default=0	#默认从哪个菜单项启动
set fallback=3	#如果默认菜单项启动失败,那么就启动第几个菜单项(从'0'开始计数)
set gfxmode=1280x1024,auto	# 设置gfxterm使用的分辨率
set lang=en_US	#设置GRUB2的界面语言,简体中文应设为'zh_CN'
set timeout=3	#在启动时有3秒时间来选择从哪个菜单项启动

#菜单项0,作为正常启动模式
menuentry " device (Normal Mode)" {
        search --set -l boot_partition	# 查找标签是boot_partition的分区,该分区作为根分区
        linux /bzImage fbconsole=disable console=ttyS0,115200	# 内核镜像是根分区的bzImage,启动参数是fbconsole=disable console=ttyS0,115200
        initrd /root_image.gz	# 根文件系统是根分区的root_image.gz文件,文件系统类型是initrd
}

#菜单项1,作为异常情况下的启动模式,一般是Normal模式启动失败的情况下采用,用于恢复系统
menuentry " device (Rescue Mode)" {
        search --set -l rescue_partition	# 查找标签是rescue_partition的分区,该分区作为根分区
        linux /bzImage Rescue=1 fbconsole=enable # 内核镜像是根分区的bzImage,启动参数是Rescue=1 fbconsole=enable
        initrd /root_image.gz	# 根文件系统是根分区的root_image.gz文件,文件系统类型是initrd
}

你可能感兴趣的:(嵌入式Linux内核,X86架构,嵌入式开发)