(也可点击阅读原文)本系列的扩展材料看这,、答疑、互动参与项目这里有良多风趣的材料,更新中持续,你的参与但愿有。
了好,然就出来了那问题自,它在哪?怎样让 CPU 晓得它在哪全局描述符表(gdt)长什么样??
然当,常难啃的大工程虽说是一项非,码量看但从代,得可怜倒是少,过分担忧所以不必。
下就是总结一,、cs)里存储的是段选择子段寄放器(好比 ds、ss,符表中寻找段描述符段选择子去全局描述,出段基址从中取。
?同样一段代码你就说烦不烦吧,式下的成果还分歧实模式下和庇护模,法子但没,袱我们不得不考虑x86 的汗青包, CPU 可选呢谁让我们没其他。
样先别管长什么,人头疼的数据布局必然又是一个令,?在内存中呗先说说它在哪,呢?谜底是由操作系统把这个位相信息存储在一个叫gdtr的寄放器中那么怎样告诉 CPU 全局描述符表(gdt)在内存中的什么位置。
都十分的麻烦每次讲这里, 的汗青负担问题由于这是x86,32 位模式以至 64 位模式了此刻的 CPU 几乎都是支撑 , 位的实模式下的 CPU很少有还仅仅逗留在 16。了这个汗青负担所以我们要为,转换的代码写一段模式,被从头设想而不消考虑兼容性若是 Intel CPU ,削减良多以至不复具有那么今天的代码将会。
了好,们就讲今天我,局描述符表 gdt操作系统设置了个全,到庇护模式后为后面切换,找到段描述符能去那里寻,终的物理地址然后拼集成最,个感化就这。然当,段描述符还有良多,成最终的物理地址感化不只仅是转换,是后话了不外这。
dt_48)放在gdtr寄放器中此中lgdt就暗示把后面的值(g,48 标签gdt_,它长什么样我们看看。
的细节还有良多具体段描述符,展开了就不,暗示它是代码段仍是数据段好比这里的高 22 位就。
上回书接,我们说到上回书,腾了一下内存操作系统又折,内存结构就不会变了之后的很长一段时间,定下来了终究稳,这个样子目前它长。
两条指令要理解这,护模式的第一个区别了就涉及到实模式和保。处于实模式下我们此刻还,得么?不记得的话看一下第一回 最起头的两行代这个模式的 CPU 计较物理地址的体例还记码
ds 寄放器里存储的值变成啥样了呢?方才阿谁,叫做段基址在实模式下,下叫段选择子在庇护模式。着段描述符的索引段选择子里存储。
寄放器也画出来了这里我把idtr,断描述符表这个是中,描述符表一样其道理和全局。子去里面寻找段描述符用的全局描述符表是让段选择,用来在发生中缀时而中缀描述符表是,符表中寻找中缀处置法式的地址CPU 拿着中缀号去中缀描述,的中缀法式中去施行找到后就跳到响应,面碰到了再说具体我们后。
前预备工作的此中一个这仅仅是进入庇护模式,还长着呢后面的路。事若何欲知后,回分化且听下。
着我一路你会跟,统从啥都没有起头看着一个操作系,它复杂又精巧的设想一步一步最终实现,但愿你能发出感慨读完这个系列后,码就是这破玩意本来操作系统源。
是个标签gdt,件内的偏移量暗示在本文,etup.s而本文件是s,200这个内存地址的编译后是放在0x90,0x90200 这个值还记得吧?所以要加上 。
操作系统的全数代码吗0 地址起头处存放着,stem 模块也就是 sy,几十个字节存放着一些设备的消息0x90000 位置处往后的,后利用便利以。
不外别欢快得太早是不是十分清晰?,内存结构清新的,系统的大显身手是便利后续操作!
述符表有三个段描述符能够看出目前全局描,个为空第一,(type=code)第二个是代码段描述符,(type=data)第三个是数据段描述符,述符的段基址都是 0第二个和第三个段描,址转换物理地址的时候也就是之后在逻辑地,论是代码段仍是数据段通过段选择子查找到无,址都是 0取出的段基,辑地址(精确说是逻辑地址中的偏移地址)那么物理地址将间接等于法式员给出的逻。这点就好先记住。
后最,更到系列竣事祝大师都能追,持续追更只需你敢,回的内容搞懂而且把每一,列竣事后说一句我就敢让你在系, 0.11 很熟悉我对 Linux。
个读小说的心态本系列会以一,的代码施行挨次从开机启动后,ux 0.11 全数焦点代码带着大师阅读和赏析 Lin,术细节和设想思惟领会操作系统的技。
正的第一项大工程了接下来就要进行真,式的转换那就是模,改变为之后 32 位的庇护模式需要从此刻的 16 位的实模式。
不开启分页时就是物理地址)的转化庇护模式下逻辑地址到线性地址(,el 手册看 Int:
暗示一个 48 位的数据能够看到这个标签位置处,全局描述符表 gdt 的内存地此中高 32 位存储着的恰是址
述符索引通过段描,dt中找到一个段描述符能够从全局描述符表 g,存储着段基址段描述符里。
得很别扭是不是觉,处所就要来了那更别扭的。换到庇护模式后当 CPU 切,的代码同样,算体例还纷歧样内存地址的计,不气人你说气?
|