Virtual address  Linear address  Physic address

先说说逻辑地址:

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

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

相关的,segment:offset的组织形式,是virtual address,虚拟地址.真正的物理地址是通过 segment<<4 + offset运算得到的.

线性地址:

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

例如说以下截图中。那个mov 0x1001c %eax 中的0x1001c就是使用的偏移地址。数据段CS的偏移量,而<bootmain>旁边的那个00007d0a也是地址,代码段的偏移地址。当前obj文件代码段CS内的偏移地址,“(CS:IP)始终指向下一条指令所处的地址”这句话里的地址就是代码段内的偏移地址,下图中的00007d0a,7d0b,7d0e。。。

这些都是代码段的偏移地址,而 0x10000这些地址是当前数据段的偏移地址 ,$0x464c457fz仅仅是个马上数

上述下划线部分是近期update

第二次update:      把握住上面下划线的分析。easy知道这里的偏移地址其能够依据seg:offset解析做线性地址,进而依据分页的机制,解析假设映射到物理地址

上述这个反汇编看到的截图地址和我们平日写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

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

So ...如今就非常清楚了

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

总结:

人们会easy混淆的原因在于直接把线性地址称作虚拟地址了。这并没有错(听线性地址的人也不多吧),对于大多数程序猿来说,都是接触的线性地址,因为这个地址不是实际的物理地址。所以就习惯性的称作虚拟地址了.使用范围内也就是这个“虚拟地址”(例如说写个C hello world,里面反汇编也就看到的是线性地址)。

大多数人不须要接触到真正的物理地址。这里的概念就变成了对照性的了,不是物理地址的就是虚拟的。使用的是线性地址,因为"不须要那么多概念",于是就把虚拟地址和线性地址挂钩了,并且这里早期的分段未开启的时候虚拟地址的概念已经不存在了。这样时候不会有重叠,于是大家都这么用了....

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

转载于:https://www.cnblogs.com/yangykaifa/p/7153838.html

虚拟地址 线性地址 物理地址 傻傻分不清楚?相关推荐

  1. 操作系统 内存碎片 cache替换算法 虚拟地址逻辑地址线性地址物理地址

    采用分区式存储管理的系统,在储存分配过程中产生的.不能供用户作业使用的主存里的小分区称成"内存碎片".内存碎片分为内部碎片和外部碎片. 内部碎片 内部碎片就是已经被分配出去(能明确 ...

  2. Linux下逻辑地址-线性地址-物理地址图解

    一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序 ...

  3. linux kernel基本构成的内容有下列哪些项_Linux下逻辑地址-线性地址-物理地址详解...

    一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序 ...

  4. 逻辑地址、线性地址、物理地址和虚拟地址初步认识

    早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同时运行多个程序时,必须保证这些 ...

  5. linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址

    我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...

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

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  7. 逻辑地址、线性地址和物理地址的转换

    一.逻辑地址 逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元.存储单元.网络主机的地址. 逻辑地址往往不同于物理地址,通过地址翻译器或映射函数可以把逻辑地址转化为物理地址. 一个逻辑地址 ...

  8. (转)逻辑地址,线性地址,物理地址的差别

    段页式内存管理中,逻辑地址,线性地址,物理地址的差别 线性地址是逻辑地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址.程序代码会产生逻辑地址,或者说是段中的偏移地址 ...

  9. 逻辑地址、线性地址和物理地址

    逻辑地址.线性地址和物理地址 逻辑地址(logical addresses)是由程序生成的与段相关的偏移地址的一部分. 例如,你在C语言中进行指针编程,可以读取指针变量本身的值(&操作),实际 ...

最新文章

  1. oracle找到引起账户锁定的ip,Oracle 找到引起账户锁定的IP
  2. 2021年黑龙江省智能车邀请赛
  3. CentOS 查看系统版本号
  4. Java 8 - Stream实战
  5. 如何隐藏android的屏幕上的Title Bar
  6. git切换到旧版本_github上怎么切换到某次提交?
  7. 【NLP】从头开始学词向量的预训练
  8. 为什么先交钱后用电_适合痘痘痘印的好的护肤品,为什么要先清洁后祛痘!_新闻中心...
  9. 字符串,字节,二进制转换
  10. 奇安信代码安全实验室获授华为鲲鹏计算平台漏洞奖励计划合作伙伴
  11. vue中使用html2canvas方法,设置背景,字体重叠问题解决方法
  12. oracle授权v$lock,Oracle八大性能视图之v$lock
  13. 数组/指针,字符数组/字符串/指向字符的指针
  14. 购买二手房时 众多购房者忽视办理土地证过户
  15. mapxtreme 查找指定位置的图元
  16. linux 配置java环境变量_linux配置java环境变量(详细)
  17. Springboot统一异常处理并保存到数据库
  18. 浙江大学软件学院2020年保研真题Distance of Triples (25 分)
  19. 运行 skimage 报错ImportError: DLL load failed:找不到指定模块
  20. 结婚仪式的过程(供朋友们参考)

热门文章

  1. Non-resolvable parent POM for解决
  2. 数字游民让你实现边旅游边工作
  3. java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
  4. elasticSearch availableProcessors is already set to [8], rejecting [8]
  5. C++ std::shared_mutex读写锁
  6. 什么是客户端和服务器 ???
  7. 搭建VS2010+ACCESS2003环境遇到的问题
  8. BGP的IBGP邻居和路由详解,理论+实战,一分钟掌握
  9. A-One Smart 2.39安装包 下载
  10. 对外经济贸易大学继续教育学院国际贸易实务模拟实习项目启动