• 无用的内存分段


    分段是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,移植性,因为很多处理器对分段支持不好

  • 相关阅读:
    redis主从模式
    深入理解BigDecimal
    double使用BigDecimal进行计算出现精确度问题
    代理IP爬取和验证(快代理&西刺代理)
    Jsoup-简单爬取知乎推荐页面(附:get_agent())
    Jsoup-基础练习
    取数据超过内存限制的问题-解决方案(sample,takeSample,filter)
    说出你的故事:你为什么学爬虫
    hadoop第一次面到hr(品友互动)
    MapReduce本地运行模式wordcount实例(附:MapReduce原理简析)
  • 原文地址:https://www.cnblogs.com/hxdoit/p/3610475.html
Copyright © 2020-2023  润新知