gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:49:45 24 4
gpt4 key购买 nike

我了解到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com