tft每日頭條

 > 科技

 > 操作系統常見知識總結

操作系統常見知識總結

科技 更新时间:2024-07-18 23:10:14

操作系統常見知識總結(一步步編寫操作系統)1

操作系統是利用PCB來維護所有任務的,包括進程和線程,但cpu提供的是TSS,linux系統可沒用它,因為效率太低。但是還是要了解下TSS才清楚操作系統中某些操作的原因。

本節中所講的特權級與它有着密不可分的聯系,TSS作用不止涉及特權級,還包括任務寄存器環境,任務管理相關的内容,為了不幹擾大家,這裡隻介紹和特權級相關的内容,待将來咱們用到更多内容時再和大夥兒細說。

TSS,即Task State Segment,意為任務狀态段,它是處理器在硬件上原生支持多任務的一種實現方式,也就是說處理器原本是想讓操作系統開發廠商利用此結構實現多任務,人家處理器廠商已經提供了多任務管理的解決方案,盡管後來操作系統并不買賬^_^,這是後話,以後再議。TSS是一種數據結構,它用于存儲任務的環境。咱們一睹為快,見圖

操作系統常見知識總結(一步步編寫操作系統)2

TSS是每個任務都有的結構,它用于一個任務的标識,相當于任務的身份證,程序擁有此結構才能運行,這是處理器硬件上用于任務管理的系統結構,處理器能夠識别其中每一個字段。該結構看上去也有點複雜,裡面衆多寄存器都囊括到這104字節中啦,其實這104字節隻是TSS的最小尺寸,根據需要,還可以再接上個IO位圖,這些内容将在後面章節用到時補充。這裡目前隻需要關注28字節之下的部分,這裡包括了3個棧指針,這是怎麼回事呢。

在沒有操作系統的情況下,可以認為進程就是任務,任務就是一段在處理器上運行的程序,相當于某個計算機高手在脫離操作系統的情況下所寫的代碼,它能讓計算機很好地運行。在有了操作系統之後,程序可分為用戶程序和操作系統内核程序,故,之前完整的一個任務也因此被分為用戶部分和内核部分,由于内核程序是位于0特權級,用戶程序位于3特權級,所以,一個任務按特權級來劃分的話,實質上是被分成了3特權級的用戶程序和0特權級的内核程序,這兩部分加在一起才是能讓處理器完整運行的程序,也就是說完整的任務要曆經這兩種特權的變換。所以,我們平時在Linux下所寫程序隻是個半成品,咱們隻負責完成用戶态下的部分,内核态的部分由操作系統提供。

任務是由處理器執行的,任務在特權級變換時,本質上是處理器的當前特權級在變換,由一個特權級變成了另外一個特權級。這就開始涉及到棧的問題了,處理器固定,處理器在不同特權級下,應該用不同特權級的棧,原因是如果在同一個棧中容納所有特權級的數據時,這種交叉引用會使棧變得非常混亂,并且,用一個棧容納多個特權級下的數據,棧容量有限,這很容易溢出。舉個例子,處理器位于0特權級時要用0特權級的棧,3特權級下也隻能用3特權級的棧。

每個任務的每個特權級下隻能有一個棧,不存在一個任務的某個特權級下存在多個同特權級棧的情況。也就是說,一共4個特權級,一個任務“最多”有4個棧。既然一個TSS代表一個任務,每個任務又有4個棧,那為什麼TSS中隻有3個棧:ss0和esp0、ss1和esp1、ss2和esp2?它們分别代表0級棧的段選擇子和偏移量、1級棧的段選擇子和偏移量、2級棧的段選擇子和偏移量。大家看,我在前面說的一個任務最多擁有4個棧,并不是所有的任務都是這樣。

要想搞清楚這個問題,得先弄明白TSS中記錄的3個棧是用來幹嗎的。

剛才已經說過,特權級在變換時,需要用到不同特權級下的棧,當處理器進入不同的特權級時,它自動在TSS中找同特權級的棧,你懂的,TSS是處理器硬件原生的系統級數據結構,處理器當然知道TSS中哪些字段是目标棧的選擇子及偏移量。

特權級轉移分為兩類,一類是由中斷門、調用門等手段實現低特權級轉向高特權級,另一類則相反,是由調用返回指令從高特權級返回到低特權級,這是唯一一種能讓處理器降低特權級的情況。

對于第1種——特權級由低到高的情況,由于不知道目标特權級對應的棧地址在哪裡,所以要提前把目标棧的地址記錄在某個地方,當處理器向高特權級轉移時再從中取出來加載到SS和ESP中以更新棧,這個保存的地方就是TSS。處理器會自動地從TSS中找到對應的高特權級棧地址,這一點對開發人員是透明的,咱們隻需要在TSS中記錄好高特權級的棧地址便可。

也就是說,除了調用返回外,處理器隻能由低特權級向高特權級轉移,TSS中所記錄的棧是轉移後的高特權級目标棧,所以它一定比當前使用的棧特權級要高,隻用于向更高特權級轉移時提供相應特權的棧地址。進一步說,TSS中不需要記錄3特權級的棧,因為3特權級是最低的,沒有更低的特權級會向它轉移。

不是每個任務都有4個棧,一個任務可有擁有的棧的數量取決于當前特權級是否還有進一步提高的可能,即取決于它最低的特權級别。比如3特權級的程序,它是最低的特權級,還能提升三級,所以可額外擁有2、1、0特權級棧,用于将特權分别轉移到2、1、0級時使用。2特權級的程序,它還可以提升兩級,所以可額外擁有1、0特權級棧,用于将特權級分别轉移到1、0級時使用。以此類推,1特權級的程序,它可以額外擁有0特權級棧,0特權級已經是至高無上了,隻有這一個0級棧。以上所說的低特權級轉向高特權級的過程稱為“向内層轉移”,想想4個特權級劃分的同心圓就知道了,高特權級位于裡面。

對于第2種——由高特權返回到低特權級的情況,處理器是不需要在TSS中去尋找低特權級目标棧的。其中一個原因我想您已經猜到了:TSS中隻記錄2、1、0特權級的棧,假如是從2特權級返回到3特權級,上哪找3特權級的棧?另一方面的原因是,低特權級棧的地址其實已經存在了,這是由處理器的向高特權級轉移指令(如int、call等)實現的機制決定的,換句話說,處理器知道去哪裡找低特權級的目标棧,等我把後面内容“啰嗦完”您就知道了。

由于特權級向低轉移後,處理器特權級有了變化,同樣也需要将當前棧更新為低特權級的棧,它如何找到對應的低特權級棧呢。正常情況下,特權級是由低向高轉移在先,由高向低返回在後,即隻有先向更高特權級轉移,才能談得上再從高特權級回到低特權級,否則沒有“去”就談不上“回”(甯可被罵啰嗦我也要說清楚)。當處理器由低向高特權級轉移時,它自動地把當時低特權級的棧地址(SS和ESP)壓入了轉移後的高特權級所在的棧中(随着以後深入學習大家會明白這一點),所以,當用返回指令如retf或iret從高特權級向低特權級返回時,處理器可以從當前使用的高特權級的棧中獲取低特權級的棧段選擇子及偏移量。由高特權級返回低特權級的過程稱為“向外層轉移”。

當下次處理器再進入到高特權級時,它依然會在TSS中尋找對應的高特權級棧,而TSS中棧指針值都是固定的,每次進入高特權級都會用重複使它們。也就是說,即使曾經轉移到高特權級下用過高特權級棧,處理器也不會自動把該高特權級棧指針更新到TSS中,因為在從高特權級返回時,處理器需要把棧更新為低特權級的棧選擇子及esp指針,而原先在段寄存器SS和寄存器esp中高特權級下的棧段選擇子及指針會被處理器自動丢棄。換句話說,如果想保留上一次高特權級的棧指針,咱們得自己手動更新TSS中相應棧的數據。

對啦,有沒有同學有疑問,上面光說處理器從TSS中找更高特權級的棧地址,那處理器是怎樣找到TSS的?

TSS是硬件支持的系統數據結構,它和GDT等一樣,由軟件填寫其内容,由硬件使用。GDT也要加載到寄存器GDTR中才能被處理器找到,TSS也是一樣,它是由TR(Task Register)寄存器加載的,每次處理器執行不同任務時,将TR寄存器加載不同任務的TSS就成了。至于怎麼加載以及相關工作原理,目前咱們用不到,還是放在後面說比較合适。

您看,正是由于處理器提供了硬件方面的框架,所以很多工作都是“自動”完成的,雖然操作系統看上去很底層的樣子,但其實也屬于“應用型”開發。

好啦,TSS中有關特權級的内容就說到這,為了不幹擾大家學習特權級,TSS的其它方面将會在後續章節中逐步說明。

【再續】

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved