Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48965
  • 博文数量: 9
  • 博客积分: 350
  • 博客等级: 二等列兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 13:03
文章分类

全部博文(9)

文章存档

2011年(1)

2010年(8)

分类:

2010-07-30 20:37:52

介绍欢迎来到操作系统奇妙而又疯狂的世界。

在之前的教程中,我们已经对操作系统是什么进行了定义。操作系统为用户和计算机系统提供了基本的接口。它为系统提供了基本的视感。

我们也看了对我们很有帮助的工具,汇编器、编译器、链接器具、PartCopy、MagicISO和Bochs。

对于没有编程经验的读者在读到这里时应该感觉羞耻:),请回到教程开始章节重新读一遍“前提条件”一节。为什么你还在呢?快回去!!!

在本篇文章中,我们会以不同的方式来了解一下操作系统。我们首先回到过去,了解一下操作系统的历史。你会发现在这些操作系统之间有一些相似之处。这些相似之处会按操作系统基本共同点进行分类--为你自己的操作系统奠定基础。

追忆过去

现代操作系统大部分是图形界面的,这些图形用户接口(GUI),为操作系统是运行的程序提供了一个更大的抽象层。

关于操作系统数据的概念可以追溯到程序记录在磁带上的时代,这些概念至今仍在使用。

史前 - 对于操作系统的需要

二十世纪50年代之前,所有的程序都记录在打孔卡片上。这些卡片用于表示指令格式,这些指令控制计算机的每一个开关(faucet)。每个软件对系统都有完全的控制权。大部分时候,软件之间都是完全不同的,即使是一个程序的不同版本。

正因为每一个程序都是完全不同的,所以它们必须非常简单,因为它们每次都是从头开始重写。对软件没有通用支持,所以软件也就不得不直接与硬件通信,这也就造成了不可移植和兼容。

在大型机时代,创建代码库成为可能,这确实解决了一些问题,比如:两个不同版本的软件完成不同,但每个软件仍然具有对硬件的完全控制权。

对于新推出的硬件,软件不能正常工作。如果软件崩溃了,需要通过控制面板上的开关进行调试。

软件和硬件之间接口的想法来自于大型机时代。通过在硬件上构建一个抽象层,程序不再需要对硬件的完全控制,而是使用通用接口访问硬件。

这个接口真是超酷?!它就是我们称之为操作系统的甜蜜(有时讨厌)的东西。

二十世纪五十年代 - 操作系统起源
根据Wikipedia记载,第一个真正的操作系统是GM-NAA I/O。SHARE操作系统是在GM-NAA I/O基础上发展起来的,SHARE提供共享程序、管理缓冲区且是第一个允许运行汇编语言程序的操作系统。二十世纪五十年代晚期SHARE成为IBM计算机机的标准操作系统。

SHARE操作系统是第一个能够管理缓冲区,提供程序共享,和执行汇编程序的操作系统。

“管理缓冲区”涉及到“存储器管理”。“程序共享”涉及不同程序使用库。

这里要说明的两个重要的事情是,有史以来(并不完全是),操作系统的职责就是管理存储器和运行/管理程序

我正描述的不是这个世界(计算机)的历史,让我们跳到DOS的美好时代。

1964 - DOS/360 和OS/360

DOS/360 (或仅仅称为"DOS")是IBM原定要在1964年最后一天发布的磁盘操作系统。因为一些问题,IBM被迫将DOS/360做成三个版本,并于1966年6月才发布。

版本有:

  • BOS/360 - 8KB 配置
  • DOS/360 - 带磁盘的16KB配置
  • TOS/360 - 带磁带的16KB配置
关于DOS/360一些重要的事情有:不支持多任务,没有存储保护。OS/360大约由IBM同时开发。OS/360使用"OS/MFT(多个固定事务)"支持多程序,具有固定基址。OS/MVT(多个可变事务),它支持不同的程序大小。

现在我们已经见到了一些有趣的单词-多任务,存储保护,和固定基址。在增加这些之前,我们也见到了程序执行和存储管理。

1969 - Unix!

Unix操作系统初始是由C编写。C和Unix是由AT&T创造的。Unix和C免费分发给政府和学术机构,相对于其它操作系统,它被移植到了更多的机器族。

Unix是多用户、多任务操作系统。

Unix包括一个内核文件系统和一个命令壳。有许多图形用户界面(GUI)使用命令壳与OS系统进行交互,提供更友好和好看的外观。

1982 - Commodore DOS


Commodore DOS (CBM DOS) 被用于Commodore 8位计算机。与其它在启动时从硬盘引导至系统内存的计算机不同,CBM DOS由内部驱动的ROM芯片组进行内部执行的,由MOS 6502 CPU执行的。
1985 - Microsoft Windows 1.0

第一个Windows是一个DOS应用程序。“MSDOS Executve”允许一个运行程序。窗口不可以重叠,所以每个窗口从一边显示到另一边,它并不是很流行。
1987 - Microsoft Windows 2.0

Windows的第二个版本仍然是一个DOS图形壳,但它支持窗口重叠,和更多的颜色。然而,因为DOS的限制,它应用并不是很广泛。

注意: DOS 是一个16位操作系统。在这个时间段内,DOS不得不通过线性地址引用内存,通过LBA(线性块地址)引用硬盘。因为x86是向后兼容的平台,所以在PC引导时是运行在16位模式(实模式),而且也有LBA,后面会讲到。

因16位模式的限制,DOS不能访问超过1MB的内存。现在,通过键盘控制器开启A20地址线可解决此问题。后续我们也会讲。

因为1MB的限制,Windows是非常慢的,这也是它不能流行起来的主要原因。

1987 - Microsoft Windows 3.0


Windows 2.0被完全重新设计,Windows 3.0仍然是DOS图形壳,然而,它包含“DOS Extender”允许访问16MB内存,越过了DOS的1MB限制,它支持DOS程序的多任务。

这造就了微软的强大,它支持窗口缩放和移动。

Windows与OS开发者的关系

我见过一些初级OS开发者,他们想要开发下一个Windows。即使这是可能的,但它太困难了,靠一个人的力量几乎是不可能的。重新看一下上面的图片,记住命令壳之上的图形壳,是由内核执行的。另外,记住即使Windows也是从此开始的,命令壳是DOS,图形壳是Windows。

基本概念

回顾一下我们这段简短的旅程,它为我们带来了一些新的重要的词汇。到目前为止,我们只给操作系统下一个小的定义。之前的部分会帮助我们对操作系统有一个更好、更有描述性的定义。

为了帮助下定义,让我们把上面加组的词汇罗列出来:

  • 内存管理
  • 程序管理
  • 多任务
  • 存储保护
  • 固定基址
  • 多用户
  • 内核
  • 文件系统
  • 命令壳
  • 图形用户接口(GUI)
  • 图形壳
  • 线性块地址(LBA)
  • 引导程序 (之前教程中介绍)

这是个引人深思的,Uhu? 然而--上面的列表在列表层面来讲仍然很抽象,让我们深入了解一下?

内存管理

内存管理涉及到:

  • 程序对请求的内存的动态分配和使用
  • 页的实现,甚至是虚拟内存
  • 确保OS内核不会读/写未知和不合法的内存
  • 监视和处理内存碎片
程序管理

这与内存管理关系密切,程序管理负责:

  • 确保程序不会写到其它程序
  • 确保程序不会破坏系统数据
  • 程序程序请求以完成一个任务(比如分配和释放内存
多任务

多任务涉及到:

  • 切换和给多个程序一个适当的时间片去执行
  • 提供任务管理以允许程序切换(比如窗口管理器)
  • TSS (任务状态段) 切换. 新词汇!
  • 同时执行多个程
存储保护

这涉及到:

  • 在保护模式访问一个不合法的描述符(或不合法的段地址)
  • 覆盖程序自身
  • 覆盖另一个文件在内存中的一部分
固定基址

“基地址”是程序被加载到内存中的位置。正常应用程序,不会需要这些,但在OS开发中,需要。

“固定”基址简单理解为程序每次被加载到内存时总是使用相同的基址,BIOS和引导程序就是这方面的例子。

多用户

涉及到:

  • 登录和安全保护
  • 工作在计算机上多个用户的能力
  • 不丢失和破坏数据前提下切换用户
内核

内核是操作系统的心脏。它提供了基本功能,内存管理,文件系统,程序执行等等。不要着急,我们马上就会对内核进行更深入的了解 :)

文件系统

在OS开发中,是没有“文件”这个东西的。从一开始,任何东西都是纯二进制代码(从引导扇区中来)。

文件系统是一个简单的规范,这个规范用于描述相关文件的信息。大多数情况下,这涉及到簇,段,段地址,根目录等等。为了加载文件,OS必须找到文件的开始地址。

文件系统也描述文件名,有外部内部文件名。例如:FAT12规范定义文件名只可以有11个字符,不能多也不能少。这意味着“KRNL.sys”内部文件名为“KRNL    SYS”。

我们会使用FAT12,并会在后续部分讨论它的详细内容。命令壳

命令壳作为一个独立的程序位于内核上部。命令壳通过使用输入命令提供了基本的输入和输出。命令壳使用内核帮助来完成这些及低级任务。

图形用户接口(GUI)

图形用户接口 (GUI) 简单地涉及到图形界面,及用户与图形壳之间的交互。

图形壳

图形壳提供视频方法及低级图形能力。它正常是由命令壳执行(比如Windows 1.0,2.0和3.0)的,现在通常都是自动的。

线性块地址(LBA)

操作系统通过内存中的每一个单字节进行控制,线性地址涉及到直接访问线性地址,比如:

mov ax, [09000h] ; There is no such thing as Access Violations in OS Development
这既是好事,也是坏事,比如:
mov bx, [07bffh] ; or some other address less then 7c00h mov cx, 10 .loop1: mov [bx], 0h ; clear bx inc bx ; go to next address loop .loop1 ; loop until cx=0
上面的地址看上去是无害的,然而,如果上面的代码如果出现在引导程序中,会重写自己的10个字节。原因是引导程序是被加载到0x7c00:0这个固定地址的,上面的代码从0x7bff(0x7c00前一字节)这个地址开始写。

引导程序

引导程序,我们在之前教程中已见过此词汇。从之前的教程中我们知道引导程序是由BIOS加载,是操作系统中第一个被执行的程序。

引导程序被BIOS加载到0x7c00:0这个绝对地址。载入后,CS:IP被设置到引导程序,引导程序获得完全控制。

软盘扇区只有512字节大小。记住引导扇区只能有一个扇区。这意味着什么?引导程序有大小的限制,不能超过512字节。

大多数情况下,引导程序会加载和执行内核或第二个引导程序

我们马上会对引导过程进行深入了解,到时我们再讲一下引导程序。

总结

我们已回顾历史,并学习了一些我们列出的词汇。结束本次历史课程之后,我们会使用这些词汇,对事情的运作方式建立更一个广泛的视角。我们甚至会看一些代码,尽管只是一点儿。

结束所有这些之后,应该能够对我们所做的事情下一个更简洁的定义。

"一个交互环境,为用户和支撑程序提供一个接口,提供稳定和安全的环境,是计算机服务和计算机硬件之间的接口层。"

Yep. 这是我对操作系统新的定义,你的呢?

下一教程,我们会看一下引导过程。另外,我们会创建和汇编一个真实的引导程序。

阅读(2823) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~