• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

树莓派高级开发------总线地址、物理地址和虚拟地址的认识

武飞扬头像
嵌入式软件工程师
帮助5

一、微机总线地址

百度百科的解释:地址总线 (Address Bus;又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。

以上的解释显得苍白无力的样子,看了好像也是白看一样

其实换句话说 总线地址就是cpu能够访问到内存的范围

接下来举一个例子来进行说明一下
现象:装了32位的win7系统,内存条明明是8G的,但是系统只识别到了3.8G,只有装了64位的操作系统,才能将8g内存识别出来

原因32位操作系统能表示或访问到的内存范围是2的32次方(bit),那么2的32次方等于4,294,967,296 bit

bit—kbit—mbit—gbit 相邻单位之间差1024
bit 4,294,967,296
kbit 4,194,304 KB
mbit 4,096 MB
gbit 4GB

那么树莓派3B也是跑32位的操作系统,那么我们在树莓派下输入以下指令查看内存的大小
指令:cat /proc/meminfo
学新通
从上图的黄框中我们可以看出,树莓派内存的大小是949448 KB = 949 MB ,约等于1G的内存大小

二、物理地址(PA)

百度百科的解释:在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址

拓展解释物理地址是内存中内存单元的实际地址,并不是外部总线连接的其他的电子元件的地址,物理地址其实是属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是已经按照顺序排好的了,物理地址的大小决定内存中有多少个内存单元,物理地址的大小是由地址总线的位宽决定的。
物理地址是实际地址或绝对地址

三、虚拟地址(VA)

百度百科解释:虚拟地址是Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址,与实地址模式下的分段地址类似,虚拟地址也可以写为“段:偏移量”的形式,这里的段是指段选择器。

我的解释:逻辑(基于算法的地址(软件层面的地址,是假地址来的))地址称为虚拟地址

温馨提示:在树莓派的BCM2835芯片手册里,其IO口的地址介绍的是物理地址,但挂载到linux内核的是虚拟地址,编程所使用的也是虚拟地址

三、物理地址和虚拟地址之间的关系

首先我们先来熟悉一下什么是MMU单元:MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。作用有两点,地址翻译和内存保护。MMU将虚拟地址翻译为物理地址。

页表(MMU的单元)

分页管理:
学新通
(1)内存分页其实就是我们所说的4G空间,内存的所有内存被操作系统内核以4G为每页划分开,当我们程序运行时会被加载到内存中的4G空间里,其实说是有4G其实并没有真正在的4G空间,4G空间中有一小部分被映射到了物理内存中,或者被映射到了硬盘的文件上(fopen),或者没有被映射,还有一部分在内存当中就会被划分栈,堆,其中有大片大片的内存是没有被映射的,同样物理内存也是被分页了用来与虚拟内存产生映射关系。将虚拟地址映射为物理地址有一个算法(页表)决定了将虚拟地址映射到物理地址的哪个位置,页表是通过MMU(分页内存管理单元)来管理的,就是设计完页表后通过MMU来执行将虚拟地址映射为物理地址。

(2)其实真正情况下只有3G用户空间,假如你的内存是4G的那么其中有1G是给操作系统内核使用的,所谓的4G空间只是操作系统基于虚拟内存这种拆东墙补西墙的形式给你一种感觉每个进程都有4G的可用空间一样!这里来说一下拆东墙补西墙,当我们程序被加载进4G空间时其实根本用不了所谓的4G空间,其中有大片内存被闲置,那么这个时候呢,其他程序被加载进来时发现内存不够了,就把其他程序里的4G空间里闲置部分拿出来给这个进程用,换之这个进程内存不够时就会把其他进程里闲置的空间拿过来给该进程使用。银行也是如此!

(3)当我们要对物理地址做操作时比如if语句要根据CPU的状态标志寄存器来做不同的跳转,那么这个时候就要对CPU额状态寄存器做操作了就必须知道它的物理地址,内存中有一个电子元件叫MMU负责从操作系统已经初始化好的内存映射表里查询与虚拟地址对应的物理地址并转换,比如mov
0x4h8这个是虚拟地址,当我们要对这个虚拟地址里写数据时那么MMU会先判断CPU的分页状态寄存器里的标志状态是否被设定,如果被设定那么MMU就会捕获这个虚拟地址物理并在操作系统内核初始化好的内存映射表里查询与之对应的物理地址,并将其转换成真正的实际物理地址,然后在对这个实际的物理地址给CPU,在由CPU去执行对应的命令,相反CPU往内存里读数据时比如A进程要读取内存中某个虚拟地址的数据,A进程里的指令给的是虚拟地址,MMU首先会检查CPU的分页状态寄存器标志位是否被设置,如果被设置MMU会捕获这个虚拟地址并将其转换成相应的物理地址然后提交给CPU,在由CPU到内存中去取数据!

简单的来说就是:
我们的32位树莓派物理内存约1G,CPU可以识别的范围是约4G,假设你的程序在磁盘超过1个G,物理地址不够用,大概率运行不起来或者崩掉,此时就需要虚拟地址来帮助我们扩大虚拟的容量(准确说是映射),将我们的物理地址通过分页机制(页表mmu)映射到虚拟地址,我们写的代码都是操控的虚拟地址,上层应用程序都是运行在虚拟地址中的。

有关总线地址、物理地址和虚拟地址认识的优秀博文

学习笔记,仅供参考

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhgfcb
系列文章
更多 icon
同类精品
更多 icon
继续加载