数据总线和解决内存混乱
data bus and addressing memory confusion
我学过8086CPU有16bit的数据总线,PentiumCPU有32bit的数据总线,也就是说每个内存地址都有数据总线的大小
例如:
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?
在 x86 上,每个不同的 address 寻址 8 位的 byte。
数据总线宽度意味着处理器可以并行获取那么多位。实际上奔腾处理器有一个 64 位数据总线(你可以安装到 486 主板的超速处理器虽然有 32 位总线),所以它们可以同时获取 8 个连续的 8 位字节。
例如,如果处理器发出地址 0x00001230 的内存读取,它可以同时将地址 0x00001230 到 0x00001237(8 字节)的字节提取到其内部缓存中。
糟糕...事情与您所写的不完全相同 - 我说的是 8086(我已经足够大了,可以使用它...)。您将在 wikipedia)
上找到更多关于它的参考资料
- 数据总线是 16 位宽,这意味着它可以在一次操作中传输 2 个字节
- 地址但是是 20 位宽,这意味着内存地址在 0 - 0xFFFFF 或 1M
范围内
使用基于 8086 的寻址模式:地址由段(16 位寄存器)和偏移量表示,实际地址为 segment * 16 + offset
- 顺便说一句,地址有不同的表示形式,例如 0x20010 可以表示作为 2000:0010 或 2001:0000 1FFF:0020
而且...在 8086 上没有 64 位寻址模式!
现在对于您的实际问题,C 指定最小的可寻址内存应为字符或字节,并且单个字符应包含来自 C 源所使用的字母表中的任何字符(大写和小写字母、数字、和一些符号,所以至少 7 位)。普通处理器(据我所知)使用 8 位字节寻址,与总线大小无关。这意味着连续地址是连续字节的地址。
数据总线是 16、32 或 64 位宽这一事实仅允许一次内存访问在一次操作中分别加载 2、4 或 8 个字节。某些处理器(例如 ARM)需要多字节内存访问才能正确对齐:例如,您只能在偶数地址上读取 16 位字,任何从奇数地址读取 16 位字的尝试都会导致处理器陷阱.
请记住,没有什么(除了简单性)会迫使处理器设计人员拥有相同大小的数据总线和地址总线。
我学过8086CPU有16bit的数据总线,PentiumCPU有32bit的数据总线,也就是说每个内存地址都有数据总线的大小
例如:
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?
在 x86 上,每个不同的 address 寻址 8 位的 byte。
数据总线宽度意味着处理器可以并行获取那么多位。实际上奔腾处理器有一个 64 位数据总线(你可以安装到 486 主板的超速处理器虽然有 32 位总线),所以它们可以同时获取 8 个连续的 8 位字节。
例如,如果处理器发出地址 0x00001230 的内存读取,它可以同时将地址 0x00001230 到 0x00001237(8 字节)的字节提取到其内部缓存中。
糟糕...事情与您所写的不完全相同 - 我说的是 8086(我已经足够大了,可以使用它...)。您将在 wikipedia)
上找到更多关于它的参考资料- 数据总线是 16 位宽,这意味着它可以在一次操作中传输 2 个字节
- 地址但是是 20 位宽,这意味着内存地址在 0 - 0xFFFFF 或 1M 范围内
使用基于 8086 的寻址模式:地址由段(16 位寄存器)和偏移量表示,实际地址为 segment * 16 + offset
- 顺便说一句,地址有不同的表示形式,例如 0x20010 可以表示作为 2000:0010 或 2001:0000 1FFF:0020
而且...在 8086 上没有 64 位寻址模式!
现在对于您的实际问题,C 指定最小的可寻址内存应为字符或字节,并且单个字符应包含来自 C 源所使用的字母表中的任何字符(大写和小写字母、数字、和一些符号,所以至少 7 位)。普通处理器(据我所知)使用 8 位字节寻址,与总线大小无关。这意味着连续地址是连续字节的地址。
数据总线是 16、32 或 64 位宽这一事实仅允许一次内存访问在一次操作中分别加载 2、4 或 8 个字节。某些处理器(例如 ARM)需要多字节内存访问才能正确对齐:例如,您只能在偶数地址上读取 16 位字,任何从奇数地址读取 16 位字的尝试都会导致处理器陷阱.
请记住,没有什么(除了简单性)会迫使处理器设计人员拥有相同大小的数据总线和地址总线。