zoukankan      html  css  js  c++  java
  • 趣谈linux操作系统笔记-从BIOS到bootloader

    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命令,表示装载指定的内核文件,并传递内核启动参数

  • 相关阅读:
    java它 ------ 图形界面(两)
    使用python+flask让你自己api(教程源代码)
    hadoop工作平台梳理
    互斥锁设计,有效的避免死锁
    Cache基础知识OR1200在ICache一个简短的引论
    工作日志2014-08-04
    POSIX 螺纹具体解释(1-概要)
    3.1、Eclipse
    vim cheat sheet
    C++ 学习资料搜寻与学习(第一期)(未完待续)
  • 原文地址:https://www.cnblogs.com/mrwuzs/p/11274551.html
Copyright © 2011-2022 走看看