x86-4-任務(task)

x86-4-任務(task)

4.1 任務:

CPU將一整段正在運行的代碼稱作任務,可以類比操作系統的線程。比如說:你在Windows寫了個程序進行運行,這個程序的運行在操作系統層面上來說就是進程里的線程,在CPU層面上來說就是任務。

 

4.2 操作系統中的任務:

在操作系統中操作系統的內核可以管理用戶程序的加載與卸載,內核為用戶程序提供各種編程接口,通過接口來對用戶程序進行服務,用戶程序通過調用內核提供的各種例程(routime)來進行工作。

比如Windows操作系統的進程/線程程序是由操作系統的內核+用戶程序代碼來編寫的。

而程序映射到CPU底層來執行就是task(任務),所以說任務也是由:內核代碼+用戶代碼組合而成:

 

 

 

內核只有一個作為所有任務的公共部分,而每個用戶程序作為任務的私有部分。

內核是一直運行的,當一個任務被關閉時,只會關閉任務的私有部分而不會關閉內核。

一個內核可以為多個用戶程序服務,然後一起組合成一個任務:

 

 

 

當一個任務結束時,只是用戶程序部分(私有部分)結束了,而內核部分還在繼續(只要操作系統不關閉)。

比如:你的Windows操作系統是一直開着的,它可以給你電腦上的微信提供幫助,然後和微信一起組合成一個進程(映射到CPU上就是任務),但是操作系統也可以和別的程序一起組合成其他的任務。而你關閉微信時並不會關閉操作系統,只有當你關閉操作系統時才會關機。

 

4.3 LDT(local Description table)表

如果CPU將所有的程序都放在GDT表中那麼管理起來會非常不方便,因為每個程序都有自己的段,而操作系統中肯定會有很多程序,所以CPU建議對每個任務的用戶程序都建立一個類似GDT表的東西來管理該任務的用戶程序(當然操作系統也是這樣做的)。所以就有了LDT表,從名稱上來看也可以看出端倪,local Description table,局部段描述符表。

和GDT 一樣,LDT 也是用來存放描述符的。只不過LDT只屬於某個任務,所以LDT可以有多個。

 

 

LDT表和GDT表一樣,也有一個寄存器來專門存放它的內容,就是ldtg寄存器:

kd> r ldtr
ldtr=00000000

 

4.4 TSS(Task State Segment)任務狀態段

當任務在切換時,必須保存切換前任務的執行環境,不然切換回來後怎麼保證繼續執行是按照之前寫好的代碼邏輯執行的呢,所以引入了TSS數據結構來專門保存任務的環境。

TSS也有一個寄存器來存放它的首地址,叫做tr寄存器:

kd> r tr
tr=00000028

TSS的數據結構:

 

 

4.5 多任務系統:

多任務系統,是指能夠同時執行兩個以上任務的系統,也就是即使前一個任務沒有執行完,其他任務也可以開始執行。

在單核CPU的系統中,多個程序不可能真的同時執行,但,CPU可以在多個任務之間周期性地切換。一會執行這個一會執行那個。所有任務都處於走走停停的狀態,快速的CPU再加上高效的CPU任務切換,從其它角度看來,每個任務都是在同時運行。

目前基本上都是多任務操作系統了,所以說操作系 統時為了方便不再添加多任務這個關鍵字了。

 

多任務系統的組成示意圖:

 

 

 

小結:

本來是想在WinDbg中驗證的,可惜很遺憾,Windows沒有採用這一套處理,Windows更多的是在分頁管理上的運用。

比如說在Windbg中查看LDT的值:

kd> r ldtr
ldtr=00000000
kd> dd ldtr
00000000 ???????? ???????? ???????? ????????
00000010 ???????? ???????? ???????? ????????
00000020 ???????? ???????? ???????? ????????
00000030 ???????? ???????? ???????? ????????
00000040 ???????? ???????? ???????? ????????
00000050 ???????? ???????? ???????? ????????
00000060 ???????? ???????? ???????? ????????
00000070 ???????? ???????? ???????? ????????

它是一個0值,所以這一套基本上對於現代操作系統是沒用了,但是對於CPU來說是有用的。

Tags: