c - 数据总线和解决内存困惑

标签 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 可以容纳超过 8 位,为什么 C 只能容纳 8 位?

最佳答案

Oups...事情与您所写的不完全相同 - 我说的是 8086(我已经足够大了,可以使用它...)。您可以在 wikipedia 上找到更多引用资料。 )

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

基于 8086 使用的寻址模式:地址由段(16 位寄存器)和偏移量表示,实际地址为 段 * 16 + 偏移量 - 顺便说一句,地址有不同的表示例如 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 位字的尝试都会导致处理器陷阱.

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

关于c - 数据总线和解决内存困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38303050/

相关文章:

performance - 哪些简单的更改对您的 Delphi 程序进行了最大的改进

hardware - 处理器在等待主内存获取时做什么

windows - 在特定参数上启用/禁用 USB 端口

java - 即使对于高堆大小分配,Jmeter 也会测试内存不足错误

function - 对 CPU 施加压力的良好数学函数

c - "passing argument 1 of ' goodString ' makes pointer from integer without a cast"编译器错误-C

c - 从文件中逐行读取已知结构但长度未知

c++ - 帮助实现 Diamond Square 算法

c - 如何对预处理器(宏)进行类型转换以输出 int

wpf - 查找 Windows 应用程序的真实内存占用量