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

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

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


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


目錄


  • 門描述符


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


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


    • 安裝調(diào)用門


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


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


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


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


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


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


因?yàn)橛脩舫绦虻奶貦?quán)級(jí)一定比操作系統(tǒng)的特權(quán)級(jí)別,所以即使用戶程序能夠知道函數(shù)的段選擇子和偏移地址,操作系統(tǒng)也會(huì)禁止用戶程序跳轉(zhuǎn)進(jìn)去。


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


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


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


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


門描述符

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


在x86中,有下面這些門:


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


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


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


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


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


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


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


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


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


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


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


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


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


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


  2. 因?yàn)橐粋€(gè) TSS 段中,保存的就是一個(gè)任務(wù)的上下文信息快照。


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


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


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


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

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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

安裝調(diào)用門

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


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


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


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


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


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

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


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


RPL = 3;


到 GDT 中去查找;


索引號(hào) index = 8;


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

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


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


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


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


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


棧的切換

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


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


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


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


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


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


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


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


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

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

關(guān)鍵字: 驅(qū)動(dòng)電源

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

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

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

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

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

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

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

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

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

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

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

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉