《操作系统真象还原》——0.11 什么是平坦模型

0.11 什么是平坦模型

平坦模型是相对于多段模型来说的,所以说平坦模型指的就是一个段。比如在实模式下,访问超过64KB的内存,需要重新指定不同的段基址,通过这种迂回变通的方式才能达到目的。在保护模式下,由于其是32位的,寻址范围便能够达到4GB,段内偏移地址也是地址,所以也是32位。可见,在32位环境下用一个段就能够访问到硬件所支持的所有内存。也就是说,段的大小可以是地址总线能够到达的范围。既然平坦模型是相对于多段模型来说的,为什么不称为单段模型,而称为平坦呢,我估计很多读者已经明白了,用多个小段再加上不断换段基址的方式访问内存确实够麻烦的,可能换着换着就晕了,别忘记了,这种多段模型为了访问到1MB地址空间,还需要额外打开A20地址线呢,这种访存方式本身就是种补救措施,相当于给硬件打了个补丁,既然是补丁,访问内存的过程必然是不顺畅的。相对于那么麻烦的多段模型,平坦模型不需要额外打开A20地址线,不需要来回切换段基址就可以在地址空间内任意翱翔。如果把内存段比喻成小格子的话,平坦模型下的内存访问,没有众多小格子成为羁绊,可谓一路“平坦”。

所以“平坦”这两个字,突显了当时的程序员受多段模型折磨之苦,迫不及待地想表达其优势的喜悦之情。

时间: 2024-12-25 15:04:55

《操作系统真象还原》——0.11 什么是平坦模型的相关文章

《操作系统真象还原》——导读

**前言**想象一下,如果是爱因斯坦那样的天才给我们讲物理知识,我们会觉得物理更容易理解吗?肯定是不会的,因为在爱因斯坦眼中比较容易的内容也许对我们来说非常深奥,他用B解释A的时候也许会让我们更迷惑,因为B我们也不懂,这就是基础的问题了.幸运的是阅读本书时读者只要有C语言和部分汇编语言的基础就行了,涉及的其他方面的知识我都会详细介绍,并以更易懂的方式去解释技术难点,读者不必担心看不懂本书. 回忆一下学车的经历:教练让学员先踩离合器再挂档,然后再踩油门,车子就开动啦.如果学员总是学不会这些,有可能

《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗

0.8 代码中为什么分为代码段.数据段?这和内存访问机制中的段是一回事吗 首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美.就像用饭盒装饭菜一样,完全可以将很多菜和米饭混合在一起,或者搅拌成一体,哈哈,但这样可能就没什么胃口啦.如果饭盒中有好多小格子,方便将不同的菜和饭区分存放,这样会让我们胃口大开增加食欲. x86平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址.我们这里讨论的程序代码中的段(用section或segme

《操作系统真象还原》——0.25 指令集、体系结构、微架构、编程语言

0.25 指令集.体系结构.微架构.编程语言 指令集是什么?表面上看它是一套指令的集合.集合的意思显而易见,那咱们说说什么是指令. 在计算机中,CPU只能识别0.1这两个数,甚至它都不知道数是什么,它只知道要么"是",要么"不是",恰好用0.1来表示这两种状态而已. 人发明的东西逃不出人的思维,所以,先看看我们人类的语言是怎么回事. 不同的语言对同一种事物有不同的名字,这个名字其实就是代码.比如说人类的好朋友:狗,咱们在中文里称之为狗,但在英文中它被称为dog,虽然

《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的

0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的 首先肯定的是先有的编程语言,哪怕这个语言简单到只有一个符号.先是设计好语言的规则,然后编写能够识别这套规则的编译器,否则若没有语言规则作为指导方向,编译器编写将无从下笔. 第1个编译器是怎么产生的?这个问题我并没有求证,不过可以谈下自己的理解,请大伙儿辩证地看. 这个问题属于哲学中鸡生蛋.蛋生鸡的问题,这种思维回旋性质的本源问题经常让人产生迷惑.可是现实生活中这样的例子太多了. (1)英语老师教学生英语,学生成了英语老师后又可以教

《操作系统真象还原》——0.21 Section和Segment的区别

0.21 Section和Segment的区别 C程序大体上分为预处理.编译.汇编和链接4个阶段.预处理阶段是预处理器将高级语言中的宏展开,去掉代码注释,为调试器添加行号等.编译阶段是将预处理后的高级语言进行词法分析.语法分析.语义分析.优化,最后生成汇编代码.汇编阶段是将汇编代码编译成目标文件,也就是转换成了目标机器平台上的机器指令.链接阶段是将目标文件连接成可执行文件.这里我们只关注汇编和链接这两个阶段. 在汇编源码中,通常用语法关键字section或segment来表示一段区域,它们是编译

《操作系统真象还原》——0.3 写操作系统,哪些需要我来做

0.3 写操作系统,哪些需要我来做 首先应该明确,在计算机中有分层的概念,也就是说,计算机是一个大的组合物,由各个部分组合成一个系统.每个部分就是一层功能模块,各司其职,它只完成一定的工作,并将自己的工作结果(也就是输出)交给下一层的模块,这里的模块指的是各种外设.硬件. 这样,各种工作成果不断累加,通过这种流水线式的上下游协作,便实现了所谓的系统.可见,系统就是各种功能组合到一起后,产生最终输出的组合物.就像人的身体,胃负责搅拌食物,将这些食物变食糜后交给小肠,因为小肠只能处理流食,所以上游的

《操作系统真象还原》——0.7 内存访问为什么要分段

0.7 内存访问为什么要分段 按理说咱们应该先看看段是什么,不过了解段是什么之前,先看看内存是什么样子,如图0-2所示. 内存按访问方式来看,其结构就如同上面的长方形带子,地址依次升高.为了解释问题更明白,我们假设还在实模式下,如果读者不清楚什么是实模式也不要紧,这并不影响理解段是什么,故暂且先忽略. 内存是随机读写设备,即访问其内部任何一处,不需要从头开始找,只要直接给出其地址便可.如访问内存0xC00,只要将此地址写入地址总线便可.问题来了,分段是内存访问机制,是给CPU用的访问内存的方式,

《操作系统真象还原》——0.18 编译型程序与解释型程序的区别

0.18 编译型程序与解释型程序的区别 解释型语言,也称为脚本语言,如JavaScript.Python.Perl.PHP.Shell脚本等.它们本身是文本文件,是某个应用程序的输入,这个应用程序是脚本解释器. 由于只是文本,这些脚本中的代码在脚本解释器看来和字符串无异.也就是说,脚本中的代码从来没真正上过CPU去执行,CPU的cs:ip寄存器从来没指向过它们,在CPU眼里只看得到脚本解释器,而这些脚本中的代码,CPU从来就不知道有它们的存在.这些脚本代码看似在按照开发人员的逻辑执行,本质上是脚

《操作系统真象还原》——0.15 局部变量和函数参数为什么要放在栈中

0.15 局部变量和函数参数为什么要放在栈中 局部变量,顾名思义其作用域属于局部,并不是像static那样属于全局性的.全局的变量,意味着谁都可以随时随地访问,所以其放在数据段中.而局部变量只是自己在用,放在数据段中纯属浪费空间,没有必要,故将其放在自己的栈中,随时可以清理,真正体现了局部的意义.这个就是堆栈框架,提到了就说一点吧,栈由于是向下生长的,堆栈框架就是把esp指针提前加一个数,原esp指针到新esp指针之间的栈空间用来存储局部变量.解释一个概念,堆是程序运行过程中用于动态内存分配的内