【问题标题】:How does the kernel access the memory of other processes?内核如何访问其他进程的内存?
【发布时间】:2017-11-18 15:51:16
【问题描述】:

我在here中阅读了以下内容:

内核可以访问所有内存

我想知道的是,内核如何访问其他进程的内存。

我几乎可以肯定的是内核不能访问物理内存,它只能访问虚拟内存。

现在每个进程都有一个页表,用于将虚拟地址转换为物理地址。而且由于内核可以访问所有进程的所有页表(我想页表存在于内核空间中),那么如果内核想要访问 Process A 的内存,例如,它可以使用进程A的页表,并通过这个页表访问进程A的内存。

我说的对吗?

【问题讨论】:

  • 内核当然可以根据需要访问物理内存。但是您对它如何访问进程内存的方式是正确的。
  • 这不是一个真正的问题。 SO 是针对您尝试编写的程序的问题,而不是关于操作系统设计的问题。
  • @Barmar "如果内核愿意,当然可以访问物理内存" 我认为 CPU 在保护模式下无法访问物理地址,所以为了内核要访问物理内存,必须先将 CPU 切换到保护模式,对吗?
  • 1.保护模式并不意味着使用虚拟内存(分页) - 您可以进入 PM 并仍然使用直接访问内存。 2. 内核(如果不是全部的话,大多数)按设计在 PM 和 VM 中运行。 3.虚拟地址可以1:1映射到真实地址

标签: linux memory linux-kernel x86 operating-system


【解决方案1】:

在这种情况下,什么是“其他进程”?

如果一个线程正在执行并且它出于某种原因进入内核并且内核想要读取它的内存,它可以“只是”在用户空间和内核空间都映射到一个巨大的地址空间的架构上这样做。在 x86 上尤其如此。

通常,内核不会四处访问由与切换到内核的线程不同的线程映射的内存。

如果需要这样的访问,内核会“手动”遍历相关的页表。它找到需要的物理页面,然后映射它以便它可以读取。它肯定不会为此目的切换页表。

有趣的是,由于 x86-64 上的地址空间与可物理安装的内存相比是如此巨大 (256TB),因此始终映射整个物理内存。因此,在这种架构上,内核只计算相关页面在该区域内的位置。

【讨论】:

  • “它找到需要的物理页面,然后映射它以便它可以读取” 你的意思是,例如,如果 进程 A 有内存从虚拟地址500 to 1000分配,并且内核想要访问这些地址,那么内核可以将进程A500 to 1000的物理地址映射到例如内核的虚拟地址2000 to 2500空间?
  • 你说的有点奇怪,所以我不知道你是否明白。这里改写一下:进程A地址空间中覆盖虚拟范围500-1000的物理页面可以映射到内核空间的某个地方。
  • 是的,这就是我的意思,我说过它们将被映射到例如内核空间的虚拟地址2000 to 2500。你说的“物理页面”,是指物理地址吗?
  • 是的,这里有一些废话可以达到每条评论 15 个字符的下限
猜你喜欢
  • 2010-12-31
  • 2016-08-16
  • 2015-06-26
  • 2012-01-01
  • 1970-01-01
  • 2011-02-06
  • 2013-06-16
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多