~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/active_mm.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 .. include:: ../disclaimer-zh_CN.rst
  2 
  3 :Original: Documentation/mm/active_mm.rst
  4 
  5 :翻译:
  6 
  7  司延腾 Yanteng Si <siyanteng@loongson.cn>
  8 
  9 :校译:
 10 
 11 
 12 =========
 13 Active MM
 14 =========
 15 
 16 这是一封linux之父回复开发者的一封邮件,所以翻译时我尽量保持邮件格式的完整。
 17 
 18 ::
 19 
 20  List:       linux-kernel
 21  Subject:    Re: active_mm
 22  From:       Linus Torvalds <torvalds () transmeta ! com>
 23  Date:       1999-07-30 21:36:24
 24 
 25  因为我并不经常写解释,所以已经抄送到linux-kernel邮件列表,而当我做这些,
 26  且更多的人在阅读它们时,我觉得棒极了。
 27 
 28  1999年7月30日 星期五, David Mosberger 写道:
 29  >
 30  > 是否有一个简短的描述,说明task_struct中的
 31  >  "mm" 和 "active_mm"应该如何使用? (如果
 32  > 这个问题在邮件列表中讨论过,我表示歉意--我刚
 33  > 刚度假回来,有一段时间没能关注linux-kernel了)。
 34 
 35  基本上,新的设定是:
 36 
 37   - 我们有“真实地址空间”和“匿名地址空间”。区别在于,匿名地址空间根本不关心用
 38     户级页表,所以当我们做上下文切换到匿名地址空间时,我们只是让以前的地址空间
 39     处于活动状态。
 40 
 41     一个“匿名地址空间”的明显用途是任何不需要任何用户映射的线程--所有的内核线
 42     程基本上都属于这一类,但即使是“真正的”线程也可以暂时说在一定时间内它们不
 43     会对用户空间感兴趣,调度器不妨试着避免在切换VM状态上浪费时间。目前只有老
 44     式的bdflush sync能做到这一点。
 45 
 46   - “tsk->mm” 指向 “真实地址空间”。对于一个匿名进程来说,tsk->mm将是NULL,
 47     其逻辑原因是匿名进程实际上根本就 “没有” 真正的地址空间。
 48 
 49   - 然而,我们显然需要跟踪我们为这样的匿名用户“偷用”了哪个地址空间。为此,我们
 50     有 “tsk->active_mm”,它显示了当前活动的地址空间是什么。
 51 
 52     规则是,对于一个有真实地址空间的进程(即tsk->mm是 non-NULL),active_mm
 53     显然必须与真实的mm相同。
 54 
 55     对于一个匿名进程,tsk->mm == NULL,而tsk->active_mm是匿名进程运行时
 56     “借用”的mm。当匿名进程被调度走时,借用的地址空间被返回并清除。
 57 
 58  为了支持所有这些,“struct mm_struct”现在有两个计数器:一个是 “mm_users”
 59  计数器,即有多少 “真正的地址空间用户”,另一个是 “mm_count”计数器,即 “lazy”
 60  用户(即匿名用户)的数量,如果有任何真正的用户,则加1。
 61 
 62  通常情况下,至少有一个真正的用户,但也可能是真正的用户在另一个CPU上退出,而
 63  一个lazy的用户仍在活动,所以你实际上得到的情况是,你有一个地址空间 **只**
 64  被lazy的用户使用。这通常是一个短暂的生命周期状态,因为一旦这个线程被安排给一
 65  个真正的线程,这个 “僵尸” mm就会被释放,因为 “mm_count”变成了零。
 66 
 67  另外,一个新的规则是,**没有人** 再把 “init_mm” 作为一个真正的MM了。
 68  “init_mm”应该被认为只是一个 “没有其他上下文时的lazy上下文”,事实上,它主
 69  要是在启动时使用,当时还没有真正的VM被创建。因此,用来检查的代码
 70 
 71    if (current->mm == &init_mm)
 72 
 73  一般来说,应该用
 74 
 75    if (!current->mm)
 76 
 77  取代上面的写法(这更有意义--测试基本上是 “我们是否有一个用户环境”,并且通常
 78  由缺页异常处理程序和类似的东西来完成)。
 79 
 80  总之,我刚才在ftp.kernel.org上放了一个pre-patch-2.3.13-1,因为它稍微改
 81  变了接口以适配alpha(谁会想到呢,但alpha体系结构上下文切换代码实际上最终是
 82  最丑陋的之一--不像其他架构的MM和寄存器状态是分开的,alpha的PALcode将两者
 83  连接起来,你需要同时切换两者)。
 84 
 85  (文档来源 http://marc.info/?l=linux-kernel&m=93337278602211&w=2)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php