「2」好了咱不写了

嗯,写博客不如写代码爽快

写教程感觉太费心力了,不如写xv6解析。咱还是写xv6解析吧以后



























上篇我们曾经提到:计算机刚刚启动的时候是运行在实模式(Real mode)下的,而32位程序是运行在保护模式(Protect)下的。(当然这是传统BIOS启动模式的顺序,UEFI并不会进入实模式)

这也就要求我们了解,如何进入保护模式。理解保护模式究竟保护了什么,保护模式的方法和原理,是编写操作系统的必要前提。标题“保护模式与C”,保护模式占去了2/3,足以显出本片文章的重点。(事实上使用C语言仅需要一些小把戏,并不是很重要的东西)

首先我们画个饼,来讲讲我们究竟要实现什么:一个从硬盘启动扇区后几个扇区读取一个ELF执行文件并执行的引导扇区。用GRUB的术语来说,就是STAGE 1。

首先我们要了解一下什么是保护模式:

计算机发展的初期,因为时代局限性和资源局限性,一切都是从简、硬上。在286时期,英特尔已经在尝试保护模式了(286是16位处理器,但是支持保护模式),在386CPU上,保护模式已经十分成熟(386是32位处理器)。可以看到,我们一般学习的汇编都是最简单的那种8086汇编,8086是运行在实模式(事实上实模式是保护模式的对比词,有了保护模式才有实模式)上的16位CPU;想要理解保护模式是什么,我们先来看看实模式是什么。

实模式实在它所有的地址都是真实的,你访问的地址直接被地址加法器转换为实实在在的物理地址上。也就是说,实模式无法进行多任务,以及无法保证安全性,因为任何程序都可以访问任意的物理地址,程序甚至可以更改系统所使用的内存从而让系统被篡改;同时因为可能存在的物理地址冲突(程序A使用了0x2333地址,程序B也用了),也无法进行多任务(当然使用软件方式也能强行给实模式用多任务)。

实模式其实十分简单,保护模式也一样。首先我们来了解一下保护模式保护了什么——物理地址。实模式产生的问题自然被当年十分鸡贼的英特尔和其他开发者发现了,发现了就要解决。于是保护模式就被发明啦!保护模式保护的是地址,使基于硬件的多任务成为可能。