多个进程的Linux内核逻辑地址

时间:2012-10-21 07:46:39

标签: linux memory-management linux-kernel embedded-linux

据我了解,“每个进程的地址空间分为3G / 1G用户空间/内核空间,1G(少一点)用物理地址一对一映射,称为内核逻辑地址”。   现在,我的问题是,系统上运行了多个进程,并且所有进程如何与物理地址进行一对一映射?     例如,当内核在进程A的上下文中访问内核逻辑地址时,现在抢占发生了,当内核访问进程B上下文中的逻辑地址时会发生什么?

在类似的产品线上,只有512MB RAM的PC会发生什么?对于那些PC来说,1G内核空间的一对一映射是如何发生的?

3 个答案:

答案 0 :(得分:2)

首先要考虑总虚拟地址空间的内核部分(比如1GB)并不是全部都可以使用。并且总物理内存并不都映射到内核空间。

内核空间将为其使用的物理RAM以及定义的任何内存映射外设提供虚拟内存映射。那些没有被分页。

用户空间中的每个进程可以为其代码+数据提供多达3 GB的虚拟内存。对于物理记忆有两个极端,它可能会让每个人都看清楚。

大物理内存:如果处理器支持大物理寻址,例如36位,可能有64 GB的物理内存。您可以拥有多个进程,每个进程具有3 GB代码+数据,甚至不必将页面交换到辅助存储。每个上下文切换都会设置MMU以将新执行进程的物理内存映射回用户空间。

小物理内存:假设有512 MB,内核使用128 MB。剩下的384 MB将保存用户进程的代码+数据。如果用户进程需要更多,页面将根据需要在辅助存储和RAM之间交换。

答案 1 :(得分:2)

这是一个链接,为我的问题提供了很好的说明。

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

“在Linux中,内核空间始终存在,并在所有进程中映射相同的物理内存。内核代码和数据始终可寻址,随时可以处理中断或系统调用。相比之下,用户的映射 - 每当进程切换发生时,地址空间的模式部分都会改变:“

回答第一部分问题:Linux内核空间在所有进程中保持相同,并且进程上下文切换无关紧要。内核空间仍然映射到所有进程上下文中的相同RAM页面。

回答第二部分问题:物理RAM大小(512 MB或2GB)与内核地址空间无关。与规则一样,内核有1G可用的内核地址空间,无论它做什么分配,都完成了这些地址。将这些地址映射到可用R​​AM(512MB或2GB)是MMU的工作。   在1G或更大的RAM情况下,整个1G将映射为内核地址空间,而在512 MB RAM情况下,它将为512MB。它不会损害用户空间地址,因为一切都是虚拟地址,并且它们将被换出以满足需求,包括内核空间页面的那些。

注意:这里我假设1G / 3G分裂,这不是一个硬规则。

答案 2 :(得分:0)

嗯,在传统的多核系统中,所有处理器都可以访问所有RAM。在Linux中,每个进程在3GB端都有自己的地址空间,而1GB端则保持不变(我认为),因为内核在某种程度上始终存在。因为虚拟内存的内核部分保持不变(并且因此存在一个内核地址空间),所以内核地址空间在抢占进程时不会改变。

很简单,内核只映射那512 MB。另一个512 MB的虚拟地址空间只是映射到无页面条目,它只告诉CPU在该地址上不能访问任何内存,并在访问时引发CPU异常。