【VC++开源代码栏目提醒】:网学会员--在 VC++开源代码编辑为广大网友搜集整理了:80386保护模式与Linux内核引导分析(毕业论文doc) - 毕业设计绩等信息,祝愿广大网友取得需要的信息,参考学习。
开题报告 计算机技术高速发展的今天,对于计算机系统底层技术的掌握,已经到了至关重要的时候,尤其是操作系统、编译原理等核心技术的研究。
这些核心技术,直接关系到一个公司、一个国家是否有自己真正知识产权的问题。
操作系统和编译原理是计算机领域的两个重大课题。
之所以说它们重大,是因为这两个方向既重要(计算机的核心技术)又庞杂。
随着硬件的不断升级和各种相关技术的发展,(由于 INTEL 与 AMD 公司竞争的越来越激烈,CPU 的更新速度会越来越快,而其结构也会相应发生更大的改变。
)操作系统也会随之不断更新和发展。
如现在基于
网络的分布式操作系统、基于多个 CPU 的多处理机操作系统等等。
现在 CPU 最新的研究方向是 , “乱序发射”当它有了更新的发展之后,相信操作系统还会随之做相应的改变。
对于编译器的研发也是极具挑战的。
由于编译原理本身涉及很多的算法,加之又与 CPU 有着紧密的联系,所以能够对其进行深入研究的人为之甚少。
不用说对
代码优化,就是使用 yacc 工具产生一个语法分析器的人,在中国的本科生中也不是很多。
那么,研究它们有何意义呢? 很多软件开发人员觉得没有必要过深的去研究这些核心技术。
“我们大多是搞应用的,更应关注的是如何把应用做好,如何给企业带来更大的利润,而不应该去把时间浪费在研究底层上面,而且又那么难懂、麻烦”。
通过分析这句话,可以得出这样一个结论:应用简单,我们就做。
而麻烦、难懂的东西,我们不做。
然而我却不这样认为。
作为应用软件的开发人员,我们当然应该更多的关注如何把应用做好,如何使用户操作起来更加简便。
但是,如果不了解系统的底层,不了解系统的运行原理,我们在以后就会遇到很多麻烦,也很难做出好的应用程序。
可以举个现实的例子,我们花了很长时间学习了一种新的技术。
如
VC(MFC的结构很难懂呦) 。
但
计算机行业里新技术很快就会过时,又会出现更新的技术。
由于项目要求必须采用新的技术和语言,所以我们只能再去学习。
于是我们就在一个又另一个新技术之间疲于奔命,当我们再也没有精力去学习的时候,我们也就随着新技术的出现而被淘汰了。
可悲!可叹!而中国的软件程序员的命运大多如此。
正所谓 “无源之水、无本之木”。
为什么会这样呢?这当然有程序员本身的原因,但我觉得更多的还是社会导向的原因。
如果我们不是这样急功近利,多花一些时间去研读一下系统的底层,那我们的情况就会大不一样。
我们会发现,其实这些所谓的新技术,大多不过是商家为了商业的目的而做的一些“装簧”罢了。
举个例子,如“回调函数”其实就是一个指针函数,钩子函数就是一种特殊的回调函数,其实还是一个指针函数。
它们来做什么用的呢,找段
代码分析一下我们就会发现,原来是为了实现软件框架而使用的一种技术。
还有指针,其实就是地址的意思。
还搞的特别神秘似的。
磨刀不误砍柴功!所以我们做事情搞学问就要踏踏实实。
尤其是在中国,这一点就显得更为重要了。
下面我就要一步一步进入我的正题了,关于学习保护模式的意义。
首先引入 www.oldLinux.org 论坛上的一个帖子。
它是关于学习 Linux 内核意义的讨论,这又与保护模式有什么关系呢?当然有关系了,而且还有很强的联系(否则我这段企不是没有任何意义了) 。
应该说 80386 不仅与 Linux 有紧密的联系,而且它还和其它在 INTEL CPU 上开发的很多操作系统有着紧密的联系。
先让我们来看一下他们的讨论吧。
我想无论做什么事,考虑什么问题,首先一点应该知道这件事的到底有何意义。
即所谓的出师有名,所以我提出这个
问题,大家来讨论一下学习 Linux 的重大意义在那里。
我曾和我身边的人说我正在学习 Linux 内核,一些人觉得这个很深奥,一些人很不屑。
他们说学习它有什么意义吗? Linux red hat 才 50 元一套,难道你想自己开发一个操作系统?即使你开发出来了,别人会用吗?而且学习底层的东西要学的东西太多,花的精力也太多。
这有必要吗。
现在只要学好 java 就能赚钱,还不如把这些时间放到学习
j2ee 的好。
多看看数据结构和算法。
以后挣钱是肯定的。
你开发出一套自己的操作系统又能挣多少钱?况且 Linux 很多公司做的已经相当成熟,你做出来的东东会有人用吗?所以这个只能玩玩,没有多大意义。
面对上述的说法你们的想法是什么?难道
学习 Linux 内核只能是玩玩而以吗? ——by lgr 学习 Linux 内核是为了更好地了解一个操作系统的运行原理,从而能够轻松地理解几乎所有运行在其上的所有软件的工作原理, 并能为应用软件的开发打下扎实的基础。
一个真正的编程高手是肯定对操作系统的工作原理有一定的了解的,而且了解越深就能编制出越好的软件来。
也许我说的有些绝对,但几乎没有人会完全反对我的这种论调。
当然,学习内核还有很多其他原因。
作为理解嵌入式系统工作原理、更好地熟练地掌握 C 语言、了解硬件与软件的交互关系等等。
如果学习的直接目的只是为了挣钱,那么我认为这个目的或目的太短浅。
钱是为了生活、生存,当然也是富有的表现。
但它并不能代表你的精神生活有多么得充实。
以我之见,人活着的最根本目的是为了追求快乐、幸福。
但有了很多钱并不就很快乐。
君不见富翁跳楼自杀者现象吗?照理他们这种做法是荒唐的,因为已有大把大把的钱。
很可惜,人不是一般动物。
人还需要精神享受。
因此,如果在学习中不仅能掌握基础知识(我把内核当作基础知识),还能从学习基础知识中获得乐趣,这也不免是一件一举两得的事。
若自己想编制自己的操作系统,这也可以,只要乐在其中: 说白一点,学习操作系统的
工作原理,主要目的是促进应用程序的编程。
理解内核你就能用更好的思路编制应用程序,从而。
。
。
因此娱乐与生活最终还是可以统一的: ——by 赵烔 《Linux 内核完全注释》的作者c 语言高手通常会或多或少的了解汇编语言c 语言专家,或多或少需要浏览 c 标准库源
代码甚至编译器源
代码优化 c 或汇编语言的性能,或多或少需要了解 cpu 的运算机制编写操作
系统,或多或少需要了解 cpu 的运作机制 —— by engumen Linux 高手 看一下梁肇新的编程高手缄言, 就知道一个程序员如果不知道操作系统是干什么,不知道数据结构,不知道计算机体系结构,不了解编译器对于一个程序员来说是干什么的,而只是一味地追求 java.net 这个编程工具,那么这个程序员肯定会陷入 java.net 挖的看起来像金子般的坑,而无法自拔! —— by love-centry 论坛版主 从上面几位高手的讨论中我们可以看出,在他们眼里学习 Linux 内核有多么的重要了。
既然这些大“牛”们都认为学习 Linux 很重要,对于我们这些 , “菜鸟”当然应该顺着光辉方向勇往直前了。
Linux 的
开源给了我们机会,一窥一个真正的,强大的操作系统到底是如何工作的。
在真实的操作系统里,处理机是如何分配的,进程是如何体现的,文件管理又在系统中占有怎样的位置呢, 这些疑问终于可以通过对 Linux 源
代码的分析而得到。
使我们不光只是在操作系统的原理课上知道一些它的原理,而且还真的感受到操作系统确实是在真正运行着的, 那种只见树木不见森林的状况有了很大的改观。
然而要想看懂 Linux 这么庞大的东西,不知道“保护模式”是不成的。
操作系统是直接在硬件上运行的。
它在软件与硬件之间搭起了一座桥。
软件必须通过操作系统才能与硬件沟通。
而硬件同样也需要操作系统将它完成的结果告诉给软件,所以操作系统的地位就显得格外重要了。
它是不允许其它软件对其进行破坏的,否则企不是整个世界就要崩溃了,所以就要对其进行保护。
用
软件的方法行吗?当然是不行了。
软件来保护软件,那谁又来保护它呢。
(都快把我绕晕了)。
看来还是硬件进行保护来的直接。
那么它应该如何进行保护呢终于切入正题了当然是保护模式了。
所以在我进行 Linux 内核源
代码的研读之前,来仔细研究一下保护模式的工作原理是很有必要的。
那么关于保护模式我们都要了解那些东西呢?我觉得至少要知道下面几个方面的知识:什么是实模式,什么是保护模式、为什么要使用保护模式,如何从实模式转到保护模式、在保护模式下硬件上是怎样实现分段、分页的,从而保护操作系统的等等。
上面我已经对我要写的
论文的目的和意义做了一个说明,就算是我这篇
论文的开题
报告了。
以后的时间里我就要逐步、细致的讨论保护模式的方方面面。
在这里,先预祝我们:一路成功。
前言 从 Linux1.0 的正式发布,Linux 就给软件行业带来了一个惊喜。
它结构的完整性、功能的强大性、源
代码的开放性、发展的快速性,每一项都使得人们不得不将它另眼相看。
Linux 用短短的十几年的时间走完了 Unix 几十年才走完的路程。
由于 Linux的
开源使得全世界的 hacker 们都能够阅读它的源
代码,提出自己的想法,并将他们优秀、经典的想法放到 Linux 中来实现。
正是这种集体的力量才使 Linux发展的如此迅速。
而这种
开源的方式也使得 Linux 的源
代码得到了全世界 hacker们的严格检查,使得它的
代码更加精简、功能更加强大。
Windows 的图形界面带领普通用户进入了计算机的世界,这当然是好的一面,微软也因此得到了巨大的回报。
然而由于商业的关系,使得我们(特别是从事计算机专业的人们)无法看到它的内部核心
代码,这在我们开发自己应用
程序的时候,受到了很大的约束。
虽然开发简单了,操作也方便了(这里是指 Windows给我们提供了大量的 API,使我们在开发上方便了),但它同样给我们带来了巨大的损失,这一点相信学过 MFC 的人都深有感处。
说明 程序员只能在 MFC 框架内进行程序开发,而不能超出其框架,否则,付出的代价是 巨大的。
而由于项目的需要,MFC 的框架可能不能满足项目的需要,这时矛盾就产生 了。
所以它是一把双刃剑。
如果我们一味的依赖微软这种不
开源的产品,不能了解它的核心,其结果就是,使我们这样一个世界大国,却在软件业无法形成自己真正的产品。
也就是说,如果微软不给我们提供操作接口,我们上层的产品很多就无法进行开发。
WPS 与 Word 在字处理软件的竞争就很好的证明了这一点。
(说句实说,WPS在功能上和操作的方便性上根本无法与 Word 比较,如果是我的话,我是绝对不 除非……。
导致这种结果的是什么原因呢?会在有 Word 的情况下去使用 WPS 的, )无非是我们对 Windows 里面的机制不了解,不知道它内部是如何实现的。
当然还有硬件上的原因(比如 CPU 等,不过,中国龙芯 CPU 系列的生产给我们带来了希望) 。
如何去改变这一现象,是摆在我们每一个人(这里指软件开发人员)面前的一道难题。
恰恰是 Linux 的出现,将我们面前的这道不可逾越的鸿沟轻而易举的填平了。
所以全世界的软件开发人员投入了 Linux 的大军中,学习它,使用它,品味它,修善它。
它给我们带来了无限的商机,无限的利益。
我们终于可以有我们自己的产品了,不再受制于 Windows。
因为我们可以看到 Linux 的所有源
代码,并可以将我们的思想加入到其中,使它为我们所用。
我们看到了 Linux 的好处,但如何才能真正的掌握 Linux,将它用好,并发挥的淋漓尽致呢?当然是阅读它的源
代码了, 难道还有比这个更直接更好的方法吗。
不过 Linux 的源
代码是如此庞大,岂能是谁说阅读就能读得了的。
现在遇到问题了,我们下一步就是如何解决问题。
解决的方法很简单,就是在阅读它之前先对一些基础知识进行一下饿补。
Unix 操作系统设计、80386 保护模式、接口原理等等。
这么多东西要补呀!那自是当然,Linux 操作系统可不是玩具。
不过我们(软件开发人员)不可能是一点基础没有的人。
(否则我真不知道你大学这四年里到底学了些什么) 我想,这里一个很重要的,也是对于阅读
代码很有帮助的就是 80386 保护模式的知识了。
(啊!终于写到正题了。
)。
为什么要学习 80386 保护模式呢?有以下几点原因: 第一、Linux 最开始就是在一台 INTEL 80386 上开发的。
第二、INTEL 直到 80386 才真正的实现了 32 位的保护模式80286 是 16 位的 保护模式,以后的机型基本上都采用这种模式,框架变化不大。
而 软件当然要跟着硬件“跑”了,否则“皮之不存毛之焉附” 。
第三、操作系统要和硬件和软件两方面打交道。
而 80386 保护模式为操作系 统的实现和保护提供了硬件保证和支持。
在前言的最后,我还要介绍一下我的章节安排。
这篇
论文共分为九部分。
80386 保护模式概述,介绍了 80386 的一些基本概念。
80386 体系架构综述,主要描述 80386 中对操作系统进行保护的机制的总体结构。
描述符介绍了它的在保护模式中的基本特征及其作用。
内存管理介绍了 80386 对内存进行管理的一系列保护机制。
门描述符是描述符的一种特殊形式,之所以在这里单独列出一个章节是因为它在保护模式中的内容很多,单独拿出一章来可以更好的将其描述清楚。
任务管理说明了在保护模式下, 多个任务之间是如何进行任务切换的从而实现多任务处理功能的。
中断与异常处理不再使用实模式下的中断向量表,80386 对其进行了另行处理, 使得中断与异常处理也纳入到了保护的机制下。
输入输出保护实现了对 I/O 操作的保护,只有操作系统允许的情况下,用户程序才可以对 I/O进行操作。
操作系统引导这一章主要是说明 Linux 是如何引导启动的,从而将一个真正的、强大的操作系统运行起来的。
好了,说了这么多没有一点实质的东西,这可不是我的本色。
下面的章节我们就开始我们的 80386 保护模式的学习之旅吧 80386 保护模式概述INTEL 对 80386 处理器的描述 The 80386 is an advanced 32-bit microprocessor optimized formultitasking operating systems and designed for applications needingvery high performance. The 32-bit registers and data paths support 32-bitaddresses and data types. The processor can address up to four gigabytesof physical memory and 64 terabytes 246 bytes of virtual memory. Theon-chip memory-management facilities include address translationregisters advanced multitasking hardware a protection mechanism andpaged virtual memory. Special debugging registers provide data and codebreakpoints even in ROM-based software. 80386 是一种高级 32 位多任务微处理器,这种处理器是为高要求的应用而
设计的。
32 位的寄存器与数据路径支持 32 位的地址和数据类型。
处理器能寻址到 4G 的物理内存和 64T 的虚拟内存。
内存管理设备包括地址转换寄存器、高级多任务硬件、保护机制和分页虚拟内存。
专门的调试寄存器即使在只读寄存器软件中也提供
代码和数据的断点调试功能。
什么是保护模式 我们只要到 www.google.com 中输入“protected mode”这个关键字,我们就可以找到很多链接,在 http://my.execpc.com/geezer/os/pm.htm 这个网址上我找到了如下的定义: What is protected mode The 8088 CPU used in the original IBM PC was not very scalable. In particular there was no easy way to access more than 1 megabyte of physical memory. To get around this while allowing backward compatability Intel designed the 80286 CPU with two modes of operation: real mode in which the 286 acts like a fast 8088 and protected mode now called 16-bit protected mode. Protected mode allows programs to access more than 1 megabyte of physical memory and protects against
misuse of memory i.e. programs cant execute a data segment or write into a code segment. An improved version 32-bit protected mode first appeared on the 386 CPU. 什么是保护模式? IBM PC 最初使用的是 8088 CPU,它的扩展性很差。
尤其是,没有一种容易 的方法访问超过 1M 的物理内存。
为了向后兼容,INTEL 将 80286 CPU 设计 成两种模式:实模式和保护模式。
实模式下 286 就像一台快速 8088 一样工 作。
在保护模式下(现在称为 16 位保护模式)允许程序访问 1M 以上的物 理内存,并保护物理内存不被误使用(例如,程序不能执行数据段或对代 码段进行写操作)。
32 位保护模式是 16 位保护模式的改进版本,首先是在 386 上实现的。
保护模式与实模式有什么不同 实模式 16 位保护模式 32 位保护模式 段基址 16段寄存器(20 位) 段选子(24 位) 段选子(32 位) 段界限 64K16 位 64K16 位 1M 或 4G(20 位) 段保护 没有 有 有 段寄存器 段基址/16 段选子 段选子 分析上面表格,做出以下几点说明: 在实模式下,地址总线是 20 位的。
所以在计算实际物理地址时要进行如下换算。
物理地址 段基址 << 4 偏移地址物理地址等于段基址左移 4 位再加上偏移地址。
而保护模式下的物理地址要通过段描述符才能计算出来。
对于这一点我将在后面做详细介绍。
在 16 位地址总线上,段界限最大为 64K。
也就是说,一个段最大寻址范围只能从段基址到它向后寻址 64K 的地方,再大点它也够不到了。
而且每一个段的大小是固定的,而 32 地址总线可以访问的最大地址空间为 4G。
而且还可以根据需要,设置段界限的大小和设置段界限的单位长度。
它提供了两种单位长度,一种是以字节为单位,一种是以 4K 为单位。
根据段描述符的 G 位来选择。
这一点我到后面还会详细论述。
现在只要知道在 32 位地址总线下,段界线可以是 1M或 4G 就可以了。
在实模式下不进行段保护,而在保护模式下却可以对段进行细致的保护。
如:段是否可用,段的大小是多少,是
代码段还是数据段,段的特权级是多少等等。
而在实模式下这些是不存在的。
在实模式下段寄存器是 16 位的,在计算物理地址时是通过移位然后加偏移地址来实现的。
在 32 位保护模式下,段寄存器同样是 16 位的,但这些在实模式下存放段基址的寄存器到了保护模式下,却用来存放段选择子了。
关于段选择子的概念我将在稍后介绍。
INTEL 对几种模式的说明 The processing mode of the 80386 also determines the features thatare accessible. The 80386 has three processing modes:1. Protected Mode.2. Real-Address Mode.3. Virtual 8086 Mode. Protected mode is the natural 32-bit environment of the 80386processor. In this mode all instructions and features areavailable.Real-address mode often called just quotreal modequot is the modeof theprocessor immediately after RESET. In real mode the 80386 appearsto programmers as a fast 8086 with some new instructions. Mostapplications of the 80386 will use real mode for initialization only. Virtual 8086 mode also called V86 mode is a dynamic mode in thesensethat the processor can switch repeatedly and rapidly between V86 modeandprotected mode. The CPU enters V86 mode from protected mode to executean 8086 program then leaves V86 mode and enters protected mode tocontinueexecuting a native 80386 program. 80386 处理模式还决定了它可访问的特性(不同的模式决定了不同的访问方式)。
80386 有三种处理方式: 1. 保护模式 2. 实模式 3. 虚拟 86 模式 保护模式本身是 32 位的 80386 处理器环境。
在这种模式下所有的指令和特性是有效的。
实地址模式(通常只称为 “实模式” )是处理器复位后就进入的模式。
在实模式下,80386 给程序员的感觉就像一个快速的 8086,只多了一些新的指令。
大多数 80386 应用程序仅使用实模式进行初始化工作。
虚拟 8086 模式(也称为 V86 模式),在某种意义上说是一个动态模式。
处理器能反复、快速的在 V86 模式.