一直计划要写一篇Linux内核中关于进程调度的文章,拖欠了很久,准备动手写的时候发现了此文,看过以后觉得着实没有自己重新写的必要了,转载于此。
操作系统
操作系统 标签中有 5 篇文章
Nanos note 2 : 内核初始化
Nanos note 1 : bootloader
Nanos是JYY大神为南大计算机系操作系统课程专门设计的实验用操作系统。出于对操作系统的好奇和对JYY大神的敬仰,我又再次踏上了DIY玩具内核的道路。和本科时候不同,这次希望能对操作系统有更深的理解,而不是仅仅局限于完成实验,也希望能留下一些笔记作为积淀。这是第一篇note,从分析Nanos的bootloader开始再好不过了。
Nanos的框架代码都可以在github上找到(点我),为了方便起见,一份打包的仅包含bootloader的代码在这里。
正如之前提到的,在计算机的启动过程中当完成了POST之后,BIOS会从可启动磁盘中读出头512个字节(MBR)并将其载入内存地址0x7c00的位置并开始执行,MBR中的代码通常被称为bootloader,负责将操作系统内核载入到内存中。在Nanos中,bootloader极其简单,仅由MBR中的512字节组成(即仅包含stage 1),麻雀虽小五脏俱全,Nanos的bootloader完成了bootloader所需要做的所有基本任务:为操作系统内核设置运行环境、载入内核到内存、跳转到内核开始执行。
下面具体分析一下Nanos的bootloader是如何完成的。首先看一下bootloader的源文件目录结构:
1 2 3 4 5 6 7 |
. ├── Makefile ├── asm.h ├── boot.h ├── genboot.pl ├── main.c └── start.S |
[译]主板芯片组和存储地址映射 – Motherboard Chipsets and the Memory Map
原文在此,翻译仅供参考。
我计划写一些关于计算机内部的文章来解释现代的操作系统内核是如何运行的。我希望这些文章会对那些对此类东西感兴趣而没有相关经验的程序猿有所帮助,我会集中关注Linux、Windows和Intel处理器。探究计算机的内部运行原理是我的爱好,我已经写了一些内核态的代码但是还没有怎么写过相关的文章。我的第一篇文章将会对现代Intel系列的主板构造、CPU存储访问、存储地址映射进行描述。
作为开始,我们先来看一下现在的Intel体系的计算机是如何连接起来的。下图中包含了主板中的主要部件:
当你在理解上图时,需要重点注意的一点是CPU并不知道它和什么东西连接在一起,它通过引脚(pins)和外部交流,但并不关心外部环境是什么:可能是主板,但也可能是烤面包机、路由器、植入大脑或者是CPU测试器。CPU主要通过三种方式与外部环境通信:存储地址空间、I/O地址空间和中断。现在我们只关注主板和存储。
[译]计算机启动过程 – How Computers Boot Up
原文在此,如果英文阅读能力不差还是尽量读原文吧。
先前的文章描述了Intel系列计算机的主板和存储地址映射,在此基础上我们来看看计算机启动的初始阶段。计算机的启动是一个复杂、多阶段并且相当有趣的事情。下图描述了整个计算机启动的过程:
当你按下计算机的电源按钮时,启动过程就开始了。一旦主板电源接通,主板就会初始化主板上的固件——一些芯片组和周边——并且会尝试让CPU运行起来。如果在这一步失败了(比如CPU故障或者没有找到),一般来说除了风扇仍然可以转动,计算机的其他部分都无法工作。少数主板在未找到CPU或者发现CPU故障时会发出“哔哔”的警报音,但是基于我的经验,大部分的主板只会不断的转动风扇,没有其它任何反应。有时候USB或是其他设备都有可能会导致这种情况:如果你发现你的系统突然变成了这样,尝试拔掉所有非必须的设备可能会有帮助。你也可以一个一个的排除出可能导致问题发生的设备。