APUE杂记:解释器文件

一个非常常见的Python脚本如下:

一直以来从来没考虑过为什么在脚本的第一行要写上 #!/usr/bin/env python 这样的注释,通常的解释是这样写就知道用什么来解释这个文件了,但是也没有深究为什么。其实这是一个Unix解释器文件的写法。

继续阅读:

Linux内核同步

Data protection

Data protection

Linux内核中有很多同步机制,这篇文章主要总结一下在《Linux Kernel Development》看到的部分内核同步机制,依旧是备忘。

内核同步机制和用户空间的同步机制并不是一一对应的,但是基本的思想都是相同的:保护临界区,只是内核同步机制更适合于在解决内核中的同步问题。先思考下自己的Nanos内核中使用了什么同步机制?Nanos中使用了关中断和信号量机制。

Nanos中的信号量主要用来实现消息传递机制;lock()方法封装了基本的关中断操作,即通过关闭CPU中断(设置IF位)使得不会有线程切换发生,也就保护了临界区。但这在支持多核环境的内核中明显是不适用的,因为每个CPU都有自己的控制寄存器(eflags),关中断仅能保证当前CPU不会发生线程切换,而不能保证其他CPU上运行的线程不会进入临界区,因此,在Linux的SMP环境中需要更多粒度不同、开销不同的同步手段。

注:文中引用的Linux内核代码版本为2.6.32.63

继续阅读:

Nanos note 2 : 内核初始化

上一篇文章中,我们已经完成了bootloader的运行:设置内核段描述符、进入保护模式、载入ELF格式内核,并将控制交给内核代码。
但是,此时操作系统的启动过程并未完全完成,本篇文章接着bootloader完成的工作,还是以Nanos为范例,具体的分析一下操作系统内核的初始化过程(内核初始化所使用的代码可以在Nanos的github找到,见这里)。
内核初始化主要完成了下面这些工作:

  1. 初始化时钟
  2. 初始化可编程中断控制器
  3. 初始化中断描述符表(IDT)

继续阅读:

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的源文件目录结构:

继续阅读:

[译]主板芯片组和存储地址映射 – 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或是其他设备都有可能会导致这种情况:如果你发现你的系统突然变成了这样,尝试拔掉所有非必须的设备可能会有帮助。你也可以一个一个的排除出可能导致问题发生的设备。

继续阅读: