當(dāng)前位置:首頁 > 公眾號精選 > IOT物聯(lián)網(wǎng)小鎮(zhèn)
[導(dǎo)讀]作?者:道哥,10年嵌入式開發(fā)老兵,專注于:C/C、嵌入式、Linux。關(guān)注下方公眾號,回復(fù)【書籍】,獲取Linux、嵌入式領(lǐng)域經(jīng)典書籍;回復(fù)【PDF】,獲取所有原創(chuàng)文章(PDF格式)。目錄門描述符調(diào)用門特權(quán)級檢查規(guī)則調(diào)用門的使用過程安裝調(diào)用門把調(diào)用門告訴用戶程序用戶程序通過調(diào)用...

作  者:道哥,10 年嵌入式開發(fā)老兵,專注于:C/C 、嵌入式、Linux。


關(guān)注下方公眾號,回復(fù)【書籍】,獲取 Linux、嵌入式領(lǐng)域經(jīng)典書籍;回復(fù)【PDF】,獲取所有原創(chuàng)文章( PDF 格式)。


目錄


  • 門描述符


  • 調(diào)用門特權(quán)級檢查規(guī)則


  • 調(diào)用門的使用過程


    • 安裝調(diào)用門


    • 把調(diào)用門告訴用戶程序


    • 用戶程序通過調(diào)用門進入系統(tǒng)函數(shù)


    • 棧在不同特權(quán)級下的切換


在之前的文章中Linux從頭學(xué)10:三級跳過程詳解-從 bootloader 到 操作系統(tǒng),再到應(yīng)用程序,由于當(dāng)時沒有引入特權(quán)級的概念,用戶程序和操作系統(tǒng)都工作在相同的特權(quán)級,因此可以直接通過[段選擇子:偏移量] 的方式,來調(diào)用屬于操作系統(tǒng)代碼段中的函數(shù),如下所示:


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】用戶程序header中橙色部分的信息,表示操作系統(tǒng)提供的2個系統(tǒng)函數(shù),位于操作系統(tǒng)的哪個段描述符中,偏移地址是多少。


一旦引入了特權(quán)級別,上面這樣的調(diào)用方式就行不通了。


因為用戶程序的特權(quán)級一定比操作系統(tǒng)的特權(quán)級別,所以即使用戶程序能夠知道函數(shù)的段選擇子和偏移地址,操作系統(tǒng)也會禁止用戶程序跳轉(zhuǎn)進去。


例如:應(yīng)用程序的 CPL 和 RPL 都為 3,而操作系統(tǒng)中的函數(shù)所在的段 DPL = 0,不能通過特權(quán)級的檢查。


看過上一篇文章的小伙伴一定知道,如果把目標(biāo)代碼段的描述符中,TYPE.C標(biāo)志設(shè)置為1,也就意味著這是一個依從(或者叫一致性)代碼段,就允許低特權(quán)級的用戶程序調(diào)用了。


除了這個方法之外,處理器還提供了另外一種更“正規(guī)”的方式,來實現(xiàn)低特權(quán)級的代碼轉(zhuǎn)移到高特權(quán)級的代碼,這就是:調(diào)用門


這篇文章,我們就一起來學(xué)習(xí)調(diào)用門的機制,順帶著把所有的門描述符也一起介紹下。


門描述符

所謂的門,就是一個通道。通過這個通道,可以進入另一個代碼段中進行執(zhí)行。


在x86中,有下面這些門:


調(diào)用門:用于低特權(quán)級代碼轉(zhuǎn)移到高特權(quán)級代碼;


任務(wù)門:用于不同任務(wù)之間的調(diào)度;


中斷門:用于異步執(zhí)行中斷處理程序;


陷阱門:也用于執(zhí)行中斷處理程序,不過這里的中斷是處理器內(nèi)部產(chǎn)生的;


門描述符與之前介紹的段描述符本質(zhì)是一樣的,都是用來描述一個代碼段的信息,只不過門描述符增加了一層間接性


下面是4個門描述符的結(jié)構(gòu)(32位系統(tǒng)):


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】從以上這4個門描述符的結(jié)構(gòu)中可以看出: 它們并沒有直接記錄目標(biāo)代碼段的開始地址和界限,而是記錄了目標(biāo)代碼段的選擇子。


也就是說:先通過門描述符找到代碼段選擇子,然后再用這個選擇子到 GDT 中去查找真正的目標(biāo)代碼段描述符,最終找到目標(biāo)代碼段的開始地址和界限、屬性等信息,也就是下面這個結(jié)構(gòu):


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】所以說,這些門就是增加了一層間接性。


這層間接性,為操作系統(tǒng)提供了諸多好處。


首先,對于中斷處理來說,把所有的中斷描述符放在一個表中,可以對中斷處理程序的地址進行解耦。


其次,對于執(zhí)行代碼段的轉(zhuǎn)移來說,可以利用門來提供更靈活的特權(quán)級別控制,實現(xiàn)更加復(fù)雜的操作。


關(guān)于任務(wù)門中的TSS選擇子:


  1. 所謂的任務(wù)門可以簡單理解為用于任務(wù)切換。


  2. 因為一個 TSS 段中,保存的就是一個任務(wù)的上下文信息快照。


  3. 只要處理器發(fā)現(xiàn)選擇子指向的描述符是一個任務(wù)門(通過 TYPE 字段),它就執(zhí)行任務(wù)切換:


a. 保存當(dāng)前 CPU 中的上下文到當(dāng)前任務(wù)的 TSS 段中;


b. 再把 TSS 選擇子中所指向的那個 TSS 段中的上下文內(nèi)容,加載到 CPU 寄存器中,這樣就實現(xiàn)了任務(wù)切換。


調(diào)用門特權(quán)級檢查規(guī)則

從調(diào)用門的名字就可以看出,它是為系統(tǒng)調(diào)用服務(wù)的。


再來看一下它的描述符結(jié)構(gòu):


參數(shù)個數(shù):調(diào)用者傳遞多少個參數(shù)給目標(biāo)代碼(是通過??臻g來傳參的);


DPL:表示這個調(diào)用門本身的特權(quán)級;


目標(biāo)代碼段選擇子:最終調(diào)用的目標(biāo)代碼段的選擇子,需要用這個選擇子到 GDT 中尋找目標(biāo)代碼段的基地址;


偏移量:調(diào)用的代碼距離目標(biāo)代碼段開始地址的偏移字節(jié)數(shù);


從以上這些字段來看,這簡直就是為:從低特權(quán)級的用戶代碼,調(diào)用高特權(quán)級的操作系統(tǒng)代碼,量身定做的,只要處理器在特權(quán)級上放過用戶程序一馬就可以了。


事實上也正是如此:當(dāng)用戶請求調(diào)用門時,操作系統(tǒng)會進行如下特權(quán)級檢查


  1. 當(dāng)前特權(quán)級 CPL (用戶程序)和請求特權(quán)級 RPL,必須 [高于或等于] 調(diào)用門中的 DPL;
即在數(shù)值上:CPL <= DPL,RPL <= DPL。(注意:這是調(diào)用門描述符里的 DPL)


  1. 當(dāng)前特權(quán)級 CPL(用戶程序),必須 [低于或等于] 目標(biāo)代碼段中的 DPL;
即在數(shù)值上:CPL >= 目標(biāo)代碼段描述符中的 DPL。


從以上規(guī)則可以再次看出:即使通過調(diào)用門,目標(biāo)代碼段只允許相同或者更低的特權(quán)級代碼進入,也驗證了之前所說的:高特權(quán)級代碼不會主動轉(zhuǎn)移到低特權(quán)級的代碼中。


如果特權(quán)級檢查被通過,進入目標(biāo)代碼段之后,當(dāng)前特權(quán)級CPL是否會改變呢?


這就依賴于目標(biāo)代碼段描述符中的TYPE字段中的C標(biāo)志位的值:


TYPE.C = 1:CPL 保持不變,仍然為用戶程序中的特權(quán)級 3;


TYPE.C = 0: CPL 改變,變成目標(biāo)代碼段的特權(quán)級;


調(diào)用門的使用過程

安裝調(diào)用門

所謂的安裝,就是在GDT中構(gòu)造一個調(diào)用門描述符,讓它的目標(biāo)代碼段選擇子指向真正的代碼段。


假設(shè):下面這張圖是安裝調(diào)用門之前的狀態(tài):


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】操作系統(tǒng)提供2個系統(tǒng)函數(shù)給用戶程序調(diào)用,它們的代碼位于獨立的一個代碼段中(在GDT中有一個代碼段描述符)。


然后在GDT中,新增一個門描述符(index = 8),描述符中的“目標(biāo)代碼段選擇子”中的索引號,就等于7:


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】注意:根據(jù)前文提到到特權(quán)級檢查規(guī)則,為了讓用戶程序能正確進入調(diào)用門,需要把調(diào)用門描述符的DPL設(shè)置為3才可以(與用戶程序的CPL相同)。


把調(diào)用門的選擇子告訴用戶程序

按照之前的慣例,操作系統(tǒng)可以在用戶程序的頭部header中的約定位置處,填寫調(diào)用們的選擇子以及函數(shù)偏移地址:


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】選擇子的數(shù)值為:0x0043(二進制:0000_0000_0100_0011):


RPL = 3;


到 GDT 中去查找;


索引號 index = 8;


用戶程序通過調(diào)用門進入系統(tǒng)函數(shù)

當(dāng)用戶程序請求調(diào)用系統(tǒng)函數(shù)時,處理器就開始對這3 方的特權(quán)級展開檢查:


  1. 用戶程序的 CPL = 3, RPL = 3;


  2. 調(diào)用門自身的 DPL = 3;


  3. 調(diào)用門中的目標(biāo)代碼段選擇子所指向的描述符(index = 7)中 DPL = 0;


以上這些特權(quán)級的數(shù)值滿足調(diào)用門的特權(quán)級規(guī)則要求,于是就進入系統(tǒng)函數(shù)所在的代碼中執(zhí)行了。


棧的切換

x86處理器要求:當(dāng)前特權(quán)級 CPL 必須與目標(biāo)棧段的 DPL 相同。


因此,用戶程序在進入操作系統(tǒng)中的系統(tǒng)函數(shù)之后:


1. 如果特權(quán)級 CPL 沒有變化


那么在系統(tǒng)函數(shù)執(zhí)行的時候,使用的棧仍然是用戶程序之前所使用的那個棧空間。


如果用戶程序通過棧傳遞了參數(shù),系統(tǒng)函數(shù)可以直接在同一個??臻g中獲取到這些參數(shù)。


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】2. 如果特權(quán)級 CPL 發(fā)生了變化


那么在系統(tǒng)函數(shù)執(zhí)行的時候,就需要切換到用戶程序在0 特權(quán)級下的??臻g(操作系統(tǒng)在加載用戶程序的時候,就提前準(zhǔn)備好了)。


同時,處理器會把用戶程序在3 特權(quán)級下使用的??臻g中的參數(shù),全部復(fù)制到0 特權(quán)級下的??臻g中,這樣的話,系統(tǒng)函數(shù)就可以正確獲取到這些參數(shù)了。


Linux從頭學(xué)13:想徹底搞懂“系統(tǒng)調(diào)用”的底層原理?建議您別錯過這篇【調(diào)用門】
------ End ------
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉