虚拟地址 线性地址 物理地址 傻傻分不清楚?

Virtual address  Linear address  Physic address

先说说逻辑地址:

我们时常会看到一种地址的表述方式——segment:offset,比如0x0:0x7c2d

这里的地址表述方式是逻辑地址方式,在没有开启分段机制之前,物理地址的寻址通过这种方式。

注意,这种寻址方式非常短暂,一般boot.S里面一旦开启分段了,就不会有这种寻址方式了.

相关的,segment:offset的组织形式,历史上都是称作virtual address,虚拟地址.真正的物理地址是通过

segment<<4 + offset运算得到的. 不管这里的虚拟地址和逻辑地址怎么养,他们的“生存周期”都是非常短的,因为一旦开启分段机制,这种寻址方式就被替代了. 面向应用的程序员几乎很少接触到这类地址(注意一点是造成混淆的重要原因之一)

线性地址:

分段机制开启之后就是使用的线性地址了

比方说下面截图中,那个mov 0x1001c %eax 就是使用的线性地址,<bootmain>旁边的那个00007d0a也是地址,线性地址,当前obj文件代码段内的地址

上述这个反汇编看到的截图地址和我们平日写hello world反汇编看到的地址无异,都是使用的线性地址。而由于普通的user space用户一般都不会去接触boot.S那段代码。所以根本就没有逻辑地址的“需求”.对于普通用户来说,就两种地址,要么这个地址是"假的" ,要么这个地址是“真的”,这里理解的假,真,都是由于对是否这个地址真正对应物理内存来说的。由于用户空间的线性地址不是真正对应的物理地址,所以人们就把这种地址也叫做虚拟地址

所才会有下图(截取自CSAPP)的现象,明明是线性地址空间,被称作虚拟内存.

自然的物理内存地址就不必说了.

之所以这么强调地址概念的区分.一是之前自己晕了好久,半吊子,似懂非懂.

再者,遇到一个问题,触发我去把这个理清楚

看下面的截图,这段代码出自Xv6(MIT-JOS)的 /kern/pmap.h

第一个函数的功能说明是把“takes a kernel virtual address,returns the corresponding physical address”

这里说的把把虚拟地址转换成物理地址就是把线性地址转换成物理地址,

而且实现方法也论证了这一点, 直接的kva - KERNBASE ,这里KERNBASE是0xF0000000

而这里指的“物理地址”也不是别的IO端口的地址,就是内存地址,内存的首地址被映射到KERNBASE

So ...现在就很清楚了

第二个把物理内存地址转换成线性地址就是直接把physical address加上 KERNBASE即可 : -)

总结:

人们会容易混淆的原因在于直接把线性地址称作虚拟地址了,这并没有错(听线性地址的人也不多吧),对于大多数程序员来说,都是接触的线性地址,由于这个地址不是实际的物理地址,所以就习惯性的称作虚拟地址了.使用范围内也就是这个“虚拟地址”(比方说写个C hello world,里面反汇编也就看到的是线性地址)。 大多数人不需要接触到真正的物理地址,这里的概念就变成了对比性的了,不是物理地址的就是虚拟的,使用的是线性地址,由于"不需要那么多概念",于是就把虚拟地址和线性地址挂钩了,而且这里早期的分段未开启的时候虚拟地址的概念已经不存在了,这样时候不会有重叠,于是大家都这么用了....

仅此个人学习总结,如有误解望及时指正.

时间: 2024-08-06 03:43:29

虚拟地址 线性地址 物理地址 傻傻分不清楚?的相关文章

Linux下逻辑地址-线性地址-物理地址图解(转)

一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令: mov    0x80495b0, %eax 这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的基地址,才能构成线性地址.也就是说 0x80495b0 是当前任务的DS数据段内的偏移. 在x86保护模式下,段的信息(段基线性

Linux 内核中逻辑地址/虚拟地址/线性地址三者的区别

本博文引自我的知乎回答:Linux 线性地址,逻辑地址和虚拟地址的关系? 为了防止歧义,以下术语都用英文.部分术语不做解释了,不然答案就太长了. 以下讲解都是以代码段为例 在 Intel 平台下,逻辑地址(logical address)是 selector:offset 这种形式,selector 是 CS 寄存器的值,offset 是 EIP 寄存器的值.如果用 selector 去 GDT( 全局描述符表 ) 里拿到 segment base address(段基址) 然后加上 offse

linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 逻辑地址(Logical Address) 包含在机器语言指令中用来指定一个操作数或一条指令的地址(有点深奥).这种寻址方式在80x86著名的分段结构中表现得尤为具体,它促使windows程序员把程序分成若干段.每个逻辑地址都由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离. 线性地址(

操作系统 内存地址(逻辑地址、线性地址、物理地址)概念

逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分.例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干.只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换):逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段.数据段如果完全一样).应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是

逻辑地址、线性地址、物理地址以及虚拟存储器

http://blog.csdn.net/mrbuffoon/article/details/48947267 Note:本文是基于80×86微处理器进行原理总结. 在内存地址上,我们要区分逻辑地址.线性地址以及物理地址这三个概念.逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址.每一个逻辑地址都由一个段选择符和段偏移量组成.线性地址:也称为虚拟地址,也不是一个真实的地址,他是对应了硬件页式内存转换前地址.物理地址:就是物理内存中的真正地址. 内存控制单元(MMU)通过分段单元

逻辑地址、物理地址、线性地址

逻辑地址(Logical Address) 是指由程序产生的与段相关的偏移地址部分.例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干.只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换):逻辑也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段.数据段如果完全一样).应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是

[转帖]Linux下逻辑地址、线性地址、物理地址详细总结

Linux下逻辑地址.线性地址.物理地址详细总结 https://www.cnblogs.com/alantu2018/p/9002441.html 总结的挺好的 现在应该是段页式管理 使用MMU和TLB 实现 线性地址 逻辑地址 和物理地址的映射. 一.逻辑地址转线性地址    机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序,用gcc编译,再反编译后会看到以下指令:

X86下逻辑地址、线性地址、虚拟地址和物理地址的理解

参考:http://bbs.chinaunix.net/thread-2083672-1-1.html 本贴涉及的硬件平台是X86,如果是其它平台,不保证能一一对号入座,但是举一反三,我想是完全可行的. 一.概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应. --这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,

linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系统中实际存在的远小于4GB的物理内存根据不同需求映射到整个4GB的虚拟存储空间中.Linux主要工作在保护模式下.80X86从逻辑地址到物理地址变换中经过了两个阶段.第一阶段使用分段机制把程序的逻辑地址变换成处理器可寻址内存空间(称为线性地址空间)中的地址.第二阶段的分页机制把线性地址转换成物理地址