BIOS

在主板上,有一个东西叫ROM(Read Only Memory,只读存储器)。这和咱们平常说的内存RAM(Read Access Memory,随机存取存储器)不同。 而 ROM 是只读的,上面早就固化了一些初始化的程序,也就是BIOS(Basic Input and Output System,基本输入输出系统)。

在x86系统中,将1M空间最上面的0xF0000到0xFFFFF这64K映射给ROM,也就是说,到这部分地址访问的时候,会访问ROM ,当电脑刚加电的时候,会做一些重置的工作,将CS设置为0xFFFF,将IP设置为0x0000,所以第一条指令就会指向0xFFFF0,正是在ROM的范围内。在这里,有一个JMP命令会跳到ROM中做初始化工作的代码,于是,BIOS开始进行初始化的工作

CS:全拼为“Code Segment”翻译为“代码段寄存器”

DS:是 Data Segment 的缩写,翻译为“数据段寄存器”;
SS:是 Stack Segment 的缩写,翻译为“堆栈段寄存器”;
ES:是 Extra Segment 的缩写,翻译为“附加段寄存器”

IP:IP是指令指针寄存器(相当于偏移地址)

1,BIOS 要检查一下系统的硬件

2,要建立一个中断向量表和中断服务程序,

3,检查正常则屏幕显示系统BIOS信息

计算机开机BIOS初始化与MBR操作系统引导详解

bootloader 时期

在 BIOS 的界面上。会有启动盘的选项。一般在第一个扇区,占 512 字节,而且以 0xAA55 结束。这是一个约定,当满足这个条件的时候,就说明这是一个启动盘,在 512 字节以内会启动相关的代码

在 Linux 里面有一个工具,叫Grub2,全称 Grand UnifiedBootloader Version 2。可以通过 grub2-mkconfig -o /boot/grub2/grub.cfg 来配置系统启动的选项

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

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

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

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

core.img 由lzma_decompress.img、diskboot.img、kernel.img和一系列的模块组成

1,boot.img 先加载的是 core.img 的第一个扇区。如果从硬盘启动的话,这个扇区里面是diskboot.img,对应的代码是 diskboot.S。
2,boot.img 将控制权交给 diskboot.img 后,diskboot.img 的任务就是将 core.img 的其他部分加载
进来,先是解压缩程序 lzma_decompress.img,再往下是 kernel.img,最后是各个模块 module
对应的映像。这里需要注意,它不是 Linux 的内核,而是 grub 的内核。
lzma_decompress.img 对应的代码是 startup_raw.S,本来 kernel.img 是压缩过的,现在执行的
时候,需要解压缩。

在真正的解压缩之前,lzma_decompress.img 需要调用 real_to_prot,切换到保护模式,这样就能在更大的寻址空间里面,加载更多的东西。

从实模式切换到保护模式

需要做以下工作:

第一项是启用分段,就是在内存里面建立段描述符表,将寄存器里面的段寄存器变成段选择子,指向某个段描述符,这样就能实现不同进程的切换了。

第二项是启动分页。能够管理的内存变大了,就需要将内存分成相等大小的块

第三项打开 Gate A20,也就是第 21根地址线的控制线。(在实模式 8086 下面,一共就 20 个地址线,可访问 1M 的地址空间。如果超过了这个限度怎么办呢?当然是绕回来了。在保护模式下,第 21 根要起作用了,于是我们就需要打开 Gate A20。 )切换保护模式的函数 DATA32 call real_to_prot 会打开 Gate A20,也就是第 21 根地址线的控制
线

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() 会显示出让你选择的那个操作系统的列表

linux16命令,表示装载指定的内核文件,并传递内核启动参数

趣谈linux操作系统笔记-从BIOS到bootloader的更多相关文章

  1. 趣谈linux操作系统笔记-内核初始化

    内核的启动从入口函数 start_kernel() 开始.在 init/main.c 文件中,start_kernel 相当于内核的main 函数.打开这个函数,你会发现,里面是各种各样初始化函数 X ...

  2. 深挖计算机基础:趣谈Linux操作系统学习笔记

    参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ...

  3. 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径

    前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...

  4. 趣谈Linux操作系统学习笔记:第二十七讲

    一.文件系统的功能规划 1.引子 咱们花了这么长的时间,规划了会议室管理系统,这样多个项目执行的时候,隔离性可以得到保证. 但是,会议室里面被回收,会议室里面的资料就丢失了.有一些资料我们希望项目结束 ...

  5. 趣谈Linux操作系统学习笔记:第二十讲

    一.引子 1.计算两方面的原因 2.内存管理机制 二.独享内存空间的原理 1.会议室和物理内存的关系 和会议室一样,内存都被分成一块块儿的,都编号了号,例如3F-10就是三楼十号会议室.内存页有这样一 ...

  6. 趣谈Linux操作系统学习笔记:第二十一讲

    一.分段机制 1.分段机制的原理图 2.段选择子 3.段偏移量 例如,我们将上面的虚拟空间分成以下 4 个段,用 0-3 来编号.每个段在段表中有一个项,在物理空间中,段的排列如下图的右边所示. 4. ...

  7. 趣谈Linux操作系统学习笔记:第二十四讲

    一.小内存的分配基础 1.kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_s ...

  8. 趣谈Linux操作系统学习笔记:第二十五讲

    一.mmap原理 在虚拟内存空间那一节,我们知道,每一个进程都有一个列表vm_area_struct,指向虚拟地址空间的不同内存块,这个变量名字叫mmap struct mm_struct { str ...

  9. 趣谈Linux操作系统学习笔记:第二十六讲

    一.内核页表 和用户态页表不同,在系统初始化的时候,我们就要创建内核页表了 我们从内核页表的根swapper_pg_dir开始找线索,在linux-5.1.3/arch/x86/include/asm ...

随机推荐

  1. ORA-00001:unique constraint (use.sys_c0013338) violated

    从报错的 信息来看,是唯一约束.但是第一眼看到use.sys_c0013338 误以为是张表,(老司机帆船了啊,水还是咸的!) 解决方法: SQL>select table_name from ...

  2. C# 封装返回类

    using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System. ...

  3. Codeforces Round #581 (Div. 2) B. Mislove Has Lost an Array (贪心)

    B. Mislove Has Lost an Array time limit per test1 second memory limit per test256 megabytes inputsta ...

  4. Reservoir Computing: Harnessing a Universal Dynamical System

    原文连接:https://sinews.siam.org/Details-Page/reservoir-computing-harnessing-a-universal-dynamical-syste ...

  5. Codeforces 708D 上下界费用流

    给你一个网络流的图 图中可能会有流量不平衡和流量>容量的情况存在 每调整一单位的流量/容量 需要一个单位的花费 问最少需要多少花费使得原图调整为正确(可行)的网络流 设当前边信息为(u,v,f, ...

  6. C#线程中LOCK的意义

    学习心得,为的是让新人能理解,高手直接绕~ lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放. 引用一句 ...

  7. 北美CS求学找工指南

    这篇文章主要谈谈来美求学工作这一路的点点滴滴,因为之前留言中不少同学对这方面内容比较感兴趣,有些已经在准备,有些还在犹豫,希望本文能对大家有些许帮助.因为来美的途径也有不少,有上学.有投资.有通过国内 ...

  8. git最最最最...常用命令

    使用git 也有一段时间了,但是一直没有好好的去学下:今天刚好有空,就把自己不足的地方补了一下:废话就不多说了,直接步入正题: 1:git 如何提交代码 以及 如何拉代码 git clone可以将远程 ...

  9. MYSQL数据库事务4种隔离级别及7种传播行为

    事务的特性: 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割. 一致性:事务执行的前后,数据完整性保持一致. 隔离性:事务执行不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数 ...

  10. ${filename}用法一:${file内部的#%的匹配方式}

    假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用${ }分别替换获得不同的值: ${file#*/}:拿掉第一条/及其左边的字串:dir1/di ...