Linux内核开发中提到的一些要点(由Robert撰写) 爱)关于mm_struct和内核线程的书是:
“内核线程没有进程地址空间,因此没有 有一个相关的内存描述符。因此,内核的mm字段 线程的进程描述符为NULL。 “
“因为内核线程在用户空间中没有任何页面,所以它们没有 真的值得拥有自己的内存描述符和页表(页表是 将在本章后面讨论。尽管如此,内核线程需要一些 数据,例如页表,甚至访问内核内存。“
“内核线程没有地址空间,mm为NULL。因此,何时 一个内核线程被调度,内核注意到mm是NULL并保持 加载了上一个进程的地址空间。然后内核更新 active_mm字段的内核线程的进程描述符来引用 前一个进程的内存描述符。然后内核线程可以使用 根据需要,上一个流程的页面表。“
现在我的疑问是: 1.首先提到内核线程在用户中没有任何页面 空间,因此他们不值得记忆desriptor和页表和in 下一行它说它需要一些数据,如页表来访问 内核内存。这里指的是哪个页面表?每个过程都有它 自己的页表用于映射虚拟到物理地址,为什么是内核 线程需要吗?
内核线程如何使用页表?
答案 0 :(得分:1)
每个线程无论是用户空间还是内核空间进程都需要页表。内核地址空间(虚拟内存地址空间)直接映射到物理地址空间,而不直接映射用户空间地址空间。此外,用户空间应用程序地址空间映射在创建,终止,交换新进程时保持不断变化,而内核空间映射保持不变。 要了解更多信息,请访问以下链接: -
或在此处发布查询。
答案 1 :(得分:1)
系统中有一些使用空间应用程序和内核线程。每个虚拟地址空间由内核和用户部分组成。内核对于所有进程都是相同的,用户部分是不同的。
每个进程都有自己的页表,用于将虚拟映射到 物理地址,为什么内核线程要求?
内核线程需要页表来在访问内存时从虚拟地址转换为物理地址。
内核线程如何使用页表?
想象一个简单的情况,记忆写如a [i] = 5;在内核空间。这个通常通过MMU,MMU使用页表根据虚拟地址获取物理地址(在本例中为& a [i])。所以内核线程没有什么特别之处,区别在于在上下文切换时他们不会改变pgd(页面全局目录),他们使用最后一个进程的pgd,因为所有进程都有相同的内核部分,你可以选择只是最后一个(见actime_mm),它会没问题。