【问题标题】:data bus and addressing memory confusion数据总线和寻址内存混淆
【发布时间】:2016-07-11 09:06:15
【问题描述】:

我了解到 8086 CPU 有 16 位数据总线,奔腾 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?

【问题讨论】:

  • 好吧,实际上你混淆了一些非常糟糕的东西。您不必写入完整的数据段,您可以写入单个字节(或读取它们)。地址之间的差异是 4 个字节(这意味着 int 在该平台上是 32 位的)。
  • 我没有得到 8 位的东西,因为 4 个字节是 32 位。 (每字节 8 位并不是那么具体)
  • 你还在做进一步的基础转换错误(base 16 中的 32 位地址是 0000 0000 到 FFFF FFFF)
  • 指针可以是任意宽度。它们可以是 32 位,甚至可以是 16 位,这取决于您实际编译程序的位置。此外,C 程序和机器代码之间的转换也很重要。
  • deer@Paul Stelian,是的 32 位 0-FFFF FFFF,谢谢您的纠正。如果 int i = 10;定位在内存地址0xaabb0000,它真的0xaabb0000 = 0000 0000 0xaabb0002 = 0000 0000 0000 0000 0000 0000 0000 0000 0000,就像使用4byte,但是什么我的点是0xaabb0000 can holl full 0000 0000 0000 1010?不能容纳32位数据总线?

标签: c memory cpu addressing databus


【解决方案1】:

Oups...事情与您所写的不完全一样 - 我说的是 8086(我已经足够大,可以使用它...)。你会在wikipedia上找到更多关于它的参考资料)

  • 数据总线是 16 位宽,这意味着可以在一次操作中传输 2 个字节
  • 地址,但为 20 位宽,这意味着内存地址在 0 - 0xFFFFF 或 1M 范围内

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

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

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

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

请记住,没有什么(除了简单性)会迫使处理器设计人员拥有相同大小的数据总线和地址总线。

【讨论】:

  • 鹿@Serge Ballesta。我知道你在说什么,那就是管理内存。我的观点是真正的内存寻址和数据总线。
  • @JeungwooPark:我说的是数据总线和地址总线是不同的对象,可能有不同的大小。而老版本的 BSD 或 Linux 支持 8086,所以这与 MS/DOS 无关。但请看我的编辑
  • @Serge Ballesta。每个内存地址可以有 32 位或 4 字节的数据。整数是4字节。为什么c程序使用4个内存地址?例如)int a=10; 0x[][][][][][][]0 = 0000 1010, 0x[][][][][][][]1 = 0000 0000, 0x[][][][][ ][]2= 0000 0000, 0x[][][][][][][]3 = 0000 0000 ;甚至像 0x[][][][][][][]0 这样的内存地址也可以有 32 位或 4 字节的数据。
【解决方案2】:

在 x86 上,每个不同的 address 寻址一个 8 位的 byte

数据总线宽度意味着处理器可以并行获取那么多位。实际上奔腾处理器有一个 64 位数据总线(你可以安装到 486 母板上的超速处理器有 32 位总线),所以它们可以同时获取 8 个连续的 8 位字节。

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

【讨论】:

  • deer@Antti Haapala ,是的,奔腾有 64 位数据总线,但有 32 位寄存器。我被数据总线弄错了。
猜你喜欢
  • 2021-05-11
  • 2015-07-01
  • 2012-12-24
  • 2013-09-19
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
相关资源
最近更新 更多