《计算机组成原理》----对内存对齐的理解

竹影半墙 2014-09-27 07:46:47

Figure 7. 线选法访问存储器

现用4块Figure 7中的存储器m。简单组成存储字长为32位(一行有32位)的存储器M,使此存储器的地址线有16根,重新编号为A0A1…A15。数据线32根,重新编号为D0D1…D31。为Figure 7中的存储块加一个片选信号。当给地址线一个值并给对应的片选信号时,就访问M的一个存储字长(某整行)、16位(连续的两个m被选中)、8位(某个m被选中)二进制串,再通过数据线输出就得到对应内存中的值。

在C语言程序中,假设有一个int类型(32bit)变量i,若它刚好被分配到M的某一行之上,则只需要往地址线A0A1…A15输一次i的地址就可以访问到i。若i的各字节被分配到相邻的两行之上(如两低字节在第一行,两高字节在第二行),则需要往地址线上先输入第一行的地址访问到i在第一行的内容,再往地址线上输入第二行地址访问到i在第二行的内容,再将两次访问的内容处理后才能得到i的内容。这就使得访问i需要访问M两次。

观察存储器M的结构(第一行地址为0),只要将变量的地址分配到此变量所占内存大小(以字节为单位)的整数倍上,那么此变量的所有字节都会处于内存M的同一行,只需要往地址线上输入一次地址即只访问一次主存就可以得到此变量。这样的地址被称为此变量的边界。在C中使用结构体时,结构体内的元素(变量)的地址会被自动分配到其边界之上,这样的现象称为边界对齐(内存对齐)。
...全文
658 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 2 楼 truelance 的回复:
LZ你的问题是什么?
求帮忙找错
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 2 楼 truelance 的回复:
LZ你的问题是什么?
求帮忙找错
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 2 楼 truelance 的回复:
LZ你的问题是什么?
求帮忙找错
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 7 楼 misskissC 的回复:
[quote=引用 6 楼 truelance 的回复:] 4个这样的存储器,要么4位地址线32位数据线,要么16位地址线8位数据线。没法支持16位地址线32位数据线。
是的。4 x (2^4 x 8 ) != 2^16 x 32[/quote] 将其M改为4地址线32位数据线。
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 6 楼 truelance 的回复:
4个这样的存储器,要么4位地址线32位数据线,要么16位地址线8位数据线。没法支持16位地址线32位数据线。
是的。4 x (2^4 x 8 ) != 2^16 x 32
熊熊大叔 2014-09-28
  • 打赏
  • 举报
回复
4个这样的存储器,要么4位地址线32位数据线,要么16位地址线8位数据线。没法支持16位地址线32位数据线。
竹影半墙 2014-09-28
  • 打赏
  • 举报
回复
引用 9 楼 lovesmiles 的回复:
[quote=引用 6 楼 truelance 的回复:] 4个这样的存储器,要么4位地址线32位数据线,要么16位地址线8位数据线。没法支持16位地址线32位数据线。
应该也没有到16位地址线,4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位的数据。 如果是要一次读出32位的数据,地址线不用增加,片选中默认打开,只要4条就可以了。 观察存储器M的结构(第一行地址为0),只要将变量的地址分配到此变量所占内存大小(以字节为单位)的整数倍上 这句也有点问题,应该是分配到以字为单位(32bit)的地址上才合理。 [/quote] 1. 应该也没有到16位地址线,4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位,16位,32位的数据。 2. 观察存储器M的结构(第一行地址为0),只要将变量的地址分配到此变量所占内存大小(以字节为单位)的整数倍上 这句也有点问题,应该是分配到以字为单位(32bit)的地址上才合理。 占16位的变量只需要分配到以半字(16位)的地址上即可。
勤奋的小游侠 2014-09-28
  • 打赏
  • 举报
回复
引用 6 楼 truelance 的回复:
4个这样的存储器,要么4位地址线32位数据线,要么16位地址线8位数据线。没法支持16位地址线32位数据线。
应该也没有到16位地址线,4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位的数据。 如果是要一次读出32位的数据,地址线不用增加,片选中默认打开,只要4条就可以了。 观察存储器M的结构(第一行地址为0),只要将变量的地址分配到此变量所占内存大小(以字节为单位)的整数倍上 这句也有点问题,应该是分配到以字为单位(32bit)的地址上才合理。
熊熊大叔 2014-09-27
  • 打赏
  • 举报
回复
LZ你的问题是什么?
饭凉凉 2014-09-27
  • 打赏
  • 举报
回复
从物理结构上理解对齐。

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧