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

  • 相关阅读:
    数据分析的5层解读,报表仍是有效的落地实践!
    rex 传文件改变用户属主
    rex 通过--parameter1=dbcdefg传参
    rex 给shell 脚本传参
    rex run 传参
    rex ssh公钥认证
    eclipse maven工程中src/main/resources目录下创建的文件夹是包图标的解决方法
    数据分析的三层需求
    com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value
    java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
  • 原文地址:https://www.cnblogs.com/hxdoit/p/3610475.html
Copyright © 2011-2022 走看看