• 线性地址和物理地址


    Intel架构下

    • 凡是在代码中书写的内存地址都是逻辑地址, 也就是采用基地址:偏移量, 我们能够直接看到的也是逻辑地址, 通过左移等操作可以计算出对应的物理地址(在实模式下逻辑地址与物理地址没有中间层所以是可以的, 但是在保护模式则是行不通的, 再说)

    实模式下

    • 逻辑地址通过左移等操作可以计算出对应的物理地址

    保护模式

    • 在逻辑地址和物理地址之间多了一个中间层线性地址
    • 逻辑地址左移等操作计算出来的是线性地址而不再是物理地址了, 线性地址就是32位的整数
    • 通过分页机制将线性地址转为32位的物理地址

    在Intel保护模式下32位为了兼容老式机强制要求分段机制, 但是在其他硬件平台则只是支持了分页机制

    • Linux为了可以解决硬件平台的不兼容, 巧妙的绕过了Intel的分段机制, 那就是将所有的基地址为0x00000000, 偏移量为4GB的范围
    • IA-32还规定需要为代码段和数据段创建不同的段, 注意: 段地址和基地址不同, 基地址是保存在CPU的寄存器中的, 而段地址就是一个Label而已, 同时Intel的CPU有0和3两个特权, 这两个级别的代码段和数据段是不能共用的, 所以要为两个级别创建不同的代码段和数据段

    在Intel64位下去掉了段机制, 直接使用线性地址(32位整数)访问内存地址

    • 这样我们就可以理解下面的代码了
    
    ; 在保护模式下32位(还是采用段机制访问内存)
    ; 初始化临时的要进入到IA-32e模式的GDT数据结构
    LABEL\_GDT64:    dq 0x0000000000000000
    LABEL\_DESC\_CODE64:    dq     0x0020980000000000
    LABEL\_DESC\_DATA64:    dq      0x0000920000000000
    
    GdtLen64       equ    $ - LABEL\_GDT64
    GdtPtr64        dw     GdtLen64 - 1
                         dd      LABEL\_GDT64
    
    ; 我们知道GdtPtr64中的值是要加载到gdtr寄存器中的, 而gdtr中的4b保存的地址, 这里我们发现地址时就是一个线性地址而不是0x00000:004114等等
    
  • 相关阅读:
    音频、视频等文件格式(.ts、.meta)及其认识
    元素之和最接近 0 的区间(部分和)
    元素之和最接近 0 的区间(部分和)
    说话的智慧
    说话的智慧
    工业相机基本参数以及选型参考(二)
    常用编程软件站点、镜像站、科技类 PDF
    常用编程软件站点、镜像站、科技类 PDF
    经典书单 —— 语言/算法/机器学习/深度学习/AI/CV/PGM
    hdu1024 Max Sum Plus Plus
  • 原文地址:https://www.cnblogs.com/megachen/p/9768115.html
Copyright © 2020-2023  润新知