【问题标题】:C memory mappingC 内存映射
【发布时间】:2012-05-16 10:28:03
【问题描述】:

我知道有两种类型的地址。虚拟和物理。打印整数变量的地址将打印其虚拟地址。是否有有助于打印该变量的物理内存的功能?

虚拟内存是指硬盘上被操作系统视为 RAM 的部分吗?

【问题讨论】:

  • 是和不是。不,需要花费太多的精力来解释。从维基百科开始,伙计。 en.wikipedia.org/wiki/Virtual_memory
  • 这个问题 (link) 是相关的,尽管它不是完全重复的。

标签: c memory memory-management virtual-address-space


【解决方案1】:

不,没有这样的(便携式)功能。在实现内存保护的现代操作系统中,用户空间(与内核空间相反,即操作系统的一部分)不能直接访问物理地址,这是不允许的。所以没有什么意义。

不,虚拟内存不需要涉及硬盘,即“交换”或“分页”。一旦有了虚拟内存,您就可以实现它,因为它让操作系统有机会干预和管理哪些页面保存在物理内存中,从而可以将内存“分页”到其他存储介质。

要深入了解 Linux 内核如何管理内存,this blog post 非常棒。

【讨论】:

  • 物理地址不能仅仅因为它不是常数而被获取,不仅仅是因为它对用户模式进程“隐藏”。除非内存页被锁定在指定的物理地址,否则它可能随时被移动到任何地方(包括 HDD)。
  • 我会这样说。分页/交换文件是硬盘上被操作系统视为 RAM 的区域。还有一个问题。我们可以获取特定用户进程的页表大小吗?我知道页表的大小不是恒定的。但在某些时候,如果我愿意,有可能吗?
【解决方案2】:

这是一个复杂的话题。

物理内存地址指向硬件内存设备中的真实位置,无论是系统内存、显卡内存还是网卡缓冲区。

虚拟内存是呈现给用户模式进程的内存模型。系统上的大多数设备都有一些映射到它们的虚拟内存地址空间,处理器可以写入这些地址空间。当这些物理内存地址被赋予一个虚拟内存地址时,操作系统会识别出对这些地址的读/写请求需要由特定设备提供服务,并将该请求委托给它。

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2015-08-09
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多