zoukankan      html  css  js  c++  java
  • 无用的内存分段

    分段是80X86体系的处理器支持的一种特性,也就是说硬件已经支持了这内存分段的功能, 用或不用的选择权在操作系统手中,linux系统就没有使用分段的功能,而使用了分页的功能。

    linux虽然没有用分段,但了解分段对于整个linux系统的了解,还有linux初始化的时的流程,还是很有用的。

    参考资料 《深入理解Linux内核》第二章,大概讲了12页,我也看了几遍才看懂,以下内容就算个读书笔记。

    一,内存地址的分类

    1,逻辑地址:   由段和偏移量组成

    2,线性地址: 可以想像成指针地址,就是我们在C语言中的用的指针

    3,物理地址: 实实在在的物理内存地址

    二,处理器有哪硬件特性支持分段

    如下图所示,CPU提供了6个段寄存器(cs,ss...)和6个段描述符寄存器(图中矩形)

    段寄存器:16比特,其中存的是段描述符的索引,即段选择符

    段描述符:8个字节,存的是段的描述信息,此寄存器不可编程,它随着段寄存器值的改变而改变,由硬件完成。

    gdtr寄存器:当操作系统初始化时,会在内存中创建GDT(段全局描述符表),然后将这个表的地址放入gdtr寄存器中。

    三,逻辑地址怎么样转换为线性地址

    假如我们现在有了一个逻辑地址,1:100,1代表段选择符,100代表偏移量,那么我们根据段选择符1就可以从寄存器中拿到段描述符。从段描述符中可以取到段的起始地址,然后再加上偏移量,就得到了线性地址,整个过程由硬件完成。

    四,Linux怎么使用分段

    如下图所示,linux中所有分段的起始地址都定义成了0,这就得出了一个重要的结论:在Linux下,逻辑地址和线性地址是一样的。

    也就是说,linux绕开了硬件的分段功能!!!

    按书上的说法,原因有二

    1,简单,因为linux用了分页,再用分段,会比较复杂。

    2,移植性,因为很多处理器对分段支持不好

  • 相关阅读:
    CPP流类库与输入输出
    STL学习之mismatch();
    谷歌浏览器现在点击任何文本都会出现光标
    jQuery删除元素remove和和empty的区别
    jQuery中的鼠标离开事件mouseout和mouseleave区别
    java类中的布尔(boolean&Boolean)类型字段要注意get方法和字段的命名
    Navicat_Premium_v15 激活
    navicat注册过期修改方法
    ClassNotFoundException找不到类异常的原因package 路径eclipse自动给我在路径前面加了一个java变成了java.com.XXX
    我保存一份博客园样式代码
  • 原文地址:https://www.cnblogs.com/hxdoit/p/3610475.html
Copyright © 2011-2022 走看看