日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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


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


目錄


  • 門描述符


  • 調用門特權級檢查規(guī)則


  • 調用門的使用過程


    • 安裝調用門


    • 把調用門告訴用戶程序


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


    • 棧在不同特權級下的切換


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


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


一旦引入了特權級別,上面這樣的調用方式就行不通了。


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


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


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


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


這篇文章,我們就一起來學習調用門的機制,順帶著把所有的門描述符也一起介紹下。


門描述符

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


在x86中,有下面這些門:


調用門:用于低特權級代碼轉移到高特權級代碼;


任務門:用于不同任務之間的調度;


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


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


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


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


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


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


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


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


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


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


關于任務門中的TSS選擇子:


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


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


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


a. 保存當前 CPU 中的上下文到當前任務的 TSS 段中;


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


調用門特權級檢查規(guī)則

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


再來看一下它的描述符結構:


參數(shù)個數(shù):調用者傳遞多少個參數(shù)給目標代碼(是通過棧空間來傳參的);


DPL:表示這個調用門本身的特權級;


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


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


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


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


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


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


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


如果特權級檢查被通過,進入目標代碼段之后,當前特權級CPL是否會改變呢?


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


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


TYPE.C = 0: CPL 改變,變成目標代碼段的特權級;


調用門的使用過程

安裝調用門

所謂的安裝,就是在GDT中構造一個調用門描述符,讓它的目標代碼段選擇子指向真正的代碼段。


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


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


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


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


把調用門的選擇子告訴用戶程序

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


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


RPL = 3;


到 GDT 中去查找;


索引號 index = 8;


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

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


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


  2. 調用門自身的 DPL = 3;


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


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


棧的切換

x86處理器要求:當前特權級 CPL 必須與目標棧段的 DPL 相同。


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


1. 如果特權級 CPL 沒有變化


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


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


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


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


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


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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉