精华内容
下载资源
问答
  • 操作系统–C2 计算机加电后发生什么 BIOS简介 BIOS 是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。...BIOS是一组固化计算机主板上一个ROM芯片上的程...

    操作系统–C2 计算机加电后发生了什么

    BIOS简介
    BIOS 是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。在IBM PC兼容系统上,是一种业界标准的固件接口。 [1] BIOS这个字眼是在1975年第一次由CP/M操作系统中出现。 BIOS是个人电脑启动时加载的第一个软件
    BIOS是一组固化到计算机内主板上一个ROM芯片上的程序。它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS1中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

    简单来说就是在主板上,有一个东西叫ROM(Read Only Memory,只读存储 器)。这和咱们平常说的内存RAM(Random Access Memory,随机存取存储器)不 同。
    咱们平时买的内存条是可读可写的,这样才能保存计算结果。而 ROM 是只读的,上面早 就固化了一些初始化的程序,也就是BIOS。

    如果你自己安装过操作系统,刚启动的时候,按某个组合键,显示器会弹出一个蓝色的界 面。能够调整启动顺序的系统,就是我说的 BIOS,然后我们就可以先执行它。
    在这里插入图片描述
    BOIS空间利用
    在这里插入图片描述
    在 x86 系统中,将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给 ROM,也就是 说,到这部分地址访问的时候,会访问 ROM。
    当电脑刚加电的时候,会做一些重置的工作,将 CS 设置为 0xFFFF,将 IP 设置为 0x0000,所以第一条指令就会指向 0xFFFF0,正是在 ROM 的范围内。在这里,有一个 JMP 命令会跳到 ROM 中做初始化工作的代码,于是,BIOS 开始进行初始化的工作。

    BIOS存在的目的
    包括:检测硬件、初始化硬件、分配资源(如IO地址、IRQ号、DMA通道等)以及协助加载操作系统。

    BIOS经历的三个阶段
    从主机上电到加载bootloader这个过程中,系统BIOS主要经历了三个阶段:Power on ,POST ,加载bootloader .

    Power On 阶段 这一阶段从上电开始到屏幕出现信息结束,也就是所谓的激活电源阶段。这一阶段的主要任务是校验CMOS中的内容是否正确、检查主机上某些硬件的状态以确定下一步的自检,因此,用户无法在屏幕上看到BIOS信息(要等硬件确认后才激活VGA) ,若这个阶段出现错误一般都是致命的(通常为黑屏),只能通过喇叭声来判断错误类型。这个阶段只是检查系统上都有哪些设备,并不初始化。

    POST(power on self test)开机自检阶段, 检查一些关键设备如内存、显卡能否正常工作,并提供简易的内存测试,只要测试没问题,就在屏幕上显示该硬件的基本信息。这个阶段的基本过程如下:系统BIOS查找显卡的BIOS,存放显卡BIOS的ROM芯片的起始地址通常在C0000H处,然后调用其初始化代码,由显卡的BIOS完成显卡的初始化,然后屏幕就可以显示信息了,大多数的显卡会在这时显示显卡的一些信息,但是通常只是一闪而过。依次类推,系统BIOS调用在前一个阶段找到的设备的BIOS代码,以完成相应设备的初始化。查完其它所有设备后,BIOS将显示自己的启动画面,接着检查CPU的类型和工作频率、主机的内存容量,然后系统BIOS开始测试和配置系统中安装的一些标准硬件设备如硬盘、光驱、COM口、并口等,然后BIOS开始检查并配置系统中的即插即用设备。开机时和开机后所有需要用到的设备都是在这个阶段被激活的。

    加载bootloader阶段 当所有的硬件都检测完毕并没有问题后,BIOS退居幕后的办法是将加载OS的主控权交给硬盘的主引导扇区MBR即硬盘的物理扇区0柱0面1扇区上的内容,让藏匿于此的开机管理程序(bootloader)将指针带到系统核心的地方。linux常见的开机管理程序为Grub2.全称 Grand Unified Bootloader Version 2。顾名思义,就是搞系统启动的。

    综上,系统激活流程为:打开电源开关—CPU初始化—BIOS激活—读取并校验CMOS资料、检测硬件状态(此时BIOS代码在flash memo中运行)—生成SMBIOS表格—检测、配置并初始化各硬件—加载bootloader 。

    Bootloader

    引导加载程序是系统加电后运行的第一段软件代码,称之为Bootloader。BootLoader是Booter和Loader的合写:前者意味着要初始化嵌入式系统硬件使之运行起来,至少是部分运行起来,与PC机中的BIOS作用相似;后者意味着将嵌入式操作系统映像加载到内存中,并跳转过去运行。如PC机中MBR上的BootLoader(PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。)

    Grub2

    开机管理程序Grub2,全称 Grand Unified Bootloader Version 2。顾名思义,就是搞系统启动的。
    你可以通过 grub2-mkconfig -o /boot/grub2/grub.cfg 来配置系统启动的选项。你可以 看到里面有类似这样的配置。

    在这里插入图片描述
    这里面的选项会在系统启动的时候,成为一个列表,让你选择从哪个系统启动。最终显示出
    来的结果就是下面这张图。至于上面选项的具体意思,我们后面再说。
    在这里插入图片描述
    使用 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 由 lzma_decompress.img、diskboot.img、kernel.img 和一系列的模块组成,功能比较丰 富,能做很多事情。

    image.png

    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() 会显示 出让你选择的那个操作系统的列表。
    当选择启动某个操作系统,就要开始调用 grub_menu_execute_entry() ,开始解析并执行你选择的那一项。
    例如里面的 linux16 命令,表示装载指定的内核文件,并传递内核启动参数。于是 grub_cmd_linux() 函数会被调用,它会首先读取 Linux 内核镜像头部的一些数据结构,放 到内存中的数据结构来,进行检查。如果检查通过,则会读取整个 Linux 内核镜像到内 存。
    如果配置文件里面还有 initrd 命令,用于为即将启动的内核传递 init ramdisk 路径。于是 grub_cmd_initrd() 函数会被调用,将 initramfs 加载到内存中来。
    当这些事情做完之后,grub_command_execute (“boot”, 0, 0) 才开始真正地启动内 核。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    1. 这是一种RAM,用于存储计算机的一些基本配置信息(如计算机时间等),都是数据. ↩︎

    展开全文
  • 我们购买新电脑或是维护、维修电脑时都会听技术员说要设置"电脑主板程序",而这个主板程序就是BIOS或CMOS程序。没有计算机基础和初者通常不明白BIOS或CMOS程序到底是...BIOS是一组固化计算机主板上一个ROM上的...

    我们在购买新电脑或是维护、维修电脑时都会听技术员说要设置"电脑主板程序",而这个主板程序就是BIOS或CMOS程序。没有计算机基础和初者通常不明白BIOS或CMOS程序到底是什么?是干什么用的?那我们就一起来简单了解一下这个程序。

    80a293aed890acb28177c30356e986f3.png

    BIOS程序界面

    • BIOS是英文"Basic Input Output System"的缩略词,直译为"基本输入输出系统"。BIOS是一组固化到计算机内主板上一个ROM上的,其主要功能是为计算机提供最底层的、最直接的硬件设置和控制,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序。一块主板性能优越与否,很大程度上取决于主板上的BIOS管理功能是否先进。BIOS就是计算机领域的一个重要参数,是个人电脑启动时加载的第一个软件。
    • CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写。是制造大规模集成电路芯片用的一种技术或用这种技术制造出来的芯片,是电脑主板上的一块可读写的RAM芯片。因为可读写的特性,所以在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据,这个芯片仅仅是用来存放数据的。

    94a2ef28f07a0a08595329ad1272bbc7.png

    CMOS芯片

    • CMOS是系统参数存放的区域,而BIOS程序设置是完成参数设置的手段,准确的说法应是通过BIOS设置程序对CMOS参数进行设置。BIOS程序就是存储在CMOS存储器中的,也可以简单的理解为BIOS是软件CMOS是硬件,CMOS是用于存储BIOS这个软件的地方。

    所以无论把"电脑主板程序"叫做BIOS或CMOS程序都是正确的。


    afcbd185a7115364f0e361e7372770a7.png

    BIOS程序界面

    • 电脑厂商和电脑主板厂商都会把BIOS设置程序整合在芯片中,市面上较流行的主板BIOS主要有 Award、AMI、Phoenix公司三种类型的BIOS,此外还有Insyde BIOS。兼容台式电脑,通常是Award、AMI、Phoenix公司的BIOS程序。
    • 在电脑开机时通过特定的按键进入BIOS设置程序,不同的BIOS有不同的进入方法,电脑开机画面通常会出现【Press XXX to Enter SETUP】的提示。在保证电脑键盘良好并与电脑正确连接的下情况下,按屏幕提示按下"XXX"键就可以进入BIOS设置("XXX"指对应的键盘按键)。电脑或主板的使用说明书也有进入BIOS设置的说明。
    • Award BIOS:按"Del"键;
    • AMI BIOS:按"Del"或"ESC"键;
    • Phoenix BIOS:按"Del"或"F2"键;
    • IBM:按"F1"键;
    • HP:按"F2"键;
    • Sony:按"F2"键;
    • Dell:按"F2"键;
    • Acer:按"F2"键;
    • Toshiba:冷开机时按"Esc"键,然后按"F1"键;
    • HP compaq:按"F10"键;
    • Fujitsu:按"F2"键;
    • 绝大多数国产品牌电脑:按"F2"键。
    • 最常见的进入BIOS设置按键为:"Delete(或Del)"或"F2",部分品牌电脑(包括台式电脑和笔记本电脑)也可按下:"F1"、"F10"、"F12"或"Esc"键,服务器除以上按键外,还会出现同时按下组合键的方式进入BIOS设置,如同进按下:"Ctrl+F10","Ctrl+Alt+F8","Ctrl+Alt+Esc"等。

    • 现在主流的BIOS系统通常都是英文界面为主,通过语言选择可以设置成不同的文字界面,包括中文界面等。而操作方式也是单一的键盘操作(少部份支持鼠标)。随着科技的发展和技术的进步,主流的主板厂商已采用新一代的UEFI BIOS系统。不久的将来UEFI BIOS系统将完全替代传统的BIOS系统。
    2fd7916a0f328b643141898213602b65.png

    UEFI BIOS程序界面

    下期将介绍BIOS程序常用设置,敬请期待!

    新手上路,不喜勿喷!

    展开全文
  • 固件是一些固化在芯片组上的程序,它会试图去启动 CPU。如果启动失败(例如 CPU 坏或没插好),计算机就会死机并给出错误提示(如某些版本的主板固件会发出蜂鸣警告)。这种状态称为“zoombie-with-fans”。 如果...

    首先用一张图来大致了解一下计算机启动的整个过程。

    上电

    按下主机的电源键后,计算机开始启动,主板上电后开始初始化其固件(firmware)。固件是一些固化在芯片组上的程序,它会试图去启动 CPU。如果启动失败(例如 CPU 坏了或没插好),计算机就会死机并给出错误提示(如某些版本的主板固件会发出蜂鸣警告)。这种状态称为“zoombie-with-fans”。

    如果前一个阶段未出错,就开始加电工作,在多 CPU 或多核 CPU 情况下,某一个 CPU 会被随机选取作为启动 CPU(bootstrap processor,BSP)运行 BIOS 内部的程序。其余的 CPU(application processor,AP)保持停机直到操作系统内核显式地使用它们。

    2000 年以前的计算机主板上均使用 BIOS,如今绝大多数计算机采用的是 EFI(Mac 用的就是 EFI)或 UEFI,BIOS 正在逐步被淘汰。基于 EFI、UEFI 的开机过程与传统的BIOS不尽相同,本文将以传统的 BIOS,Intel CPU 为例介绍开机过程。

    此时 CPU 工作模式为实模式,该模式下地址总线是 20 位,寻址范围是 0x00000~0xFFFFF 的 1M 范围。这也就解释了为什么 BIOS 的容量只有 1MB。

    Intel CPU 用三种运行模式: 实模式、32 位保护模式、64 位保护模式。实模式: Intel 8086 的寻址方案,为了商业连续性,兼容了这古老的方案;保护模式: 采用了虚实地址转换方案。

    BIOS 启动之初,内存是空的。此时 CPU 处于实模式,内存的地址映射均为硬连接的设备。内存映射图如下图所示:

    重置向量

    CPU 启动后其大多数寄存器会被初始化为预定的值,包括指令寄存器(instruction pointer, EIP),它保存着 CPU 将要执行指令的内存地址。此时 CPU 会有一个特殊行为,其会对 EIP 的初始值加上一个基址寄存器的值,生成一个 32 位的地址 0xFFFFFFF0。之所以称为特殊行为,是因为实模式下 CPU 只能寻址 1MB 地址空间,而这个 32 位地址已经大于 1MB 的内存限制。因此,0xFFFFFFF0 也被称为重置向量(reset vector),参考上图 0xFFFFFFF0 处的标识。

    于是,CPU 开始执行 0xFFFFFFF0 地址处的指令,该地址处是一条 JUMP 指令,这条指令清空了基址寄存器的值,并让指令跳回到 BIOS 开始处(物理地址为 0xF0000,参考上图 0xF0000 处的标识)以执行 BIOS。

    BIOS 内部可以分成两个区块: code block(普通程序)、boot block(引导程序)。上电后,boot block 会先被执行,它会检查 code block 的代码是否正确,如果正确,就会转到 code block 继续执行下去。

    BIOS 初始化

    0xF0000 地址实际上是 BIOS 中的 boot block 的开始处。在这个阶段,会初始化部分硬件。系统的 CPU、USB 只有部分被初始化。

    BIOS POST(加电自检)

    初始化完成后,CPU 跳转到 0xA0000 地址处(参考上图 640KB 处)进行 BIOS 加电自检(power on self test, POST)。这个过程会检查计算机的各项组件,如 CPU、显卡、内存、鼠标、键盘等。如果找不到内存或者键盘都有可能让BIOS停止工作并且打印一些相关的错误信息,如果找不到显卡 BIOS 会发出蜂鸣警告(因为无法显示画面)
    当 CPU 执行到 0xC0000 地址处(参考上图 768KB 处),开始寻找其他设备的 ROM,如果找到任何其他设备的 BIOS,它们也会被执行。
    下一步,显卡就会显示 BIOS 界面,并进行更深入的检查。

    BIOS 记录系统设定值

    检查完成后,BIOS 会根据自己的“系统资源表”,对系统进行进一步确认,从而确定计算机配有哪些资源或设备。例如 BIOS 支持随插即用,它会检测并配置随插即用设备。
    然后 BIOS 会遵循高级配置电源接口(Advanced Configuration Power Interface,ACPI)在内存中设置好一系列的数据来描述硬件信息,以便被操作系统内核利用。

    搜索 MBR

    到这一步,BIOS 开始尝试加载操作系统。它会从硬盘,光驱,软驱,网络等几个地方依次寻找操作系统(用户可以在 BIOS 设定中修改查找的优先级)。如果找不到操作系统,BIOS 会停机并给出错误信息。

    假设在硬盘上找到了操作系统,它会首先读取硬盘上的大小为 512 Bytes 的 0号扇区,这个扇区被称为 主引导记录(master boot record,MBR),其包含三部分:

    1. 引导程序(Boot Loader)
    2. 硬盘分区表(Partition Table)
    3. 结束标志字

    BIOS 读完磁盘上的 MBR 之后会把它拷贝到内存 0x7C00 地址处,然后 CPU 跳转到该内存地址执行 MBR 里的指令。事实上,被复制到物理内存的内容就是 Boot Loader。常见的 Boot Loader 有 grub、lilo、spfdisk。下图可以帮助大家理解 MBR 的结构。

    关于磁盘、分区表等基础知识,可参见 计算机那些事(1)——磁盘

    Boot Loader 执行

    以常见的 Linux Boot Loader —— grub 为例。

    Grub 加载后首先进行 内存盘初始化。Boot Loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统之前先访问内存中的 initrd 文件系统。

    关于 initrd
    Linux 内核需要适应多种不同的硬件架构,但是将所有的硬件驱动编入内核是不切实际的,而且内核也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上,Linux 的内核镜像仅包含了基本的硬件驱动,在系统安装过程中检测系统的硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd(bootloader initialized RAM disk。

    内存盘初始化完毕之后, grub 会根据配置文件 /boot/grub/grub.cfg 设定的内核镜像 vmlinuz 所在的路径,加载内核镜像,并进行解压缩操作。此时,屏幕一般会出现 “Uncompressing Linux” 的提示。当解压缩内核完成后,屏幕一般会输出 “OK, booting the kernel”。

    内核加载至内存完成后,grub 将控制权转交给内核。

    内核启动

    在 Boot Loader 配置了 initrd 的情况下,内核启动被分成了两个阶段:

    1. 执行 initrd 的文件系统中的 init 脚本。此阶段,内核会将控制权交给 init 文件处理。init 主要是加载各种存储介质相关的设备驱动。当所需的驱动程序加载完毕,就会创建一个根设备,然后将根文件系统 rootfs 以只读的方式挂载。这一步完成后,释放未使用的内存,并转换到真正的根文件系统中,进行第 2 阶段的处理。
    2. 执行真正的根文件系统中的 /sbin/init 进程,即系统的 1 号进程。此后,系统的控制权就全权交给 /sbin/init 进程了。

    系统初始化

    /sbin/init 进程是系统其它所有进程的父进程,当它接管了系统控制权后,它会根据 /etc/inittab 文件来执行相应的脚本,从而完成一系列的系统初始化操作。主要包括以下步骤:

    1. 设置运行等级。Linux 有运行等级如下:
      • 0:关机
      • 1:单用户模式
      • 2:无网络支持的多用户模式
      • 3:有网络支持的多用户模式
      • 4:保留,未使用
      • 5:有网络支持、有 X-Window 支持的多用户模式
      • 6:重新引导系统,即重启
    2. 执行 rc.sysinit。运行等级设置完成后,Linux 系统执行的第一个用户层文件是 /etc/rc.d/rc.sysinit 脚本程序,其完成的初始化操作主要包括:设置 PATH、设置网络配置/etc/sysconfig/network、启动 swap 分区、设置 /proc 等。
    3. 执行不同运行级别的脚本程序。根据运行级别的不同,系统会运行 rc0.d ~ rc6.d 中对应的脚本,从而完成对应的初始化工作,启动对应的服务。
    4. 执行 /etc/rc.d/rc.localrc.local 是 Linux 运行用户进行个性化设置的脚本。
    5. 执行 /bin/login。进入登录状态。此时,系统已经进入到等待用户输入 username 和 password 的阶段。

    参考

    1. How Computers Boot Up
    2. 即将换掉传统BIOS的UEFI
    3. Linux启动过程详解-《别怕Linux编程》之八
    4. 《Linux 系统架构与目录解析》
    5. INITRD 详解
    6. inux中init.d文件夹的说明
    7. Linux启动过程分析与优化,浙江大学硕士毕业论文
    8. 深入理解linux启动过程
    展开全文
  • 上电按下主机的电源键后,计算机开始启动,主板上电后开始初始化其固件(firmware)。固件是一些固化在芯片上的程序,它会试图去启动 CPU。如果启动失败(例如 CPU 坏或没插好),计算机就会死机并给出错误提示(如...

    首先用一张图来大致了解一下计算机启动的整个过程。70b290278391cc1d0ed26c30e7b895c5.png

    上电

    按下主机的电源键后,计算机开始启动,主板上电后开始初始化其固件(firmware)。固件是一些固化在芯片组上的程序,它会试图去启动 CPU。如果启动失败(例如 CPU 坏了或没插好),计算机就会死机并给出错误提示(如某些版本的主板固件会发出蜂鸣警告)。这种状态称为“zoombie-with-fans”。

    如果前一个阶段未出错,就开始加电工作,在多 CPU 或多核 CPU 情况下,某一个 CPU 会被随机选取作为启动 CPU(bootstrap processor,BSP)运行 BIOS 内部的程序。其余的 CPU(application processor,AP)保持停机直到操作系统内核显式地使用它们。

    2000 年以前的计算机主板上均使用 BIOS,如今绝大多数计算机采用的是 EFI(Mac 用的就是 EFI)或 UEFI,BIOS 正在逐步被淘汰。基于 EFI、UEFI 的开机过程与传统的BIOS不尽相同,本文将以传统的 BIOS,Intel CPU 为例介绍开机过程。

    此时 CPU 工作模式为实模式,该模式下地址总线是 20 位,寻址范围是 0x00000~0xFFFFF 的 1M 范围。这也就解释了为什么 BIOS 的容量只有 1MB。

    Intel CPU 用三种运行模式: 实模式、32 位保护模式、64 位保护模式。实模式: Intel 8086 的寻址方案,为了商业连续性,兼容了这古老的方案;保护模式: 采用了虚实地址转换方案。

    BIOS 启动之初,内存是空的。此时 CPU 处于实模式,内存的地址映射均为硬连接的设备。内存映射图如下图所示:f347b999bbb248a65bba1687acd1d884.png

    重置向量

    CPU 启动后其大多数寄存器会被初始化为预定的值,包括指令寄存器(instruction pointer, EIP),它保存着 CPU 将要执行指令的内存地址。此时 CPU 会有一个特殊行为,其会对 EIP 的初始值加上一个基址寄存器的值,生成一个 32 位的地址 0xFFFFFFF0。之所以称为特殊行为,是因为实模式下 CPU 只能寻址 1MB 地址空间,而这个 32 位地址已经大于 1MB 的内存限制。因此,0xFFFFFFF0 也被称为重置向量(reset vector),参考上图 0xFFFFFFF0 处的标识。

    于是,CPU 开始执行 0xFFFFFFF0 地址处的指令,该地址处是一条 JUMP 指令,这条指令清空了基址寄存器的值,并让指令跳回到 BIOS 开始处(物理地址为 0xF0000,参考上图 0xF0000 处的标识)以执行 BIOS。

    BIOS 内部可以分成两个区块: code block(普通程序)、boot block(引导程序)。上电后,boot block 会先被执行,它会检查 code block 的代码是否正确,如果正确,就会转到 code block 继续执行下去。

    BIOS 初始化

    0xF0000 地址实际上是 BIOS 中的 boot block 的开始处。在这个阶段,会初始化部分硬件。系统的 CPU、USB 只有部分被初始化。

    BIOS POST(加电自检)

    初始化完成后,CPU 跳转到 0xA0000 地址处(参考上图 640KB 处)进行 BIOS 加电自检(power on self test, POST)。这个过程会检查计算机的各项组件,如 CPU、显卡、内存、鼠标、键盘等。如果找不到内存或者键盘都有可能让BIOS停止工作并且打印一些相关的错误信息,如果找不到显卡 BIOS 会发出蜂鸣警告(因为无法显示画面)

    当 CPU 执行到 0xC0000 地址处(参考上图 768KB 处),开始寻找其他设备的 ROM,如果找到任何其他设备的 BIOS,它们也会被执行。

    下一步,显卡就会显示 BIOS 界面,并进行更深入的检查。

    BIOS 记录系统设定值

    检查完成后,BIOS 会根据自己的“系统资源表”,对系统进行进一步确认,从而确定计算机配有哪些资源或设备。例如 BIOS 支持随插即用,它会检测并配置随插即用设备。

    然后 BIOS 会遵循高级配置电源接口(Advanced Configuration Power Interface,ACPI)在内存中设置好一系列的数据来描述硬件信息,以便被操作系统内核利用。

    搜索 MBR

    到这一步,BIOS 开始尝试加载操作系统。它会从硬盘,光驱,软驱,网络等几个地方依次寻找操作系统(用户可以在 BIOS 设定中修改查找的优先级)。如果找不到操作系统,BIOS 会停机并给出错误信息。

    假设在硬盘上找到了操作系统,它会首先读取硬盘上的大小为 512 Bytes 的 0号扇区,这个扇区被称为 主引导记录(master boot record,MBR),其包含三部分:

    引导程序(Boot Loader)

    硬盘分区表(Partition Table)

    结束标志字

    BIOS 读完磁盘上的 MBR 之后会把它拷贝到内存 0x7C00 地址处,然后 CPU 跳转到该内存地址执行 MBR 里的指令。事实上,被复制到物理内存的内容就是 Boot Loader。常见的 Boot Loader 有 grub、lilo、spfdisk。下图可以帮助大家理解 MBR 的结构。8a0766d713286f79402d6b5f9d344fee.png

    关于磁盘、分区表等基础知识,可参见 计算机那些事(1)——磁盘。

    Boot Loader 执行

    以常见的 Linux Boot Loader —— grub 为例。

    Grub 加载后首先进行 内存盘初始化。Boot Loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统之前先访问内存中的 initrd 文件系统。

    关于 initrd

    Linux 内核需要适应多种不同的硬件架构,但是将所有的硬件驱动编入内核是不切实际的,而且内核也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上,Linux 的内核镜像仅包含了基本的硬件驱动,在系统安装过程中检测系统的硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd(bootloader initialized RAM disk。

    内存盘初始化完毕之后, grub 会根据配置文件 /boot/grub/grub.cfg 设定的内核镜像 vmlinuz 所在的路径,加载内核镜像,并进行解压缩操作。此时,屏幕一般会出现 “Uncompressing Linux” 的提示。当解压缩内核完成后,屏幕一般会输出 “OK, booting the kernel”。

    内核加载至内存完成后,grub 将控制权转交给内核。

    内核启动

    在 Boot Loader 配置了 initrd 的情况下,内核启动被分成了两个阶段:

    执行 initrd 的文件系统中的 init 脚本。此阶段,内核会将控制权交给 init 文件处理。init 主要是加载各种存储介质相关的设备驱动。当所需的驱动程序加载完毕,就会创建一个根设备,然后将根文件系统 rootfs 以只读的方式挂载。这一步完成后,释放未使用的内存,并转换到真正的根文件系统中,进行第 2 阶段的处理。

    执行真正的根文件系统中的 /sbin/init 进程,即系统的 1 号进程。此后,系统的控制权就全权交给 /sbin/init 进程了。

    系统初始化

    /sbin/init 进程是系统其它所有进程的父进程,当它接管了系统控制权后,它会根据 /etc/inittab 文件来执行相应的脚本,从而完成一系列的系统初始化操作。主要包括以下步骤:

    设置运行等级。Linux 有运行等级如下:

    0:关机

    1:单用户模式

    2:无网络支持的多用户模式

    3:有网络支持的多用户模式

    4:保留,未使用

    5:有网络支持、有 X-Window 支持的多用户模式

    6:重新引导系统,即重启

    执行 rc.sysinit。运行等级设置完成后,Linux 系统执行的第一个用户层文件是 /etc/rc.d/rc.sysinit 脚本程序,其完成的初始化操作主要包括:设置 PATH、设置网络配置/etc/sysconfig/network、启动 swap 分区、设置 /proc 等。

    执行不同运行级别的脚本程序。根据运行级别的不同,系统会运行 rc0.d ~ rc6.d 中对应的脚本,从而完成对应的初始化工作,启动对应的服务。

    执行 /etc/rc.d/rc.local。rc.local 是 Linux 运行用户进行个性化设置的脚本。

    执行 /bin/login。进入登录状态。此时,系统已经进入到等待用户输入 username 和 password 的阶段。

    参考

    (完)

    展开全文
  • 开始认识BIOS

    千次阅读 2004-07-20 22:23:00
    其基本含义几点,首先它是被固化在计算机硬件(主板一组程序,是计算机硬件和软件之间的桥梁,为计算机提供最低级、最直接的硬件控制,负责在计算机启动时检测,初始化系统设备、装入操作系
  • 相信很多搞电脑的朋友都遇到过装不系统的问题吧,各种各样的故障都有出现,其中发生最多的情况是不会设置导致装安装系统失败。为什么不会设置,是因为还不够了解,装过系统...其实,它是一组固化计算机主板上ROM...
  • 2021.1.3

    2021-01-03 21:08:57
    CMOS存储器是计算机主板上块读写的RAM芯片,保存着当前系统的硬件配置情况和用户对一些参数的设定。CMOS存储计算机系统时间和硬件配置信息。CMOS芯片由系统电源或电池来供电,就算系统断电,信息也不会丢失,...
  • BIOS技术简介

    2020-06-07 00:42:11
    BIOS,基本输入输出系统,是一组固化计算机主板上一ROM芯片上的程序,用以保存计算机最基本的输入输出程序,并开机后执行自检程序、初始化硬件以及加载系统引导程序等。 BIOS程序由主板上一块专门的ROM芯片来...
  • BIOS介绍

    2020-06-14 14:25:49
    BIOS:它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机通电自检程序和系统启动自检程序。其主要功能是为计算机提供最底层的、最直接的硬件设置和...
  • linux启动流程

    2019-09-14 00:28:06
    Input Output System"的缩略词 其实,它是一组固化计算机主板上一个ROM芯片上的程序。 计算机会首先加载BIOS信息,这是因为BIOS中包含CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等等。...
  • 电脑开机过程

    2019-07-28 23:41:35
    电脑开机过程 通电,CPU运行。 进入BIOS环境,BIOS是ROM中写死的,是开机后,运行的第一个程序。...它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后...
  • 一、准备工作固态硬盘的安装方法和机械硬盘一样,也是分为供电接口和数据接口(现在新电脑都是SATA接口)。...它是一组固化计算机主板上一个ROM芯片上的程序。怎么进入bios,不同类型的主板,用不同的快捷...
  • 一、准备工作固态硬盘的安装方法和机械硬盘一样,也是分为供电接口和数据接口(现在新电脑都是SATA接口)。...它是一组固化计算机主板上一个ROM芯片上的程序。怎么进入bios,不同类型的主板,用不同的快捷...
  • 笔记本电脑修改BIOS及刷写教程

    万次阅读 多人点赞 2018-06-24 16:17:06
    前面:刷写BIOS是一个相对危险的事,如果刷写过程中出意外那么电脑就会坏掉,只能拆开电脑后把BIOS芯片卸下来用...其实,它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输...
  • 电脑启动顺序

    千次阅读 2010-11-22 20:44:00
    BIOS:即“Basic Input/Output System”(基本输入输出系统),它是一组被“固化在计算机主板上的一块ROM中直接关联硬件的程序,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自...
  • Bios它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。为电脑提供最底层的、最直接的硬件设置...
  • cmos bios区别

    2012-03-14 12:34:26
    一组固化计算机主板上一个ROM芯片上的程序,主要功能是为计算机提供最底层的、最直接的硬件设置和控制。CMOS是微机主板上的一块可读写的RAM芯片,主要用来保存当前系统的硬件配置和操作人员对某些参数的设定,...
  • 日常生活中,我们开机的操作一般为按下电源键,等待系统自己起来就好...BIOS:Basic Input Output System,即基本输入输出系统,它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本...
  • Linux BIOS开机自检简介

    2020-05-12 11:11:23
    简单地理解 BIOS,它就是固化在主板上一个 ROM(只读存储器)芯片上的程序,主要保存计算机的基本输入/输出信息、系统设置信息、开机自检程和系统自启动程序,用来为 计算机提供最底层和最直接的硬件设置与控制。...
  • BIOS(basic input output system 即基本输入输出系统)设置程序是被固化计算机主板上的 ROM芯片中的一组程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。BIOS设置 程序是储存BIOS芯片中的,...
  • bios模拟器

    2013-06-12 18:37:46
    其实,它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和...
  • BIOS模拟器【绿色版】

    热门讨论 2010-11-08 15:24:22
    其实,它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和...
  • 其实,它是一组固化计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机上电自检程序和系统启动自举程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和...
  • BIOS 设置图解教程

    2009-02-13 17:29:03
    的ROM 芯片中的一组程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控 制。BIOS 设置程序是储存BIOS 芯片中的,只有开机时才可以进行设置。CMOS 主要用于存 储BIOS 设置程序所设置的参数与数据...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

在计算机主板上固化了一组