国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
網(wǎng)易科技頻道--基于i386體系結(jié)構(gòu)的Linux實(shí)現(xiàn)特點(diǎn)剖析——內(nèi)存與進(jìn)程
1、基本框架
Linux內(nèi)核的設(shè)計要考慮到在各種不同的微處理器上的實(shí)現(xiàn),還有考慮到在64位的微處理器(如Alpha)上的實(shí)現(xiàn),所以不能僅僅針對i386結(jié)構(gòu)來設(shè)計它的映射機(jī)制,而要以只要假象的、虛擬的微處理器和MMU(內(nèi)存管理單元)為基礎(chǔ),設(shè)計出一種通用的模式,再把它分別落實(shí)到具體的微處理器上。因此,Linux內(nèi)核的映射機(jī)制被設(shè)計成三層,在頁面目錄和頁表之間增設(shè)了一層"中間目錄"。在代碼中,頁面目錄稱為PGD,中間目錄稱為PMD,而頁表稱為PT。PT的表項稱為PTE。PGD,PMD,PT均為數(shù)組,相應(yīng)的,在邏輯上也把線性地址從高到低分為4各位段,個占若干位,分別用作目錄PGD的下標(biāo)、中間目錄PMD的下標(biāo)、頁表中的下標(biāo)和物理頁面內(nèi)的位移。
就i386微處理器來說,CPU實(shí)際上不是按三層而是按兩層的模型來進(jìn)行地址映射,這就需要將虛擬的三層映射落實(shí)到具體的兩層的映射,跳過中間的PMD層次。
2、地址映射的全過程
i386微處理器一律對程序中的地址先進(jìn)行段式映射,然后才能進(jìn)行頁式映射。而Linux所采用的方法實(shí)際上使段式映射的過程中不起什么作用。
下面通過一個簡單的程序來看看Linux下的地址映射的全過程:
#include greeting() { printf(“Hello world! ”); } main() { greeing(); }
該程序在主函數(shù)中調(diào)用greeting 來顯示"Hello world!",經(jīng)過編譯和反匯編,我們得到了它的反匯編的結(jié)果。
08048568: 8048568: 55 push1 %ebp 8048856b:89 e5 mov1 %esp,%ebp 804856b: 68 04 94 04 08 push1 $0x8048404 8048570: e8 ff fe ff ff call 8048474 <_init+0x84> 8048575: 83 c4 04 add1 $0x4,%esp 8048578: c9 leave 8048579: c3 ret 804857a: 89 f6 mov1 %esi,%esi 0804857c : 804857c: 55 push1 %ebp 804857d: 89 e5 mov1 %esp,%ebp 804857f: e8 e4 ff ff ff call 8048568 8048584: c9 leave 8048585: c3 ret 8048586: 90 nop 8048587: 90 nop
從上面可以看出,greeting()的地址為0x8048568。在elf格式的可執(zhí)行代碼中,總是在0x8000000開始安排程序的"代碼段",對每個程序都是這樣。
當(dāng)程序在main中執(zhí)行到了"call 8048568"這條指令,要轉(zhuǎn)移到虛擬地址8048568去。
首先是段式映射階段。地址8048568是一個程序的入口,更重要的是在執(zhí)行的過程中有CPU的EIP所指向的,所以在代碼段中。I386cpu使用CS的當(dāng)前值作為段式映射的選擇子。
內(nèi)核在建立一個進(jìn)程時都要將其段寄存器設(shè)置好,把DS、ES、SS都設(shè)置成_USER_DS,而把CS設(shè)置成_USER_CS,這也就是說,在Linux內(nèi)核中堆棧段和代碼段是不分的。
Index TI DPL #define_KERNEL_CS 0x10 0000 0000 0001 0|0|00 #define_KERNEL_DS 0x18 0000 0000 0001 1|0|00 #define_USER_CS 0x23 0000 0000 0010 0|0|11 #define_USER_DS 0x2B 0000 0000 0010 1|0|11 _KERNEL_CS: index=2,TI=0,DPL=0 _KERNEL_DS: index=3,TI=0,DPL=0 _USERL_CS: index=4,TI=0,DPL=3 _USERL_DS: index=5,TI=0,DPL=3
TI全都是0,都使用全局描述表。內(nèi)核的DPL都為0,最高級別;用戶的DPL都是3,最低級別。_USER_CS在GDT表中是第4項,初始化GDT內(nèi)容的代碼如下:
ENTRY(gdt-table) .quad 0x0000000000000000 /* NULL descriptor */ .quad 0x0000000000000000 /* not used */ .quad 0x00cf9a00000ffff /* 0x10 kernel 4GB code at 0x00000000 */ .quad 0x00cf9200000ffff /* 0x18 kernel 4GB data at 0x00000000 */ .quad 0x00cffa00000ffff /* 0x23 user 4GB code at 0x00000000 */ .quad 0x00cff200000ffff /* 0x2b user 4GB data at 0x00000000 */ GDT 表中第一、二項不用,第三至第五項共四項對應(yīng)于前面的四個段寄存器的數(shù)值。 將這四個段描述項的內(nèi)容展開: K_CS: 0000 0000 1100 1111 1001 1010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 K_DS: 0000 0000 1100 1111 1001 0010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 U_CS: 0000 0000 1100 1111 11111 1010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 U_DS: 0000 0000 1100 1111 1111 0010 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
這四個段描述項的下列內(nèi)容都是相同的。
·BO-B15/B16-B31 都是0 基地址全為0 ·LO-L15、L16-L19都是1 段的界限全是0xfffff ·G位都是1 段長均為4KB ·D位都是1 32位指令 ·P位都是1 四個段都在內(nèi)存中 不同之處在于權(quán)限級別不同,內(nèi)核的為0級,用戶的為3級。
由此可知,每個段都是從地址0開始的整個4GB地虛存空間,虛地址到線性地址的映射保持原值不變。
再回到greeting 的程序中來,通過段式映射把地址8048568映射到自身,得到了線性地址。
每個進(jìn)程都有自身的頁目錄PGD,每當(dāng)調(diào)度一個進(jìn)程進(jìn)入運(yùn)行時,內(nèi)核都要為即將運(yùn)行的進(jìn)程設(shè)置好控制寄存器CR3,而MMU硬件總是從CR3中取得當(dāng)前進(jìn)程的頁目錄指針。
當(dāng)程序要轉(zhuǎn)到地址0x8048568去的時候,進(jìn)程正在運(yùn)行中,CR3已經(jīng)設(shè)置好了,指向本進(jìn)程的頁目錄了。
8048568: 0000 1000 0000 0100 1000 0101 0110 1000
按照線性地址的格式,最高10位 0000100000,十進(jìn)制的32,就以下標(biāo)32去頁目錄表中找其頁目錄項。這個頁目錄項的高20位后面添上12個0就得到該頁面表的指針。找到頁表后,再看線性地址的中間10位001001000,十進(jìn)制的72。就以72為下標(biāo)在找到的頁表中找到相應(yīng)的表項。頁面表項重的高20位后添上12個0就得到了物理內(nèi)存頁面的基地址。線性地址的底12位和得到的物理頁面的基地址相加就得到要訪問的物理地址。
3 地址映射的效率分析
在頁式映射的過程中,CPU要訪問內(nèi)存三次,第一次是頁面目錄,第二次是頁面表,第三次才是真正要訪問的目標(biāo)。這樣,把原來不用分頁機(jī)制一次訪問內(nèi)存就能得到的目標(biāo),變?yōu)槿卧L問內(nèi)存才能得到,明顯執(zhí)行分頁機(jī)制在效率上的犧牲太大了。
為了減少這種開銷,最近被執(zhí)行過的地址轉(zhuǎn)換結(jié)果會被保留在MMU的轉(zhuǎn)換后備緩存(TLB)中。雖然在第一次用到具體的頁面目錄和頁面表時要到內(nèi)存中讀取,但一旦裝入了TLB中,就不需要再到內(nèi)存中去讀取了,而且這些都是由硬件完成的,因此速度很快。
TLB對應(yīng)權(quán)限大于0級的程序來說是不可見的,只有處于系統(tǒng)0層的程序才能對其進(jìn)行操作。
當(dāng)CR3的內(nèi)容變化時,TLB中的所有內(nèi)容會被自動變?yōu)闊o效。Linux中的_flush_tlb宏就是利用這點(diǎn)工作的。_flush_tlb只是兩條匯編指令,把CR3的值保存在臨時變量tmpreg里,然后立刻把tmpreg的值拷貝回CR3,這樣就將TLB中的全部內(nèi)容置為無效。除了無效所有的TLB中的內(nèi)容,還能有選擇的無效TLB中某條記錄,這就要用到INVLPG指令。
進(jìn)程管理
1.I386硬件任務(wù)切換機(jī)制
Intel 在i386體系的設(shè)計中考慮到了進(jìn)程的管理和調(diào)度,并從硬件上支持任務(wù)間的切換。為此目的,Intel在i386系統(tǒng)結(jié)構(gòu)中增設(shè)了一種新的段"任務(wù)狀態(tài)段"TSS。一個TSS雖然說像代碼段,數(shù)據(jù)段等一樣,也是一個段,實(shí)際上卻是一個104字節(jié)的數(shù)據(jù)結(jié)構(gòu),用以記錄一個任務(wù)的關(guān)鍵性的狀態(tài)信息。
像其他段一樣,TSS也要在段描述表中有個表項。不過TSS只能在GDT中,而不能放在任何一個LDT中或IDT中。若通過一個段選擇項訪問一個TSS,而選擇項中的TI位為1,就會產(chǎn)生一次GP異常。
另外,CPU中還增設(shè)一個任務(wù)寄存器TR,指向當(dāng)前任務(wù)的TSS。相應(yīng)地,還增加了一條指令LTR,對TR寄存器進(jìn)行裝入操作。像CS和DS一樣,TR也有一個程序不可見部分,每當(dāng)將一個段選擇碼裝入到TR中時,CPU就會自動找到所選擇的TSS描述項并將其裝入到TR的程序不可見部分,以加速以后對該TSS段的訪問。
還有,在IDT表中,除了中斷門、陷阱門和調(diào)用門以為,還定義了一種任務(wù)門。任務(wù)門中包含一個TSS段選擇碼。當(dāng)CPU因中斷而穿過一個任務(wù)門時,就會將任務(wù)門中的選擇碼自動裝入TR,使TR指向新的TSS,并完成任務(wù)的切換。CPU還可以通過JMP和CALL指令實(shí)現(xiàn)任務(wù)切換,當(dāng)跳轉(zhuǎn)或調(diào)用的目標(biāo)段實(shí)際上指向GDT表中的一個TSS描述項時,就會引起一次任務(wù)切換。
2. Linux的任務(wù)切換和現(xiàn)場保護(hù)
Intel 關(guān)于任務(wù)切換的設(shè)計十分的周到,而且提供了十分簡潔的任務(wù)切換機(jī)制。但是,Linux并不采用i386硬件提供的任務(wù)切換機(jī)制。 Linux之所以這樣做,很大程度是從效率的角度考慮。有CPU自動完成的這種任務(wù)切換并不是只相當(dāng)于一條指令。實(shí)際上,i386中通過JMP指令或CALL指令完成任務(wù)切換的過程是一個相當(dāng)復(fù)雜的過程,其執(zhí)行過程長達(dá)300多個CPU時鐘周期。在執(zhí)行過程,CPU實(shí)際上做了所有需要做的事,而其中有的事在一定條件下可以簡化的,有的事則可能在一定條件下應(yīng)該按不同的方式組合。所以,i386CPU所提供的這種任務(wù)切換機(jī)制就好像是一種"高級語言"的成分。但對應(yīng)操作系統(tǒng)的設(shè)計和實(shí)現(xiàn)而言,往往會選擇"匯編語言"來實(shí)現(xiàn)這個機(jī)制,以達(dá)到更高的效率和更大的靈活性。更重要的是,任務(wù)的切換往往不是孤立的,常常跟其他操作聯(lián)系緊密。
Linux內(nèi)核為了滿足i386CPU的要求,只是在初始化的時候設(shè)置TR,使之指向一個TSS,從此以后就不再修改TR的值。也就是說,每個CPU在初始化以后就永遠(yuǎn)使用同一個TSS。同時,內(nèi)核也不依靠TSS保存每個進(jìn)程切換時的寄存器副本,而是將這些寄存器的副本保存在各自進(jìn)程的系統(tǒng)空間堆棧中。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
[原創(chuàng)]X86內(nèi)核筆記
多核處理器上的MMU和TLB
進(jìn)程調(diào)度
分段與分頁機(jī)制小結(jié)
操作系統(tǒng)--特權(quán)級切換
Linux內(nèi)存管理圖解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服