线性地址和物理地址

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

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等等
目录
相关文章
|
8月前
|
缓存
内存学习(三):物理地址空间
内存学习(三):物理地址空间
246 0
|
3月前
|
存储 缓存 网络协议
|
3月前
请求分页给出逻辑地址,求对应的物理地址
请求分页内存管理中如何根据逻辑地址计算物理地址的过程,包括确定页号、计算偏移量,并将其转换为物理地址。
123 1
请求分页给出逻辑地址,求对应的物理地址
|
8月前
|
存储 程序员 芯片
虚拟地址和物理地址之间的区别
【4月更文挑战第12天】
682 2
虚拟地址和物理地址之间的区别
|
8月前
|
存储 芯片
什么是虚地址,什么是物理地址?
什么是虚地址,什么是物理地址?
184 0
|
存储 索引
逻辑地址与物理地址的转换
最近一直在学8086,上课老师突然问了个这。对于问题“8086 CPU 能提供20位的地址信息,可直接对1M个存储单元进行访问,而CPU内部可用来提供地址信息的寄存器都是16位,那怎样用16位寄存器来实现20位地址寻址呢"明白了不少。
180 0
|
存储
逻辑地址和物理地址转换
逻辑地址和物理地址转换
|
程序员 索引
《操作系统真象还原》——0.9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址的区别
物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址、线性地址,CPU最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站。
2367 0
|
程序员 C语言
数据寻址——偏移寻址
数据寻址——偏移寻址
745 0
数据寻址——偏移寻址
|
存储 算法 NoSQL
Linux下逻辑地址-线性地址-物理地址图解
Linux下逻辑地址-线性地址-物理地址图解

热门文章

最新文章