1. 程式人生 > >核心執行緒的程序描述符task_struct中的mm和active_mm

核心執行緒的程序描述符task_struct中的mm和active_mm

task_struct程序描述符中包含兩個跟程序地址空間相關的欄位mm, active_mm,

struct task_struct
{
    // ...
    struct mm_struct *mm;
    struct mm_struct *avtive_mm;
    //...
};

大多數計算機上系統的全部虛擬地址空間分為兩個部分: 供使用者態程式訪問的虛擬地址空間和供核心訪問的核心空間。每當核心執行上下文切換時, 虛擬地址空間的使用者層部分都會切換, 以便當前執行的程序匹配, 而核心空間不會放生切換。

對於普通使用者程序來說,mm指向虛擬地址空間的使用者空間部分,而對於核心執行緒,mm為NULL。

這位優化提供了一些餘地, 可遵循所謂的惰性TLB處理(lazy TLB handing)。active_mm主要用於優化,由於核心執行緒不與任何特定的使用者層程序相關,核心並不需要倒換虛擬地址空間的使用者層部分,保留舊設定即可。由於核心執行緒之前可能是任何使用者層程序在執行,故使用者空間部分的內容本質上是隨機的,核心執行緒決不能修改其內容,故將mm設定為NULL,同時如果切換出去的是使用者程序,核心將原來程序的mm存放在新核心執行緒的active_mm中,因為某些時候核心必須知道使用者空間當前包含了什麼。

為什麼沒有mm指標的程序稱為惰性TLB程序?

假如核心執行緒之後執行的程序與之前是同一個, 在這種情況下, 核心並不需要修改使用者空間地址表。地址轉換後備緩衝器(即TLB)中的資訊仍然有效。只有在核心執行緒之後, 執行的程序是與此前不同的使用者層程序時, 才需要切換(並對應清除TLB資料)。

核心執行緒和普通的程序間的區別在於核心執行緒沒有獨立的地址空間,mm指標被設定為NULL;它只在 核心空間執行,從來不切換到使用者空間去;並且和普通程序一樣,可以被排程,也可以被搶佔。