linux系统启动流程

一、启动流程总体介绍

Arm不具有BIOS/OpenSBI的概念,直接从flash启动。

每个镜像都至少包含启动分区和文件系统。大部分的Bootloader都会提前由硬件厂商烧录到ROM/Flash中。个别厂家也会将定制的内核烧到开发板中。

/boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件

系统运行级别(runlevel):

       运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

       运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录

       运行级别2:多用户状态(没有NFS)

       运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式

       运行级别4:系统未使用,保留

       运行级别5:X11控制台,登录后进入图形GUI模式

       运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

/etc/init.d: Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。/etc/init.d/下的每个脚本都按照统一规则编写,设置运行级别。

大多数开发板都会通过串口输出启动日志信息,并且可以通过串口及网口(SSH)登录。

二、OpenSBI/BIOS

OpenSBI:

opensbi就是一个开源的RISC-V虚拟化二进制接口的通用的规范。运行在m模式下的一套软件,提供接口给操作系统内核调用,以操作硬件,实现字符输出及时钟设定等工作。 

SBI的全称是RISC-V Supervisor Binary Interface 。它提供了risc-v标准的S-mode OS与Supervisor Execution Environment (SEE)  接口。一般来说,操作系统都不会直接管理硬件资源,会通过SBI去调用到M-mode。RISC-V的特权等级设计共3级,比Armv8-A少一级

RSIC-V工作模式:

任何情况下,一个RISCV处理器线程必须运行在某个模式下,而区分这些工作模式的原因是为不同的软件栈部件提供保护。当一个线程试图执行当前模式下不允许的操作,将会产生异常。

RISC-V三种工作模式:

机器模式(M):必选项,另外两种可选;通常运行bootloader或者firmware等

监督模式(S)若支持该模式,另外两种须均支持;该模式下可以运行linux等OS kernel

用户模式(U)此类系统实现用户和机器模式的区分,从而实现资源保护;可以运行应用程序

BIOS:

⼀组固化到计算机内主板上⼀个ROM 芯⽚上的程序,它保存着计算机最重要的基本输⼊输出的程序、开机后⾃检程序和系统⾃启动程序,它可从CMOS 中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

由硬盘启动时,BIOS 通常是转向第⼀块硬盘的第⼀个扇区,即主引导记录(MBR) 。按照BIOS 所设定的系统启动流程,如果检测通过,则根据引导次序(Boot Sequence) 开始在第⼀台设备上⽀持启动程序,我们的启动设备主要包括硬盘、USB 、SD 等,我们⼀般⽤的是硬盘,然后进⾏读取第⼀个设备就是硬盘,第⼀个要读去的就是该硬盘的主引导记录MBR (Master BootRecord ),然后系统可以根据启动区安装的引导加载程序(Boot Loader )开始执⾏核⼼识别的⼯作。然后将控制权交给主引导代码。

三、U-Boot/Grub

U-Boot:

嵌入式操作系统较多使用u-boot启动。

  1. u-boot主要作用是用来启动操作系统内核。
  2. u-boot还要负责部署整个计算机系统。
  3. u-boot中还有操作Flash等板子上硬盘的驱动。
  4. u-boot还得提供一个命令行界面供人来操作。

能够引导操作系统内核启动并给内核传参

(1)uboot的终极目标就是启动内核。

(2)linux内核在设计的时候,设计为可以被传参。我们可以在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。

(3)uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。

见配置文件/etc/default/u-boot    /boot/extlinux/extlinux.conf

uboot还得提供一个命令行界面供人来操作。

u-boot环境变量列举:

bootdelay:uboot启动后进入linux的自动倒数秒数,

baudrate:串口波特率

ethaddr:网口MAC地址

ipaddr:网口IP地址

serverip:服务端网口地址

gatewayip:子网掩码

netmask:默认网关

boottargs:保存着uboot传递到linux内核的参数

bootcmd:保存着uboot默认的命令,uboot倒计时以后就会执行bootcmd命令

修改环境变量后一定通过通过save命令保存。否则只是当前启动生效。

Grub:

Grub界面:通常底部会表明按"e"进入编辑

按"e"进入编辑模式界面,可以修改需要传递给内核的参数等。

四、Kernel

内核编译:

  1. make  <Configuration_File>  CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv

<Configuration_File> :针对硬件的内核配置文件,每个硬件厂商都会在内核源码目录中添加。

  1. make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv menuconfig

  1. make CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv -jx  或打包成deb   

     make CROSS_COMPILE=riscv64-linux-gnu ARCH=riscv INSTALL_MOD_STRIP=1 -j`nproc` bindeb-pkg

内核裁剪就是针对硬件,去掉内核中不必要的模块,或将Y变成M,以缩小内核体积。

内核安装:

编译成deb包后直接安装即可。

内核安装后会在/boot/目录下生成对应的内核文件。u-boot会找到/boot目录引导启动内核。

config-5.15.0:内核配置文件,根据你针对内核的配置生成。

System.map:记录了所有符号的运行地址,符号可以理解成函数名和变量。每次内核编译都会重新生成。相当于符号表,记录符号地址,出错时堆栈信息里保存出错的内存地址,通过该文件转换成对应的名称。

vmlinuz-5.15.0:可引导的,压缩的内核。

initrd.img-5.15.0:是一个小的映像,存放启动相关的驱动模块。通常的步骤事先启动内核,然后内核挂载initrd.img,并执行里面的脚本进一步挂载各种各样的模块。其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个进程(init进程),完成系统后续的启动。可以定制修改,可使用update-initramfs 命令重新生成文件。 

dtbs:设备树文件,读取硬件信息。

extlinux/extlinux.conf:配置文件,配置启动文件路径及传递给内核的参数。

内核驱动:

存在于系统目录/usr/lib/modules/5.15.0-60-generic/kernel/drivers/

lsmod:查看当前系统已加载模块    modinfo:查看模块详细信息。可手动加载insmod

常说的驱动分为用户层驱动和内核层驱动,上图简要说明用户层驱动和内核层驱动之间的关系。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值