成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux從頭學:理解了這三個概念,才能徹底理解【任務管理】和【任務切換】

系統 Linux
操作系統需要為每一個應用程序,單獨申請一塊空間,用作這個程序自己的段描述附表,稱作:LDT(Local Description Table)。

[[422197]]

  • LDT:局部描述符表
  • TSS: 任務狀態段
  • TCB: 任務控制塊

x86 系統中的保護模式,給系統的安全性提供了很大的保障,但是在我們之前的文章中,一直都淡化了特權級別這個概念。

例如:在保護模式下的段選擇器,我們一直都只把它看做一個段描述符的"索引號",用來在 GDT (全局描述描述符表) 中查找一個段描述符,例如:

圖中:代碼段寄存器中的索引號是 4 ,GDT 中每一個表項占用 4 個字節,于是就在偏移量為 16 的位置,找到了代碼段的描述符,進而從描述符中找到代碼段的起始地址和長度界限。

數據段、棧段的操作過程也是這樣的。

從現在開始,我們需要讓用戶程序擁有自己私有的描述符表 LDT(Local Descriptor Table),并且擁有自己的特權級別(總不能讓用戶程序與操作系統一樣,工作在非常高的 0 特權級別)。

因此,我們需要糾正之前的錯誤:段寄存器中,不僅僅有段的索引號,還有另外兩個屬性:TI 和 RPL,如下圖所示:

 

  • TI 標志位:表示到哪個表中(GDT or LDT)查找描述符;
  • TI = 0: 到 GDT 中查找描述符;
  • TI = 1: 到 LDT 中查找描述符;
  • RPL(Request Privilege Level) 標志位:表示想給段寄存器賦值的請求者(也就是一段代碼),它的特權級別;

此時,繼續把段寄存器中的內容稱作段索引符就不合適了,一般稱作:選擇子。

LDT:局部描述符表

在上一篇文章中,操作系統把應用程序從硬盤讀取到內存中之后,為應用程序創建了三個段描述符,這三個段描述符都放在了 GDT 表中,這是不合理的。

首先,在多任務系統中,應用程序的數量是不確定的,應用程序也會執行結束。

如果把所有應用程序的段描述符都放在 GDT 中,對于操作系統來說,管理這個數據太復雜。

其次,當引入特權級別之后,如果應用程序的段描述符放在 GDT 中,那么就意味著應用程序需要有權限來訪問 GDT,而 x86 系統中只有一個 GDT(所以叫做 Global Description Table),只能被操作系統訪問。

因此,操作系統需要為每一個應用程序,單獨申請一塊空間,用作這個程序自己的段描述附表,稱作:LDT(Local Description Table)。

例如:現在系統中有 2 個用戶程序: APP1 和 APP2,操作系統在加載每一個應用程序的時候,就會在應用程序自己的內存空間中,申請一塊,用作 LDT:

 

  • 為什么是 “應用程序自己的內存空間”?
  • 因為每一個應用程序,都獨享 4G 大小的虛擬內存空間。

在 LDT 中,存放著當前應用程序自己的段描述符信息,例如:代碼段、數據段、棧段。

LDT 所占用的空間也屬于內存的一部分,有起始地址和長度界限,因此也需要為它創建一個段描述符,這個描述符就放在 GDT 中。

在 Linux 應用層,我們會嚴格的區分進程、線程,但是在系統的底層,這樣的區分界限已經比較模糊了,用任務 task 來稱呼更通用些。

根據剛才的假設,現在系統中有 2 個用戶程序,那么處理器怎么知道:當前正在執行的是哪一個應用程序的 LDT 中的代碼?

正如處理器中有一個寄存器 GDTR,保存著 GDT 的開始地址和長度,處理器中還有一個寄存器 LDTR,存儲著當前正在執行的那個應用程序的 LDT 開始地址和長度:

所有應用程序的虛擬內存的高端地址部分,映射的都是操作系統的內存空間,按照 Linux 中的做法,3G ~ 4G 空間被操作系統使用。

圖中的綠色部分,表示操作系統空間(1G),在分頁機制下,它們都映射到相同的物理內存頁上(藍色虛線箭頭)。

當操作系統切換到應用程序2時,處理器中的 LDTR 就會被賦值為應用程序2 的 LDT 的線性地址和長度信息。

  • GDTR 中的內容不變,因為每個應用程序中的 GDT 都是從操作系統“繼承”而來的,開始地址和長度都是一樣的。

TSS: 任務狀態段

顧名思義,任務狀態段就是用來存儲和恢復任務的狀態信息。

經常聽到一個術語:任務上下文。

所謂的上下文,就是體現一個任務正在被執行時的環境信息,主要就是處理器中的各種寄存器內容,也就是下面這張圖中的寄存器們:

這張圖反映了一個任務上下文的所有寄存器信息。

當任務被調度器中止執行之前,需要把這些寄存器中的值都保存下來,相當于做一個快照。

當這個任務以后又被恢復執行時,再把這個快照中保存的信息,原樣的賦值給圖中的所有寄存器,這樣就稱作恢復任務上下文,這個任務就從上次被中止的地方繼續執行(因為指令指針寄存器 EIP 被恢復了)。

就如同 LDT 一樣,TSS 也是操作系統為應用程序分配的一塊內存空間,只不過這塊空間是位于操作系統的勢力范圍內,只能由操作系統來操作。

TSS 也有起始地址和長度界限,也需要為它在 GDT 中創建一個段描述符。

與 LDT 類似,在處理器中也有一個寄存器 TR,用來指向當前正在執行的那個任務的 TSS。

當進行任務切換的時候:

  1. 首先,把處理器中的寄存器內容,存儲到 TR 寄存器指向的 TSS 段中(即將被停止的任務);
  2. 然后,把新的任務的 TSS 段中的內容,復制到處理器的各寄存器中,并且把 TSS 地址賦值給 TR 寄存器;

TCB: 任務控制塊

任務控制塊,可以說是系統中用來管理任務的最重要的數據結構了,操作系統用來管理任務的所有信息都可以放在這里。

看一下 Linux 2.6 內核代碼中的結構體:struct task_struct{ ... },就知道 TCB 有多復雜了,有些書籍上也稱之為 PCB(Process Control Block,進程控制塊)。

在這個結構中,一些常用的信息包括:

  1. 程序的加載地址;
  2. 任務的優先級;
  3. 任務的當前狀態;
  4. 任務打開的一些資源:網絡、文件設備等待;
  5. 。。。

需要注意的是:上面的 LDT、TSS,是 x86 處理器中設計的運行機制,是處理器要求這樣的。

而 TCB 不是處理器要求的,它是操作系統的實現者自己來構建的,因此可以根據自己的需要來進行設計。

每一個應用程序需要一個 TCP 結構,所有的 TCB 結構就可以構成一個鏈表,便于操作系統來管理。

比如:在發生任務切換的時候,就可以順著鏈表頭,一次掃描鏈表上的每一個 TCB 節點。

如果找到了當前正在被執行(即將被中止)的任務,就把這個任務的狀態標記為暫停,并移動到鏈表的末尾,然后把鏈表頭部的第一個處于 ready 狀態的任務,加載到處理器中去執行。

當然,Linux 系統中的處理過程更為復雜,它把每一個任務按照優先級放在不同的等待隊列中,然后利用哈系桶算法來查找任務。

 End 

x86 處理器中的這三個概念,對于理解任務切換非常重要。

寫到這里,我總是覺得以上的文字描述還是有點朦朦朧朧,也許是自己還需要進一步的理解其中的脈絡。

就先這樣吧,以后想到更好的描述方式了再與大家分享,謝謝!

本文轉載自微信公眾號「IOT物聯網小鎮」

【編輯推薦】

 

責任編輯:姜華 來源: IOT物聯網小鎮
相關推薦

2024-03-15 08:23:26

異步編程函數

2022-05-03 00:03:11

狀態管理前端開發

2014-10-30 14:19:13

本文由簡單的字符串匹配

2015-12-09 13:06:15

Linux架構內核

2020-10-20 06:45:48

編程高并發

2022-10-20 18:43:32

C語言golang安全

2021-08-09 06:57:42

代碼重定位Linux

2019-11-08 14:55:45

區塊鏈密碼量子計算

2021-10-15 08:32:03

RocketMQ數據結構架構

2020-11-09 14:30:28

Linux多線程數據

2021-08-11 08:47:31

SASE網絡安全零信任

2015-12-10 09:24:54

Linux架構理解

2017-01-06 10:07:39

Linuxwindowsatime

2017-11-02 13:15:18

Linux

2020-04-16 10:55:03

Java虛擬機字節碼

2023-01-16 08:49:20

RocketMQ定時任務源代

2019-12-26 09:15:44

網絡IOLinux

2021-05-13 08:55:33

Android架構功能

2024-03-19 14:14:27

線程開發

2023-09-07 08:15:58

場景同步異步
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久亚洲一区二区三区四区 | 亚洲协和影视 | 欧美亚洲激情 | 久久在线免费 | 日韩精品一区二区三区在线观看 | 久久久蜜臀国产一区二区 | 中文字幕国产视频 | 国产一区二区三区久久久久久久久 | 亚洲性综合网 | 孰女乱色一区二区三区 | 久久伊人青青草 | www国产精 | 夜夜夜操 | 天天操天天插 | 国产在线麻豆精品入口 | 欧美综合国产精品久久丁香 | 亚洲高清一区二区三区 | 久久精品福利 | 欧美成人免费在线视频 | 精品视频一区二区三区在线观看 | 亚洲男人网 | 97久久精品午夜一区二区 | 日韩在线视频一区 | 国产精品久久久久久久久久久久 | 国产精品久久久久一区二区三区 | 精品国产欧美一区二区三区不卡 | 亚洲午夜精品 | 久草a√ | 国产精品久久久久久久久久久免费看 | 日韩av一区二区在线 | 麻豆一区二区三区精品视频 | 久久精品色欧美aⅴ一区二区 | 色视频网站免费 | 干狠狠 | 手机av在线| 国内精品视频免费观看 | 精品福利在线 | 亚洲一在线 | 精品久 | 午夜天堂精品久久久久 | 999精彩视频|