day2分段理解

2018-07-15  本文已影响0人  柯基是只dog

内存分配是由操作系统完成的,操作系统是直接面对物理内存的,而我们的应用程序编译后的地址其实是逻辑地址。操作系统会通过分段机制把逻辑地址转成线性地址,如果这时候操作系统并未使用cpu分页功能,那线性地址就是物理地址。如果还开启了分页功能,线性地址就经过分页转换成物理地址。

背景,x86体系的cpu都是向前兼容的,原来16位cpu时候,寄存器都是16位的,其中有6个寄存器叫做段选择寄存器,分别是(CS,SS,DS,ES,FS,GS),cs是代码选择器,ss是堆栈选择器,拿代码地址来说,真正的地址实际上cs+选择地址=真正地址,所以我们可以人为的把内存分为很多段,这样就可以方便的书写代码了。

现在到了32位了,但这几个段选择器为了向前兼容还是16位的,我们知道32位可以寻址的内存是2^32=4M了,16位的段选择器已经难以满足了。因为向前兼容cpu在通电后仍然是80386的形态,这时候我们就要完成几件事,才能让cpu变成成为32位的,主要就是设置gdtr寄存器,打开标志寄存器的分段。

GDTR是什么

其实很好理解,而且我们早就用过了,当空间不足的时候,就用多级索引啊!比如文件系统,比如缓存系统,GDTR也是一样的,我们把原来的段选择器不当做直接的分段地址来用,而是当做一个索引号,如果16位全部用来做索引那我们就可以选择2^16个真正的段描述符足够我们使用了(但实际上我们使用前13位做选择符,紧接着1位用来标识是GDT还是IDT,最后2位是权限标识)

段选择器

好了现在我们知道原来的段寄存器,现在变成了一个段选择寄存器了,现在就差一个表来存放实际的描述符了,操作系统其实就是在内存中分配了一部分内存专门存放描述表。GDTR就是这个表的入口地址,如果用c语言来描述gdtr可以当做一个64byte的数组。

LDTR是什么

GDTR是全局的,基本上操作系统完成切换后是就不会变了。表里除了段描述符外还有其他几种类型的,有tss描述表,ldt描述表等,LDTR就是存放ldt索引号的。我们可以把LDTR理解成局部分段,比如操作系统可以给每个进程都分配一个局部表,这样就可以用硬件来隔离不同进程的资源了。那么好了我们就可以把LDTR理解成二级表,前面说了段选择符的倒数第3位是ti标识位,0代表使用全局表,1代表使用局部表,这时候如果cs寄存器的ti是局部表,那么流程大概如下

总结一下

cpu提供了分段分页机制让特殊程序(操作系统)可以映射不同的内存,可以让操作系统可以站在更高的视角和权限去分配内存资源。这样可以让用户程序更方便的书写,都可以假设自己是从0地址开始往后分布的。而操作系统可以使多道程序同时存在内存中,用不同的分段映射到实际地址去,这样就可以很方便的实现多到程序

上一篇 下一篇

猜你喜欢

热点阅读