数据总线和寻址内存混淆

时间:2016-07-11 09:06:15

标签: c memory cpu addressing databus

我已经了解到8086 CPU有16位数据总线,Pentium CPU有32位数据总线,这意味着每个内存地址都有数据总线大小。

例如:

16bit = 2^16 = 65,536 
binary 0000 0000 0000 0000 ~ 1111 1111 1111 1111
hex    0000 0000 ~ FFFF FFFF
dec    000,000 ~ 65,535

65,536 / 1024 = 64 so can be 64kbyte of maximum memory address.
like 0x 0000,0000 ~ 0x FFFF,FFFF  


32bit = 2^32 = 4,294,967,296
binary 0000 0000 0000 0000 0000 0000 0000 0000 
~ 1111 1111 1111 1111 1111 1111 1111 1111
hex    0000 0000 0000 0000 ~ FFFF FFFF FFFF FFFF
dec    0,000,000,000 ~ 4,294,967,296

4,294,967,296 / 1024 / 1024 = 4 so can be 4mb of maximum memory address 
like 0x 0000,0000,0000,0000 ~ 0x FFFF,FFFF,FFFF,FFFF

我说错了吗?我认同。但在C编程中:

int arr[2];
printf("%p %p \n", &arr[0],&arr[1]);
-----------------------------------
0x 7fff5c474b20,  0x 7fff5c474b24  (this is 64bit addressing)

我知道整数是4个字节。 &arr[1]-&arr[0]的大小为0x4,这意味着每个地址只保存8位数据总线。

如果CPU能保持8bit以上,为什么C只能保持8bit?

2 个答案:

答案 0 :(得分:5)

Oups ......事情并不完全是你所写的 - 我谈的是8086(我已经足够老了,已经和它一起工作了......)。您可以在wikipedia

上找到更多有关它的参考资料
  • 数据总线是16位宽,这意味着可以在一次操作中传输2个字节
  • 地址但是是20位宽,这意味着内存地址在0 - 0xFFFFF或1M
  • 范围内

基于8086使用的寻址模式:地址由段(16位寄存器)和偏移量表示,实际地址为segment * 16 + offset - 顺便说一下,地址有不同的表示形式,例如0x20010可以表示为2000 :0010或2001:0000 1FFF:0020

并且...... 8086上没有64位寻址模式!

现在对于你的实际问题,C指定最小的可寻址内存应该是char或byte,并且单个char应包含所用字母表中的任何字符是C源(大写和小写字母,数字和一些符号至少7位)。通用处理器(我所知道的)使用8位字节寻址,与总线大小无关。这意味着连续的地址是连续字节的地址。

数据总线为16,32或64位宽的事实只允许单个存储器访问在单个操作上分别加载2,4或8个字节。某些处理器(例如ARM)需要正确对齐多字节存储器访问:例如,您只能在偶数地址读取16位字,并且任何尝试从奇数地址读取16位工作都将导致处理器陷阱

请记住,除了简单之外,什么都不会强迫处理器设计人员拥有相同大小的数据总线和地址总线。

答案 1 :(得分:2)

在x86上,每个不同的地址都会寻址8位的字节

数据总线宽度意味着处理器可以在 parallel 中获取那么多位。实际上奔腾处理器有一个64位数据总线(过载处理器可以安装到486个主板上但是有32位总线),因此它们可以同时获取8个连续的8位字节。

例如,如果处理器发出地址0x00001230的内存读取,它可以同时将地址0x00001230到0x00001237(8字节)的字节读取到其内部缓存中。