计算机中的物理地址与内存
这两天有个问题一直萦绕着,计算机中的物理地址和内存地址,虚地址究竟是怎么回事?地址是怎样分配的呢?
翻了下操作系统课本,恩,晚上回去看看存储器管理,虚拟存储器,磁盘存储器管理这几章。隐约还记得微机原理学的寄存器寻址,现在网上看看,搜集一下待做整理。
昨天看到论坛上有人问,调程序的时候编译器分配的是物理地址还是虚地址(差不多是这意思),看到大家基本回答是说虚地址,操作系统之上的根本就不可能接触物理地址,而且可用的物理地址是相当混乱的,必须由操作系统整理映射。(差不多吧?个人认为应该没错)刚刚搜索的结果有说:程序里指针用的地址都是些虚拟地址,而且其范围完全可以大于你拥有的内存大小。当要执行这些程序段落时,系统首先要把机器码装进内存,这里就有个把虚拟地址映射到物理地址的问题。
在一台 计算机 中,计算机系统为了唯一的标示一个内存单元,操作系统会给每一个内存单元编上一个绝对的号,计算机系统就通过这个编号来定为每一个内存单元的物理位置,这个编号称为内存的物理地址 。
针对程序编译过程中的地址问题:
大部分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. 信息在计算机系统中的表示 我们知道,信息在计算机系统中是以二进制的方式进行传送,存储的.那么信息在计算机系统中是如何表示的呢?在这里可分为数值信息和非数值信息两个方面进行讨论. 数据信息分类示意 ...
- 在计算机中存储器是由内存和外存的区别,简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点?...
简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点? 答案:4 信息版本:手机版 解决时间 2019-10-06 02:44 已解决 2019-10-05 13:10 简述计算机的 ...
- 算盘在计算机中的应用,中国大学MOOC: 算盘、计算机都是信息处理的工具。
答案 查看答案 解析: [解析题]当前,应用计算机解决实际问题的能力主要体现为能够熟练使用OFFICE和网页制作工具操作计算机. [解析题]多媒体计算机中的媒体信息是指( ) [解析题]在计算机科学中 ...
- 计算机的物理地址概念,物理地址与内存空间的概念问题
物理地址,相当于门牌号,内存上的每个内存单位都有自己的物理地址,这个地址会对应相应的内存空间. 为什么物理地址用16进制呢? 1.计算机硬件是0101二进制的,16进制刚好是2的倍数,更容易表达一个命 ...
- 计算机中rom,计算机中rom指的是内存还是外存
计算机中rom指的是内存还是外存 发布时间:2021-02-25 14:49:19 来源:亿速云 阅读:93 作者:小新 这篇文章将为大家详细讲解有关计算机中rom指的是内存还是外存,小编觉得挺实用的 ...
- 计算机中cpu是不是内存,电脑卡是cpu还是内存
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 电脑卡和CPU.内存都有关系,可能是CPU性能过低,需要更换性能更好的CPU.也可能是内存太小,需要升级内存. 中央处理器(CPU ...
- 程序在计算机中是如何运行的?搞懂内存和CPU(*)
1.程序在计算机中是如何运行的? 运算器 控制器 存储器 输入设备 输出设备 在计算机中,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存,外部存储器主要就是磁盘,磁盘又 ...
- 在 1G 内存的计算机中能否 malloc(1.2G)
作者:牛客192239号 链接:在1G内存的计算机中能否malloc(1.2G)?_技术交流_牛客网 来源:牛客网 问题:在 1G 内存的计算机中能否 malloc(1.2G) ?为什么? [解答要点 ...
- 计算机中小数如何储存,小数在内存中是如何存储的?
小数在内存中是如何存储的? 文本关键字:小数.float.double.浮点数.精度 一.IEEE 754(二进制浮点数算术标准) 在学习进制转换时,我们了解到:我们经常使用的十进制数是转换为二进制进 ...
最新文章
- Spring Cloud中Hystrix仪表盘与Turbine集群监控
- 搭建“双11”大型网站架构必须掌握的 5 个核心知识
- 【转载】Could not create the view: An unexpected exception was thrown.问题解决
- xfce的面板调节声音大小的按钮不见了。
- 往事历历在目--我的2009年工作总结
- 讨论:多核CPU+ASIC的防火墙在以后是发展方向吗?
- 构造体中变量后面的冒号_类型在变量前面还是后面,终于有答案了
- 线性代数及其应用(part2)--特征方程
- 台式机安装黑苹果-新手教程
- 【无头浏览器】谷歌无头浏览器的几行代码简单设置?
- 基于Java毕业设计智能旅游电子票务系统演示录像2020源码+系统+mysql+lw文档+部署软件
- AxGlyph矢量绘图软件
- U3D(Unity) 实现电路解密、通水管游戏
- activity 所需jiar包
- redisson 主从模式Unsupported protocol version 50_强推七本欢喜冤家甜文,男女主从互怼到互宠,超甜超撩超过瘾!...
- gnuplot入门教程
- mongorepository查询条件_springboot jpa + mongodb实现多条件查询数据
- 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
- c++ 实现线索二叉树
- 【读书笔记】打开心智
热门文章
- Set中的HashSet和TreeSet特点及用法
- 华为防火墙(USG)的管理方式配置
- HDU - 4082 Hou Yi‘s secret (计算几何)
- Android - kotlin 协程极简入门
- 题目 1878: 蓝桥杯2017年第八届真题-青蛙跳杯子
- WEB服务(Web Servicrs)| 免费WEB服务 | 商业WEB服务
- MYSQLWorkbench看数据库ER图
- penssl-devel 安装依赖
- LintCode 433. 岛屿的个数 JavaScript算法
- 订单贡献率10%,京东个性化推荐系统持续优化的奥秘