Linux 内核书籍读书笔记 (一)启动 [WIP]

本文用于在学习Linux内核设计的过程中的理解,同时本系列文章将以Linux内核设计的艺术为主线,以多本书籍为辅,进行知识的补充。本书中所涉及知识可能由于我所阅读的书籍参考的Linux版本不同导致比较混乱,例如《Linux内核设计的艺术》参考Linux0.11(P8)、《深入理解LInux网络》参考Linux3.10(P7)、《Linux网络内核分析与开发》参考Linux2.6.8.1版本等。因此本文仅用于记录学习Linux实现过程中的优秀设计。

在阅读本书的同时《高性能架构之道》一书在设计理论上基于我很大帮助,其中一些设计原则在阅读Linux相关书籍时经常发现。

本篇文章主要用于记录Linux启动流程。

启动

在计算机领域,启动是指计算机在加电后载入代码、建立系统资源、初始化外围设备的一系列操作。而这一系列操作的触发则可能是来自于用户的一次按钮摁动操作。而以一个操作系统程序员的角度来说启动分为两部分,第一部分为非操作系统代码(BIOS)执行,第二部分为操作系统代码执行,下面我们将以这种分割方法粗略的讲解一下非操作系统代码执行流程(BIOS)。

以《Linux内核设计的艺术》中Linux0.11为例,我们忽略Linux进入main函数后的内容,当前仅关注在main函数前数据加载、资源管理等操作,这样计算机启动就包括两部分BIOS代码执行,操作系统代码执行。而操作系统代码执行又包括四个阶段,每个阶段所做的操作不同,但都是在为系统进入main函数做准备工作。

BIOS启动

在启动计算机并未进入操作系统时,一般电脑界面上会出现该主板所属品牌图标并显示摁下某键即可进入BIOS,这里的BIOS是一种在操作系统代码加载前用于对硬件进行自检,对主板、外围设备进行底层功能控制,同时对于操作系统实现密切相关的一段代码。

BIOS功能

BIOS(Basic Input Output System)全称中包含一个System,可以看出该段代码也是自成体系的。系统这个名词在我理解中是对系统内部多种资源具有一定控制或操纵功能的一组实体。而对于计算机来说这里的资源就是计算机硬件资源了。因此BIOS将在操作系统加载前对计算机硬件资源进行管理。

BIOS代码

BIOS代码存储在主板上ROM(Read Only Memory,现在一般都是EPROM可擦除编程ROM,但理解上还是理解为ROM)中,该代码由主板制造商根据主板设计编写,因此每个制造商不同版本的BIOS都可能不同。

BIOS对于操作系统启动意义

BIOS代码将在计算机加点后由主板(需求证)自动将ROM中代码复制一份(硬件电路实现该操作)到内存起始位置。而后由硬件电路强行将当前代码执行位置指针IP(Instruction Pointer Register)及代码段寄存器CS(Code Segment Register)分别设置为 0xFFF0 和 0xF0000。如果该位置存在代码则执行下去,不存在代码则说明BIOS启动失败(异常)。

小知识点:

CS和IP寄存器是CPU中一组特殊的寄存器,该组寄存器在系统未启动GDT(Global Descriptor Table)前值直接用于表示当前代码所执行位置,计算下一条指令位置内存地址的方法为 (CS<<16)+(IP)。该地址值表明下一条指令所在位置,CPU将根据该位置进行指令读入并操作。非流控代码及调用代码情况下,IP将在读入当前指令后将自增指令长度,以获取下一条指令。


参考书籍:

  • 《Linux网络内核分析与开发》
  • 《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》
  • 《深入理解Linux内核》
  • 《深入理解Linux网络》
  • 《Linux环境编程:从内核到应用》

v0.1 wep 写了一丢丢

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注