Electronic Joint Business

Solution for E-Business

OS Generic

用汇编来学习 PC 的实模式、保护模式和长模式

本文主要面向那些有兴趣了解 CPU 是如何工作的用户,这里我将解释一些汇编语言基础知识、实模式、保护的模式和长模式。在文章的后面我还提供了完整的汇编代码,你可以用来测试看看处理器是如何在实模式下工作,如何进入保护模式,如何进入 64 位模式,最后又是如何从所有模式退出返回到 DOS。1

准备
要阅读本文以及进行相应的测试,你可能需要准备:

  • 汇编知识。虽然读者不需要编写代码,不过如果你对寄存器、内存访问、基本命令等有些了解会很有帮助。
  • Flat 汇编器。一个能生成 Win32, X64 和 DOS 下的可执行文件的“现代”汇编器。
  • 干净的 DOS 环境,你可以使用freeDOS

你无需在物理机上安装使用 DOS,相反你可以使用 VMWare 或者 Bochs 这样的虚拟机。这里我推荐使用 Bochs,不仅因为它是免费的,而且它的调试器可以陷入任何程序产生的异常,并告诉你到底发生了什么。

过去 Borland 的 Turbo 汇编器 (TASM) 十分流行,不过随着 Borland 的谢幕,TASM 也寿终正寝。附件中的所有代码都是用 FASM 编写的,该汇编器可以生成 16位的 DOS 以及 32/64位的 Windows 下的可执行文件。

你还可以在 Visual Studio 中找到 ML.exe 和 ML64.exe,这是 MASM 的新版本。不过该汇编器只能产生对应架构的 PE 格式,不适合这里的使用场景。

>>> 阅读全文

 

, , , ,

操作系统开发初体验(2)C++ 支持代码和控制台

在开始阅读第二篇文章前,我建议你翻阅上一篇文章,不然,接下来的内容可能就用处不大了。

现在我们需要一些支持代码,G++ 会用到其中的一些,不过我们增加了更多的代码以避免奇怪的错误。这里我们要添加的代码有:

  • 对构造器的调用
  • 提供 new 和 delete 的实现
  • 在 GCC 无法调用虚拟方法的时候提供一个方法以供调用。

除了上述三个,还有就是:据说有些操作系统会在内核代码结束的地方调用析构函数,但我没看过这样的案例,大多数多任务操作系统都会在 main 函数的末尾进入无限循环,这样定时器 IRQ 就可以来接管任务。(要晚很多)

首先,我们需要调用构造函数。链接脚本可以指出这些构造函数的指针起始和结束的地址。要调用它们,我们要做只是遍历它们。虽然链接器有可能会弄错顺序,不过概率很低。至少在本系列文章中,我们还是可以信任 GCC 的。

要调用构造器,我们可以使用下面的代码:

>>> 阅读全文

 

, ,

操作系统开发初体验 (1)

文章评价:
如果你正在读这篇文章,没准你想知道更多有关如何创建自己的 OS 方面的内容。不过你首先要知道,我这短短几篇文章是没办法涵盖 OS 开发的各个方面的。我会介绍一些 OS 的基础知识,但还需要靠你自己去研读相关的技术文档,这样你才能明白操作系统为何如此工作。确定还想读下去吗?好,让我们开始吧。

理解 OS 开发很关键的一点是:一切将从零开始,你直接和硬件打交道。你会遇到硬件故障,也不能指望系统每次都如期工作。你没有标准库可供使用,更没有 .NET 框架或者Java 虚拟机。一切只能靠你自己。

开始之前,你要了解系统控制权是如何转交到你手上的。很奇怪的是,没有什么标准规定电脑开机之后应置于什么状态,唯一能确定的是,开机之后一定会去执行引导扇区,它位于可启动的存储介质的起始部分,会被加载到内存地址 0x7C00 处,其长度为 512字节,并以 0xAA55 作为文件末尾签名。引导扇区通常用汇编语言编写。为了节约时间,我们将使用现成的 GRUB (Grand Unified Bootloader)。这可为后续工作提供可靠的基础,并将电脑置于同一个标准状态。

Grub 会将电脑置于以下状态:

  • 保护模式
  • A20 地址线启用
  • 寄存器 EBX 存有指向多重启动信息结构(Multiboot information structure)的指针
  • 寄存器 EAX 存有固定值 0x2BADB002
  • 分页机制关闭
  • 栈位于内存的某处
  • 中断机制关闭

下面我会逐一介绍这些状态。保护模式允许内核开发人员按虚拟地址空间访问最大为 4GB 的内存,并引入了保护环“Ring”的概念。以下几小节会介绍更多的内容。 A20 门电路是键盘控制器附近的一条“古老”的地址线。它最初设计是为了与 8086 保持兼容,在“关闭”的时候,屏蔽了对内存开始部分 1M 以上地址的访问。

>>> 阅读全文

 

, , , , , , , ,