对于 4G 内存,有 4 * 1024 * 1024 * 1024 * 8 = 2^(32+3) 位。我的问题是 32 位 PC 如何访问 4G 内存。我能想到的是“一个字节是存储单元,一个字节不能存储一个数据”。这个对吗?
另一个问题是:在这样的 PC 中,指针的大小是否总是 32 位?这对我来说似乎是合理的,因为我们有 2^32 个存储单元来存储数据。但是在这个答案和下一个他们的评论中,这被认为是错误的。如果是错的,为什么?
对于 4G 内存,有 4 * 1024 * 1024 * 1024 * 8 = 2^(32+3) 位。我的问题是 32 位 PC 如何访问 4G 内存。我能想到的是“一个字节是存储单元,一个字节不能存储一个数据”。这个对吗?
另一个问题是:在这样的 PC 中,指针的大小是否总是 32 位?这对我来说似乎是合理的,因为我们有 2^32 个存储单元来存储数据。但是在这个答案和下一个他们的评论中,这被认为是错误的。如果是错的,为什么?
通过读取包含它的字节的地址、修改字节并在必要时回写来访问各个位。
在某些体系结构中,最小的可寻址单元是双字,在这种情况下,不能“按原样”访问单个字节。从理论上讲,可以设计一种体系结构,该体系结构可以使用 32 位唯一地址来寻址 16 GB 的内存。几年前也发生过类似的事情,当时硬盘的可寻址单元被限制为 2^28 个 512 字节左右的扇区。
说 PC 有 32 位指针并不是完全错误的。这只是一些旧信息,因为较新的型号是内部 64 位系统,并且可以根据操作系统访问高达 2^48 字节的内存。目前大多数现有的 PC 都是 32 位的,对此无能为力。
好吧,StuartLC 仍然在讨论寻呼。即使在当前的 32 位系统中,也可以使用旧段寄存器来使用 48 位寻址。(不记得是否存在段寄存器低三位为零的限制......)但无论如何,这将允许 2^45 个字节的单个地址,其中只有一小部分可能同时在主存储器中. 如果开发了支持该寻址模式的操作系统,则可能会为指针分配完整的 64 位。就像今天使用 64 位处理器一样。
我的问题是32位PC如何访问4G内存
您可能会混淆地址总线(可寻址内存)和处理器寄存器的大小。这个超级用户帖子详细介绍了这些差异。
分页是一种通常用于允许超出操作系统能力大小的内存寻址的技术,例如,参见PAE
指针总是大小为 32 位吗
不,不一定——例如在 16 位 DOS 和 Windows 上,指针也可能与段相关。
不能一点点存储数据吗?
是的,您可以,例如在 C 中,可以在结构中进行位打包,尽管以性能和可移植性为代价。
如今,性能变得更加重要,出于性能原因,编译器通常会尝试将数据与其机器字长对齐。