这两天有个问题一直萦绕着,计算机中的物理地址和内存地址,虚地址究竟是怎么回事?地址是怎样分配的呢?

翻了下操作系统课本,恩,晚上回去看看存储器管理,虚拟存储器,磁盘存储器管理这几章。隐约还记得微机原理学的寄存器寻址,现在网上看看,搜集一下待做整理。

昨天看到论坛上有人问,调程序的时候编译器分配的是物理地址还是虚地址(差不多是这意思),看到大家基本回答是说虚地址,操作系统之上的根本就不可能接触物理地址,而且可用的物理地址是相当混乱的,必须由操作系统整理映射。(差不多吧?个人认为应该没错)刚刚搜索的结果有说:程序里指针用的地址都是些虚拟地址,而且其范围完全可以大于你拥有的内存大小。当要执行这些程序段落时,系统首先要把机器码装进内存,这里就有个把虚拟地址映射到物理地址的问题。

在一台 计算机 中,计算机系统为了唯一的标示一个内存单元,操作系统会给每一个内存单元编上一个绝对的号,计算机系统就通过这个编号来定为每一个内存单元的物理位置,这个编号称为内存的物理地址 。

针对程序编译过程中的地址问题:

汇编器(assembler)只是生成一个需重定位的object文件。这个目标文件需经过链接器(Linker)与相应的库链接起来生成一个可执行的文件。 assembler 产生的代码是从 0 开始编址。经过 Lineker 重定位后生成的可执行映象按OS的不同而不同。至于 内存中的全局以及静态变量的编址也是需重定位的。局部变量则无需重定位。
汇编生成的,是一些浮动模块和一张符号表。链接器按照这张符号表,把这些模块装配成一个整体。在运行时,系统的装载器做重定位,才真正确定了地址。这个地址还是虚拟地址。系统的存储管理子系统为其分配真正的物理地址。
some additional stuffs:
内存地址对齐(Byte Alignment)
http://blog.chinaunix.net/u/25572/showart_425515.html

大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址. 比如Motorola 68000不允许将16位的字存储到奇数地址中, 将一个16位的字写到奇数地址将引发异常.

实际上, 对于c中的字节组织, 有这样的对齐规则:

  • 单个字节(char)能对齐到任意地址
  • 2字节(short)以2字节边界对齐
  • 4字节(int, long)以4字节边界对齐
不同CPU的对其规则可能不同, 请参考手册.

为什么会有上述的限制呢? 理解了内存组织, 就会清楚了
CPU通过地址总线来存取内存中的数据, 32位的CPU的地址总线宽度既为32位置, 标为A[0:31]. 在一个总线周期内, CPU从内存读/写32位. 但是CPU只能在能够被4整除的地址进行内存访问, 这是因为: 32位CPU不使用地址总线的A1和A2. (比如ARM, 它的A[0:1]用于字节选择, 用于逻辑控制, 而不和存储器相连, 存储器连接到A[2:31].)

访问内存的最小单位是字节(byte), A0和A1不使用, 那么对于地址来说, 最低两位是无效的, 所以它只能识别能被4整除的地址了. 在4字节中, 通过A0和A1确定某一个字节.

再看看刚才的message结构, 你想想它占了多少字节? 别想当然的以为是10个字节. 实际上它占了12个字节. 不信? 用sizeof(message)看吧. 对于结构体, 编译器会针对起中的元素添加"pad"以满足字节对齐规则. message会被编译器改为下面的形式:

struct Message

{   short opcode;   char subfield;   char pad1;             // Pad to start the long word at a 4 byte boundary   long message_length;   char version;   char pad2;             // Pad to start a short at a 2 byte boundary   short destination_processor;   char pad3[4];          // Pad to align the complete structure to a 16 byte boundary};

如果不同的编译器采用不同的对齐规则, 对传递message可就麻烦了.

Byte Endian


是指字节在内存中的组织,所以也称它为Byte Ordering.

对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:

(1) 它的地址是多少?

(2) 它的字节在内存中是如何组织的?

针对第一个问题,有这样的解释:

对于跨越多个字节的对象,一般它所占的字节都是连续的, 它的地址等于它所占字节最低地址.(链表可能是个例外, 但链表的地址可看作链表头的地址).

比如: int x, 它的地址为0x100. 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节.

上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定. 考虑一个W位的整数. 它的各位表达如下:

[Xw-1, Xw-2, ... , X1, X0]

它的MSB (Most Significant Byte, 最高有效字节)为[Xw-1, Xw-2, ... Xw-8]; LSB (Least Significant Byte, 最低有效字节)为 [X7, X6, ..., X0]. 其余的字节位于MSB, LSB之间.

LSB和MSB谁位于内存的最低地址, 即谁代表该对象的地址? 这就引出了大端(Big Endian)与小端(Little Endian)的问题。

如果LSB在MSB前面, 既LSB是低地址, 则该机器是小端; 反之则是大端. DEC (Digital Equipment Corporation, 现在是Compaq公司的一部分)和Intel的机器一般采用小端. IBM, Motorola, Sun的机器一般采用大端. 当然, 这不代表所有情况. 有的CPU即能工作于小端, 又能工作于大端, 比如ARM, PowerPC, Alpha. 具体情形参考处理器手册.

举个例子来说名大小端:   比如一个int x, 地址为0x100, 它的值为0x1234567. 则它所占据的0x100, 0x101, 0x102, 0x103地址组织如下图:

0x01234567的MSB为0x01, LSB为0x67. 0x01在低地址(或理解为"MSB出现在LSB前面,因为这里讨论的地址都是递增的), 则为大端; 0x67在低地址则为小端.

认清这样一个事实: C中的数据类型都是从内存的低地址向高地址扩展,取址运算"&"都是取低地址.

在C++中,内存被分为五个块: 堆,栈,自由存储区,全局/静态变量区和常量存储区.

栈: 是编译器在需要的时候分配,在不需要的时候自动清除的一块区域.通常用来存储局部变量,形式参数.

堆: 一般是由new分配的区域,编译器不会去管这块存储区域,主要是由程序员控制,一个new对应一个delete.如果用new分配了一块内存而没有进行释放的话,只有等到进程结束的时候被系统自动收回.

自由存储区:  由malloc分配的区域,和堆十分相似,不同的地方是它的释放用free.

全局/静态变量区: 用来存储全局变量和静态变量.

常量存储区: 这是一块很特殊的区域,不允许程序员修改里边的量。

计算机中的物理地址与内存相关推荐

  1. 【计算机系统】 信息在计算机中的表示和内存地址与空间的简单理解

    1. 信息在计算机系统中的表示 我们知道,信息在计算机系统中是以二进制的方式进行传送,存储的.那么信息在计算机系统中是如何表示的呢?在这里可分为数值信息和非数值信息两个方面进行讨论. 数据信息分类示意 ...

  2. 在计算机中存储器是由内存和外存的区别,简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点?...

    简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点? 答案:4  信息版本:手机版 解决时间 2019-10-06 02:44 已解决 2019-10-05 13:10 简述计算机的 ...

  3. 算盘在计算机中的应用,中国大学MOOC: 算盘、计算机都是信息处理的工具。

    答案 查看答案 解析: [解析题]当前,应用计算机解决实际问题的能力主要体现为能够熟练使用OFFICE和网页制作工具操作计算机. [解析题]多媒体计算机中的媒体信息是指( ) [解析题]在计算机科学中 ...

  4. 计算机的物理地址概念,物理地址与内存空间的概念问题

    物理地址,相当于门牌号,内存上的每个内存单位都有自己的物理地址,这个地址会对应相应的内存空间. 为什么物理地址用16进制呢? 1.计算机硬件是0101二进制的,16进制刚好是2的倍数,更容易表达一个命 ...

  5. 计算机中rom,计算机中rom指的是内存还是外存

    计算机中rom指的是内存还是外存 发布时间:2021-02-25 14:49:19 来源:亿速云 阅读:93 作者:小新 这篇文章将为大家详细讲解有关计算机中rom指的是内存还是外存,小编觉得挺实用的 ...

  6. 计算机中cpu是不是内存,电脑卡是cpu还是内存

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 电脑卡和CPU.内存都有关系,可能是CPU性能过低,需要更换性能更好的CPU.也可能是内存太小,需要升级内存. 中央处理器(CPU ...

  7. 程序在计算机中是如何运行的?搞懂内存和CPU(*)

    1.程序在计算机中是如何运行的? 运算器 控制器 存储器 输入设备 输出设备 在计算机中,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存,外部存储器主要就是磁盘,磁盘又 ...

  8. 在 1G 内存的计算机中能否 malloc(1.2G)

    作者:牛客192239号 链接:在1G内存的计算机中能否malloc(1.2G)?_技术交流_牛客网 来源:牛客网 问题:在 1G 内存的计算机中能否 malloc(1.2G) ?为什么? [解答要点 ...

  9. 计算机中小数如何储存,小数在内存中是如何存储的?

    小数在内存中是如何存储的? 文本关键字:小数.float.double.浮点数.精度 一.IEEE 754(二进制浮点数算术标准) 在学习进制转换时,我们了解到:我们经常使用的十进制数是转换为二进制进 ...

最新文章

  1. Spring Cloud中Hystrix仪表盘与Turbine集群监控
  2. 搭建“双11”大型网站架构必须掌握的 5 个核心知识
  3. 【转载】Could not create the view: An unexpected exception was thrown.问题解决
  4. xfce的面板调节声音大小的按钮不见了。
  5. 往事历历在目--我的2009年工作总结
  6. 讨论:多核CPU+ASIC的防火墙在以后是发展方向吗?
  7. 构造体中变量后面的冒号_类型在变量前面还是后面,终于有答案了
  8. 线性代数及其应用(part2)--特征方程
  9. 台式机安装黑苹果-新手教程
  10. 【无头浏览器】谷歌无头浏览器的几行代码简单设置?
  11. 基于Java毕业设计智能旅游电子票务系统演示录像2020源码+系统+mysql+lw文档+部署软件
  12. AxGlyph矢量绘图软件
  13. U3D(Unity) 实现电路解密、通水管游戏
  14. activity 所需jiar包
  15. redisson 主从模式Unsupported protocol version 50_强推七本欢喜冤家甜文,男女主从互怼到互宠,超甜超撩超过瘾!...
  16. gnuplot入门教程
  17. mongorepository查询条件_springboot jpa + mongodb实现多条件查询数据
  18. 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
  19. c++ 实现线索二叉树
  20. 【读书笔记】打开心智

热门文章

  1. Set中的HashSet和TreeSet特点及用法
  2. 华为防火墙(USG)的管理方式配置
  3. HDU - 4082 Hou Yi‘s secret (计算几何)
  4. Android - kotlin 协程极简入门
  5. 题目 1878: 蓝桥杯2017年第八届真题-青蛙跳杯子
  6. WEB服务(Web Servicrs)| 免费WEB服务 | 商业WEB服务
  7. MYSQLWorkbench看数据库ER图
  8. penssl-devel 安装依赖
  9. LintCode 433. 岛屿的个数 JavaScript算法
  10. 订单贡献率10%,京东个性化推荐系统持续优化的奥秘