《操作系统真象还原》——0.12 cs、ds这类sreg段寄存器,位宽是多少

0.12 cs、ds这类sreg段寄存器,位宽是多少

CPU中存在段寄存器是因为其内存是分段访问的,这是设计之初决定的,属于基因里的东西。前面已经介绍过了内存分段访问的方法,这里不再赘述。

CPU内部的段寄存器(Segment reg)如下。

(1)CS——代码段寄存器(Code Segment Register),其值为代码段的段基值。

(2)DS——数据段寄存器(Data Segment Register),其值为数据段的段基值。

(3)ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外做他用。

(4)FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,同上,用途不固定,使用上灵活机动。

(5)GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值。

(6)SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值。

32位CPU有两种不同的工作模式:实模式和保护模式。

每种模式下,段寄存器中值的意义是不同的,但不管其为何值,在段寄存器中所表达的都是指向的段在哪里。在实模式下,CS、DS、ES、SS中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基值:段内偏移量”的形式。在保护模式下,装入段寄存器的不再是段地址,而是“段选择子”(Selector),当然,选择子也是数值,其依然为16位宽度。

可见,在32位CPU中,sreg无论是工作在16位的实模式,还是32位的保护模式,用的段寄存器都是同一组,并且在32位下的段选择子是16位宽度,排除了段寄存器在32位环境下是32位宽的可能,综上所述,sreg都是16位宽。

时间: 2024-10-24 22:41:14

《操作系统真象还原》——0.12 cs、ds这类sreg段寄存器,位宽是多少的相关文章

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

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

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

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

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

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

《操作系统真象还原》——0.24 如何控制CPU的下一条指令

0.24 如何控制CPU的下一条指令 其实此问题我一直犹豫要不要写出来,因为大部人都觉得这个问题有些匪夷所思,CPU是负责执行指令的,它会按照程序的执行流程走,此问题的目的其实就是想知道如何牵着CPU的鼻子走.当初我被问这个问题时也觉得很诧异,甚至我觉得自己可能没理解人家的意思.后来他这样跟我说:"CPU要执行的下一条指令是在CS:IP寄存器吧?"我说:"是啊".他又问:"CS和IP寄存器,是用mov指令修改的吗?"我听后,顿时觉得他这个问题很有

《操作系统真象还原》——0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别

0.9 物理地址.逻辑地址.有效地址.线性地址.虚拟地址的区别 物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性.不管在什么模式下,不管什么虚拟地址.线性地址,CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站. 在实模式下,"段基址+段内偏移地址"经过段部件的处理,直接输出的就是物理地址,CPU可以直接用此地址访问内存. 而在保护模式下,"段基址+段内偏移地址"称为线性地址,不过,此时的段基址已经不再是真正的地址了,而

《操作系统真象还原》——2.3 让MBR先飞一会儿

2.3 让MBR先飞一会儿 虽说主引导记录mbr是咱们能够掌控的第一个程序,但这并不是让我们为之激动的理由.我们平时所写的程序都要依赖于操作系统,而我们即将实现的这个程序是独立于操作系统的,能够直接在裸机上运行,这才是让我们激动的理由,对咱们来说这无疑是历史性的一刻.还记得当初我的MBR跑起来时,那可真是发自内心的高兴呀. 好了,不再抒情了,说正事要紧.MBR的大小必须是512字节,这是为了保证0x55和0xaa这两个魔数恰好出现在该扇区的最后两个字节处,即第510字节处和第511字节处,这是按

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

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

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

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

《操作系统真象还原》——0.5 应用程序是什么,和操作系统是如何配合到一起的

0.5 应用程序是什么,和操作系统是如何配合到一起的 应用程序是软件(似乎是废话,别急,往后看),操作系统也是软件.CPU会将它们一视同仁,甚至,CPU不知道自己在执行的程序是操作系统,还是一般应用软件,CPU只知道去cs:ip寄存器中指向的内存取指令并执行,它不知道什么是操作系统,也无需知道. 操作系统是人想出来的,为了让自己管理计算机方便而创造出来的一套管理办法. 应用程序要用某种语言编写,而语言又是编译器来提供的.其实根本就没有什么语言,有的只是编译器.是编译器决定怎样解释某种关键字及某种