内存单元的物理地址是由其所处的地址总线上的位置决定的,机器安装完成后,其物理地址是固定的、不变的,并不是由CPU分配的。
cpu只需要告诉控制器它要存取的内存单元地址;要到这个地址单元则交给成组的地址译码器(如74LS138)实现。
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始⼀直到
可⽤物理内存的最⾼端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终⽤在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。
逻辑地址:CPU所⽣成的地址。逻辑地址是内部和编程使⽤的、并不唯⼀。例如,你在进⾏C语⾔指针编程中,可以读取指针变量本⾝值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相⼲。
这⾥有⼀个可能会和你的认识冲突的事实:我们总是认为存储空间只是指内存(RAM),就是程序⼀直在读写的那个东西,实际上⼤部分处理器的读写请求也确实是被北桥转发给了内存模块,但并不是所有的。物理存储地址空间同时也被⽤来和⼀些主板上的其他设备通信(这种通信被称为),⽐如显卡和⼤部分的PCI设备(扫描仪、SCSI设备之类的),还有存储有BIOS的闪存。
当北桥接收到⼀个物理地址请求,北桥会决定这个请求该转向哪⾥:内存?还是显卡?北桥根据存储地址映射表来决定。对物理存储地址的每⼀个区域,存储地址映射表都知道究竟是哪⼀个设备拥有这些地址。⼤部分的地址都映射到内存中,但当地址不属于内存时,存储地址映射表会告诉芯⽚组哪个
设备该响应这些地址的请求。这种将地址分配到其他设备的映射导致了在⽼式PC存储中640KB到1MB之间的空洞,⽽保留给显卡和PCI设备的地址⼜造城了⼀个更⼤的空洞,这也是为什么32位操作系统。在Linux中/proc/iomem⽂件清楚的列出了这些被映射的地址。下图展⽰了Intel PC的前4GB地址空间中典型的映射关系:
实际的地址和范围取决于电脑中使⽤的主板和设备,不过⼤部分的Core 2系统和上图中展⽰的⾮常相似。所有棕⾊的区域都不属于内存,这⾥要明确⼀点,这⾥所说的地址是在主板总线中实际的物理地址,在CPU内部(例如程序中的运⾏、读写地址)使⽤的地址都是逻辑地址,并且在实际访问之前都必须被CPU转换成物理地址。
地址译码器:就是把输⼊的⼆进制数地址,指向相应的物理空间。这实际上就是⼀个转换或者翻译的过程。
四级准考证号查询地址译码器是在内存内部的,内存除了存储单元外,还包括:读写电路、地址译码器。
晴天歌词地址译码器,就是cpu通过地址总线给内存⼀个地址说:我要读这个地址,或者写这个地址了。内存中的地址译码器负责到这个地址,然后通过读写电路进⾏读写。
你和我的倾城时光 演员表存储器地址译码有两种⽅式,通常称为单译码与双译码。 (1) .单译码 单译码⽅式⼜称字结构,适⽤于⼩容量存储器。 (2) .双译码 在双译码结构中,将地址译码器分成两部分,即⾏译码器 ( ⼜叫 X 译码器 ) 和列译码器 ( ⼜叫 Y 译码器 ) 。 X 译码器输出⾏地址选择信号, Y 译码器输出列地址选择信号。⾏列选择线交叉处即为所选中的内存单元,这种⽅式的特点是译码输出线较少。
袁佳怡献b门全套图
为了读取特定单元格的数据,在寻址时要⾸先确定是哪⼀个bank,然后在这个选定的bank中进⾏⾏列的寻址。在实际⼯作中,bank的地址与相应的⾏地址是同时发出的,此时这个命令称之为"⾏有效"或者“⾏激活”。在此之后,发送列地址寻址命令和具体的操作命令(读或写),这两个命令也是同时发送的。⾏列地址是可以复⽤的,⼀般来说DDR芯⽚的地址线为A0~A15,低地址线会被⾏列复⽤。以
K4B4G1646B 4Gbit 256MB x 16bit内存芯⽚为例,A0~A14⽤做⾏地址,A0~A9⽤做列地址,这款芯⽚同时含有B0~B2⽤来选择bank。
在实际⼯作中,Bank地址与相应的⾏地址是同时发出的,此时这个命令称之为“⾏激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以⼀般都会以“读/写命令”来表⽰列寻址。根据相关的标准,从⾏有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS⾄CAS延迟,RAS就是⾏地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为⾏选通周期。
下⾯来看⼀个具体例⼦。
该例⼦中,⽤两个16bit的DDR3内存拼成了⼀个32bit的DDR3.
每块16bit DDR3的⼤⼩为512M Bytes.
看看硬件上连接:
第⼀⽚16bit DDR3的BA0, BA1, BA2连接到了CPU的BA0, BA1, BA2。
第⼆⽚16bit DDR3的BA0, BA1, BA2也连接到了CPU的BA0, BA1, BA2。
第⼀⽚16bit DDR3的A0~A14连接到了CPU的A0~A14。
第⼆⽚16bit DDR3的A0~A14连接到了CPU的A0~A14。
第⼀⽚16bit DDR3的D0~D15连接到了CPU的D0~D15。
第⼆⽚16bit DDR3的D0~D15连接到了CPU的D16~D31。
分析下该实例。
bank address有三个bit,所以单个16bit DDR3内部有8个bank.
表⽰⾏的有A0~A14,共15个bit,说明⼀个bank中有2^15个⾏。
表⽰列的有A0~A9,共10个bit,说明⼀个bank中有2^10个列。
来看看单块16bit DDR3容量:
2^3*2^15*2^10=2^28=256M
我们的内存是512M,到这⼉怎么变成256M了?被骗了?
呵呵,当然没有。
忘了我们前⾯⼀直提到的16bit。
16bit是2个byte对吧。
访问⼀个地址,内存认为是访问16bit的数据,也就是两个字节的数据。
256M个地址,也就是对应512M的数据了。
每⼀块16bit DDR3中有8个bank,2^15个row,2^10个column。也就是有256M个地址。
看前⾯的连线可知,两块16bit DDR3的BA0~BA2和D0~D14其实是并⾏连接到CPU。
也就是说,CPU其实认为只有⼀块内存,访问的时候按照BA0~BA2和D0~D14给出地址。
两块16bit DDR3都收到了该地址。
它们是怎么响应的呢?
两块内存都是16bit,它们收到地址之后,给出的反应是要么将给定地址上2个字节送到数据线上,要么是将数据线上的两个字节写⼊到指定的地址。
再看数据线的连接,第⼀⽚的D0~D15连接到了CPU的D0~D15,第⼆⽚的D0~D15连接到了CPU的D16~D31。
CPU认为⾃⼰访问的是⼀块32bit的内存,所以CPU每给出⼀个地址,将访问4个字节的数据,读取/写⼊。
关婷娜与赵本山这4字节数据对应到CPU的D0~D31,⼜分别被连接到两⽚内存的D0~D15,这样⼀个32bit就被拆成了两个16bit.
反过来,也就是两个16bit组成了⼀个32bit.杨幂的胸为什么变大了
CPU访问的内存地址有256M个,每访问⼀个地址,将访问4个字节,这样CPU能访问的内存即为1G.
参考⽂章:
发布评论