美文网首页
day2分段理解

day2分段理解

作者: 柯基是只dog | 来源:发表于2018-07-15 14:23 被阅读0次

    内存分配是由操作系统完成的,操作系统是直接面对物理内存的,而我们的应用程序编译后的地址其实是逻辑地址。操作系统会通过分段机制把逻辑地址转成线性地址,如果这时候操作系统并未使用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是局部表,那么流程大概如下

    • 判断段选择符比如cs的ti标识位是1
    • 用LDTR寄存器的选择符去全局表中找到对应的LDT描述符,描述符里记录了这个局部表的入口地址
    • 使用cs的13位的index选择符去这个局部表里找到真正的基址描述符

    总结一下

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

    相关文章

      网友评论

          本文标题:day2分段理解

          本文链接:https://www.haomeiwen.com/subject/rrsppftx.html