【发布时间】:2011-01-18 14:08:13
【问题描述】:
十六进制内存地址是否代表了整个内存中的位置?
例如4 gb ram,有一个内存地址。它是否指向数据开始的位置(以字节为单位)?例如2.1 GB。
在数据加载到内存之前,内存地址在硬盘上是如何工作的?
是否有过从内存中获取部分数据而从磁盘中获取其他数据的情况?位置如何区分?
谢谢
【问题讨论】:
标签: memory computer-science byte
十六进制内存地址是否代表了整个内存中的位置?
例如4 gb ram,有一个内存地址。它是否指向数据开始的位置(以字节为单位)?例如2.1 GB。
在数据加载到内存之前,内存地址在硬盘上是如何工作的?
是否有过从内存中获取部分数据而从磁盘中获取其他数据的情况?位置如何区分?
谢谢
【问题讨论】:
标签: memory computer-science byte
十六进制内存地址(就像打印出指针的值一样)指向虚拟内存中的一个位置。
在 32 位系统上,每个进程都有完整的 4GB 虚拟内存。该虚拟内存由 CPU 和操作系统管理。当您访问虚拟内存中的某个位置时,CPU 和操作系统会确定该位置在系统实际物理内存中的映射位置,并从那里检索数据。
操作系统也可以从物理内存中取出一些东西并将它们交换到磁盘上,以便为其他东西腾出物理内存空间。然后,如果您尝试访问从物理内存交换到磁盘的内容的虚拟内存位置,则会生成“页面错误”,导致操作系统将页面从磁盘重新加载到物理内存中。
【讨论】:
mmap-ed 文件中的地址等。有趣的情况是,当某些虚拟内存地址不是 i> 映射到任何地方,而您正试图访问它。在这种情况下,会生成访问冲突(也称为分段错误)。
现代操作系统有virtual memory。
这意味着使用您的程序访问内存中某个字节的地址纯粹是“虚拟的”,不存在。操作系统通过特殊的硬件控制器将其映射到完全不同的真实内存位置,并且对于给定的地址可能根本没有物理内存位置。例如,您可以mmap() 将文件放入(虚拟)内存中,访问虚拟地址处的字节意味着访问 file 的字节。类似地,如果某些memory page 长时间未使用,操作系统可能会swap off 从物理RAM 到磁盘的页面。在这种情况下,虚拟内存也不会指向物理内存位置。
【讨论】:
:/
在大多数情况下 - 是的。但是有些处理器使用 2 个值来计算实际地址。例如英特尔 8086。 硬盘只是存储,它有自己的系统来存储信息。因此,在执行任何 CPU 操作之前,必须将数据加载到 RAM 中。
【讨论】: