11.1 為什麼要有任務狀态段 TSS
11.1.1 多任務的起源
TSS 是 Task State Segment 的縮寫,即任務狀态段。
硬體廠商提供的多任務硬體解決方案主要是 LDT 和 TSS。
11.1.3 TSS 的作用
Intel 的建議是給每個任務關聯一個任務狀态段,這就是 TSS,用它來表示任務。
TSS 是由程式員“提供”的,由 CPU 來維護。
CPU 中有一個專門存儲 TSS 資訊的寄存器,這就是 TR 寄存器,它始終指向目前正在運作的任務。
TSS 和其它段一樣,本質上是一片存儲資料的記憶體區域,Intel 打算用這片記憶體區域儲存任務的最新狀态。使用 TSS 描述符來“描述” TSS。

TSS 描述符屬于系統段描述符。
TSS 的主要作用就是儲存任務的快照,也就是 CPU 執行該任務時,寄存器當時的瞬時值。
除了從中斷和調用門傳回外,CPU 不允許從高特權級轉向低特權級。另外,CPU 在不同特權級下用不同的棧。
Linux 隻用到了 0 特權級和 3 特權級,是以隻設定 SS0 和 esp0 的值就夠了。
TR 寄存器存儲 TSS 的起始位址及偏移大小。
TSS 必須要在 GDT 中注冊,是以 TSS 是通過選擇子來通路的,将 TSS 加載到寄存器 TR 的指令時 ltr:
ltr <16位通用寄存器>/<16位記憶體單元>
11.1.5 現代作業系統采用的任務切換方式
有一件工作必須且隻能用 TSS 來完成,就是 CPU 向更高特權級轉移時所使用的棧位址,需要提前在 TSS 中寫入。
導緻轉移到更高特權級的一種情況是在使用者模式下發生中斷,CPU 會由低特權級進入高特權級,這會發生堆棧的切換。當一個中斷發生在使用者模式(特權級3),處理器從目前 TSS 的 SS0 和 esp0 成員中擷取用于進行中斷的堆棧。是以,我們必須建立一個 TSS,并且至少初始化 TSS 中的這些字段。
Linux 為每個 CPU 建立一個 TSS,在各個 CPU 上的所有任務共享同一個 TSS。在程序切換時,隻需要把 TSS 中的 SS0 及 esp0 更新為新任務的核心棧的段位址及棧指針。
Linux 在 TSS 中隻初始化了 SS0、esp0 和 I/O 位圖字段。
和修改 TSS 中的内容所帶來的開銷相比,在 TR 中加載 TSS 的開銷要大很多。
11.3 實作使用者程序
程序與核心線程最大的差別是程序有單獨的 4GB 空間,這指的是虛拟位址。
11.3.5 使用者程序建立的流程
11.3.8 實作使用者程序----下
作業系統啟動後,其在實體記憶體中的位置是固定的,不會再變動。
作業系統隻有一套頁表,它們也是固定的。
把使用者程序頁目錄表中的第 768 ~ 1023 個頁目錄項用核心頁目錄表的第 768 ~ 1023 個頁目錄項代替,就能讓使用者程序的高 1GB 空間指向核心。