Linux 内核如何访问其他进程的内存?

Linux 内核如何访问其他进程的内存?,linux,memory,linux-kernel,x86,operating-system,Linux,Memory,Linux Kernel,X86,Operating System,我在本报告中阅读了以下内容: 内核可以访问所有内存 我想知道的是,内核如何访问其他进程的内存 我几乎可以肯定的是,内核不能访问物理内存,它只能访问虚拟内存 现在,每个进程都有一个页表,用于将虚拟地址转换为物理地址。由于内核可以访问所有进程的所有页表(我认为页表存在于内核空间中),因此如果内核想要访问进程A的内存,例如,它可以使用进程A的页表,并通过该页表访问进程A的内存 我说的对吗?在这种情况下,“其他流程”是什么 如果一个线程正在执行,不管出于什么原因它进入内核,而内核想要读取它的内存,那么它

我在本报告中阅读了以下内容:

内核可以访问所有内存

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

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

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

我说的对吗?

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

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

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

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


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

如果需要,内核当然可以访问物理内存。但你对它如何访问进程记忆的看法是正确的。这不是一个正确的SO问题。对于您试图编写的程序的问题也是如此,而不是操作系统的设计。@Barmar“内核当然可以访问物理内存,如果它愿意的话”我相信CPU不能在保护模式下访问物理地址,所以为了让内核访问物理内存,它必须先将CPU切换到保护模式,对吗?1。受保护模式并不意味着usign虚拟内存(分页)-您可以进入PM并仍然使用对内存的直接访问。2.内核(如果不是全部的话,也是大多数)是在PM和VM中运行的。3.您可以将虚拟地址映射为实际地址1:1“它找到所需的物理页,并将其映射以便它可以读取”您的意思是,例如,如果进程A的内存从虚拟地址
500分配到1000,并且内核希望访问这些地址,然后内核可以将进程A的物理地址
500到1000
映射到内核空间的虚拟地址
2000到2500
?你说得有点奇怪,所以我不知道你是否得到了它。这里重新编写:进程A地址空间中覆盖虚拟范围500-1000的物理页面可以映射到内核空间的某个地方。是的,这就是我的意思,我说过它们将被映射到内核空间的虚拟地址
2000到2500。你说的是“物理页面”,你是指物理地址吗?是的,这里有一些垃圾,可以达到每个评论15个字符的下限