2017-06-16 74 views
0

我已阅读here如下:内核如何访问其他进程的内存?

内核可以访问所有的内存

我想知道的是,怎么做内核访问其他进程的内存。

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

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

我正确吗?

+0

内核当然可以访问物理内存,如果它想。但是你是如何访问过程记忆是正确的。 – Barmar

+1

这不是一个真正的SO问题。 SO是针对你正在编写的程序的问题,而不是关于操作系统的设计。 – Barmar

+0

@Barmar *“内核当然可以访问物理内存,如果它想要”*我相信CPU不能访问保护模式下的物理地址,所以为了让内核访问物理内存,它必须切换CPU先保护模式,对吗? – user247763

回答

2

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

如果一个线程正在执行,并且出于某种原因进入内核并且内核想要读取其内存,那么它可以“只”在体系结构中执行此操作,其中用户空间和内核空间都映射到一个巨大的地址空间。特别是x86上的情况。

通常情况下,内核不会访问由切换到内核的线程所映射的内存映射的内存。

如果需要这样的访问,内核将“手动”走过相关的页表。它发现需要什么样的物理页面,并将其映射,以便它可以读取。它肯定不会为此目的切换页面表。

作为一个有趣的事实,由于x86-64上的地址空间与物理上可安装的memroy相比非常庞大(256TB),因此整个物理内存总是被映射的。因此,在这个架构上,内核只是计算相关页面在这个区域内的位置。

+0

*“它找到需要的物理页面,并将其映射为可以读取”*您的意思是说,例如,如果**进程A **有分配的内存虚拟地址为500到1000,并且内核想要访问这些地址,那么内核可以将**进程A **的'500到1000'的物理地址映射到例如虚拟地址'2000到2500'内核空间? – user247763

+0

你说得有点奇怪,所以我不知道你是否知道。在这里它被重写:覆盖进程A的地址空间中的虚拟范围500-1000的物理页面可以映射到内核空间中的某处。 –

+0

是的,这是我的意思,我说他们将被映射到例如内核空间的虚拟地址'2000到2500'。你说*“物理页面”*,你的意思是**物理地址**? – user247763