首页 > 系统相关 >Linux操作系统从BIOS到bootloader是如何运行的

Linux操作系统从BIOS到bootloader是如何运行的

时间:2023-10-19 23:02:27浏览次数:43  
标签:kernel img grub -- boot 扇区 BIOS Linux bootloader

操作系统一般都会在安装在硬盘上,在 BIOS 的界面上。你会看到一个启动盘的选项。启动盘有什么特点呢?它一般在第一个扇区,占 512 字节,而且以 0xAA55 结束。这是一个约定,当满足这个条件的时候,就说明这是一个启动盘,在 512 字节以内会启动相关的代码。

这些代码是谁放在这里的呢?在 Linux 里面有一个工具,叫 Grub2,全称 Grand Unified Bootloader Version 2。顾名思义,就是搞系统启动的。

可以通过 grub2-mkconfig -o /boot/grub2/grub.cfg 来配置系统启动的选项。你可以看到里面有类似这样的配置。

menuentry 'CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-862.el7.x86_64-advanced-b1aceb95-6b9e-464a-a589-bed66220ebee' {
  load_video
  set gfxpayload=keep
  insmod gzio
  insmod part_msdos
  insmod ext2
  set root='hd0,msdos1'
  if [ x$feature_platform_search_hint = xy ]; then
    search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1'  b1aceb95-6b9e-464a-a589-bed66220ebee
  else
    search --no-floppy --fs-uuid --set=root b1aceb95-6b9e-464a-a589-bed66220ebee
  fi
  linux16 /boot/vmlinuz-3.10.0-862.el7.x86_64 root=UUID=b1aceb95-6b9e-464a-a589-bed66220ebee ro console=tty0 console=ttyS0,115200 crashkernel=auto net.ifnames=0 biosdevname=0 rhgb quiet 
  initrd16 /boot/initramfs-3.10.0-862.el7.x86_64.img
}

使用 grub2-install /dev/sda,可以将启动程序安装到相应的位置。

grub2 第一个要安装的就是 boot.img。它由 boot.S 编译而成,一共 512 字节,正式安装到启动盘的第一个扇区。这个扇区通常称为 MBR(Master Boot Record,主引导记录 / 扇区)。

BIOS 完成任务后,会将 boot.img 从硬盘加载到内存中的 0x7c00 来运行。

由于 512 个字节实在有限,boot.img 做不了太多的事情。它能做的最重要的一个事情就是加载 grub2 的另一个镜像 core.img。

core.img 就是管理处,它们知道的和能做的事情就多了一些。core.img 由 lzma_decompress.img、diskboot.img、kernel.img 和一系列的模块组成,功能比较丰富,能做很多事情。

Linux操作系统从BIOS到bootloader是如何运行的_Linux

boot.img 先加载的是 core.img 的第一个扇区。如果从硬盘启动的话,这个扇区里面是 diskboot.img,对应的代码是 diskboot.S。

boot.img 将控制权交给 diskboot.img 后,diskboot.img 的任务就是将 core.img 的其他部分加载进来,先是解压缩程序 lzma_decompress.img,再往下是 kernel.img,最后是各个模块 module 对应的映像。这里需要注意,它不是 Linux 的内核,而是 grub 的内核。

lzma_decompress.img 对应的代码是 startup_raw.S,本来 kernel.img 是压缩过的,现在执行的时候,需要解压缩。

在这之前,我们所有遇到过的程序都非常非常小,完全可以在实模式下运行,但是随着我们加载的东西越来越大,实模式这 1M 的地址空间实在放不下了,所以在真正的解压缩之前,lzma_decompress.img 做了一个重要的决定,就是调用 real_to_prot,切换到保护模式,这样就能在更大的寻址空间里面,加载更多的东西。

切换到保护模式要干很多工作,大部分工作都与内存的访问方式有关。

第一项是启用分段,就是在内存里面建立段描述符表,将寄存器里面的段寄存器变成段选择子,指向某个段描述符,这样就能实现不同进程的切换了。第二项是启动分页。能够管理的内存变大了,就需要将内存分成相等大小的块。

切换保护模式的函数 DATA32 call real_to_prot 会打开 Gate A20,也就是第 21 根地址线的控制线。

接下来我们要对压缩过的 kernel.img 进行解压缩,然后跳转到 kernel.img 开始运行。

kernel.img 对应的代码是 startup.S 以及一堆 c 文件,在 startup.S 中会调用 grub_main,这是 grub kernel 的主函数。

在这个函数里面,grub_load_config() 开始解析,我们上面写的那个 grub.conf 文件里的配置信息。

如果是正常启动,grub_main 最后会调用 grub_command_execute (“normal”, 0, 0),最终会调用 grub_normal_execute() 函数。在这个函数里面,grub_show_menu() 会显示出让你选择的那个操作系统的列表。

Linux操作系统从BIOS到bootloader是如何运行的_Linux_02


标签:kernel,img,grub,--,boot,扇区,BIOS,Linux,bootloader
From: https://blog.51cto.com/key3feng/7943132

相关文章

  • Linux远程管理协议
    (RFB、RDP、Telnet和SSH)是Linux的远程管理协议。提到远程管理,通常指的是远程管理服务器,而非个人计算机。个人计算机可以随时拿来用,服务器通常放置在机房中,用户无法直接接触到服务器硬件,只能采用远程管理的方式。远程管理,实际上就是计算机(服务器)之间通过网络进行数据传输(信息交换)的过......
  • Linux下KVM平台知识详解(1)——KVM基础知识
    一、虚拟化简介(一)虚拟化概述在计算机中,虚拟化技术是一种资源管理技术,可以将计算机的各硬件资源(包括CPU、内存、磁盘、网络)等予以抽象,转换后呈现出来,以供用户更好的使用。系统虚拟化可以将底层物理设备、上层操作系统和软件之间分离,可以在一台物理设备上划分出多台机器。虚拟化技术......
  • VMware 与 NOI Linux 2.0 安装
    免责声明:考试当天不用VMware,用VituralBox,但我喜欢VMware,且系统内部使用方法基本一样。VMware下载NOILinux2.0下载一、安装VMware打开VMware-Workstation-Lite-17.0.1-21139696-精简安装注册版.exe,进入安装界面。欢迎使用VMwareWorkstationPro安装向导:下一步。......
  • linux yum安装maven
    安装mavenwgethttp://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo-O/etc/yum.repos.d/epel-apache-maven.repoyum-yinstallapache-maven查看mavenhomemvn-v 配置环境变量vi/etc/profile重载环境变量source/etc/profile......
  • linux centos7 部署 nodejs 的 express
      链接:https://www.youtube.com/watch?v=oGbLL1_0q64 yuminstallgcc-c++openssl-develmake-ycd/tmpcurl-sLhttps://rpm.nodesource.com/setup|bash-yuminstall-ynodejsnpminstall-gexpress-generatoruseraddusernamepasswdusernamemkdirfirst_project......
  • Linux 软连接 ln -s 简单使用看这篇就够了
    全网很多文章讲源文件和目标文件,或者target和source哪个连到哪个完全没有讲清楚,一个不小心操作失误很容易造成源数据直接丢失!!! 1ln-s/A/B 这里A和B的路径要用绝对路径,执行这个命令就是在当前目录下把B指向A,也就是A是实际存在的,B是虚拟的假的......
  • Linux shell编程学习笔记8:使用字符串
    一、前言字符串是大多数编程语言中最常用最有用的数据类型,这在Linuxshell编程中也不例外。本文讨论了LinuxShell编程中的字符串的三种定义方式的差别,以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,,以及反引号在echo和expr命令联合使用时的作用。二......
  • Linux shell编程学习笔记4:修改命令行提示符格式(内容和颜色)
    一、命令行提示符格式内容因shell类型而异Linux终端命令行提示符内容格式则因shell的类型而异,例如CoreLinux默认的shell是sh,其命令行提示符为黑底白字,内容为:tc@box:/$其中,tc为当前用户名,box为主机名,/为当前目录路径,$表示当前用户类型是普通用户 。 二、环境变量PS1存储了命令行提......
  • Linux账号密码安全策略设置
    前言随着云计算厂商的兴起,云资源如ECS不再只有企业或者公司才会使用,普通人也可以自己买一台ECS来搭建自己的应用或者网站。虽然云计算厂商帮我们做了很多安全相关的工作,但并不代表我们的机器资源就绝对是安全的。要知道有很多事情是云计算厂商不能为我们做的,就比如账号密码的安全......
  • Linux I/O schedulers类型简介
    I/Oschedulersattempttoimprovethroughputbyreorderingrequestaccessintoalinearorderbasedonthelogicaladdressesofthedataandtryingtogroupthesetogether.WhilethismayincreaseoverallthroughputitmayleadtosomeI/Orequestswaitin......