進(jìn)來(lái)忙得不得了,這時(shí)才體會(huì)出工作和在學(xué)校真的不同.有時(shí)候自己想做的事,很難如愿.不過(guò)我這一段時(shí)間沒有太偷懶.對(duì)于linux 的386 保護(hù)模式,內(nèi)存管理,作了一個(gè)初步的學(xué)習(xí).當(dāng)初學(xué)習(xí)操作系統(tǒng)課時(shí)老覺得理論沒用. 如今,真的時(shí)間了,才知道理論知識(shí)是多么的缺乏.也許是書到用時(shí)方恨少
閑話少說(shuō)
目前,linux 被移植到了各種機(jī)器上.如apple 等.但我個(gè)人認(rèn)為linux的真正魅力.還是在i386機(jī)器上.因?yàn)閘linus前輩在寫linux 時(shí)的初衷,就是在386 平臺(tái)上實(shí)現(xiàn)類unix的os
linux使用了intel 80386系列處理器的”保護(hù)模式”.操作系統(tǒng)的資源的管理和分配.由80386硬件存儲(chǔ)管理和保護(hù)機(jī)制實(shí)現(xiàn)
虛擬存儲(chǔ)器,是一種擴(kuò)種內(nèi)存的設(shè)計(jì)方案.他來(lái)源于當(dāng)初主存非常昂貴的年代.用到了程序的局部性原則,即程序在運(yùn)行時(shí)沒有必要全部裝入內(nèi)存.支部當(dāng)前要運(yùn)行的那一部分調(diào)入內(nèi)存即可
實(shí)際上,整個(gè)存儲(chǔ)系統(tǒng)是 由 高速緩存--- 內(nèi)存--- 硬盤 等多級(jí)存儲(chǔ)介質(zhì)構(gòu)成的,但這對(duì)程序原始透明的,比如我們?cè)诔绦蛑袌?zhí)行這樣一天指令
mov bx ,1997
mov ax ,[bx]
這樣地址是1997 的內(nèi)容背拷貝到了ax ,這樣由程序產(chǎn)生的地址時(shí)虛地址.這個(gè)地址與實(shí)際的物理地址是不同的.要有這個(gè)地址轉(zhuǎn)換到實(shí)際的物理地址,就需要有一個(gè)轉(zhuǎn)換機(jī)制.通常叫做MMU的硬件單元完成這個(gè)任務(wù)
所謂的保護(hù)機(jī)制就是在這個(gè)基礎(chǔ)上進(jìn)行的.它的目的是要使不同的程序段互不干涉.系統(tǒng)進(jìn)程與用戶進(jìn)程嚴(yán)格分開已達(dá)到系統(tǒng)安全與多用戶多進(jìn)程的要求.在linux 中通過(guò)給不同的任務(wù)分配不同的虛擬地址到物理地址的映射.來(lái)實(shí)現(xiàn)不同任務(wù)的切換與保護(hù).同時(shí).linux “可能”是把系統(tǒng)進(jìn)程與用戶進(jìn)程分開(我不太確定,可能是把系統(tǒng)進(jìn)程的地址控制在100000以內(nèi)?,當(dāng)然在iipv通行中的共享內(nèi)存,由于操作不當(dāng)可能產(chǎn)生不可預(yù)料的后果).
另外,linux對(duì)統(tǒng)一任務(wù)也進(jìn)行了不同程度的保護(hù).它使用優(yōu)先級(jí)來(lái)決定的.比如內(nèi)核的優(yōu)先級(jí)是0,系統(tǒng)調(diào)用 :1 庫(kù):2 用戶進(jìn)程3.在程序?qū)δ骋粋€(gè)數(shù)據(jù)段進(jìn)行讀寫的時(shí)候,.應(yīng)縣檢查優(yōu)先級(jí),.在決定它運(yùn)行的優(yōu)先級(jí)或存取權(quán)限.
我想,這個(gè)優(yōu)先級(jí)一定會(huì)和struct_task 的某些表示調(diào)度優(yōu)先級(jí)的參數(shù)關(guān)聯(lián).
對(duì)于內(nèi)存管理,通常是有段式,頁(yè)式和段頁(yè)式三種方式.在這里討論的使者兩種方式的虛擬-物理轉(zhuǎn)換機(jī)制的不同.因?yàn)閘inux實(shí)行的是段頁(yè)式內(nèi)存管理.因此這兩種映射機(jī)制,也就必須都存在
段式管理,使用了一系列的可改變大小的地址集合進(jìn)行管理.它的好處是,可以充分利用物理內(nèi)存.缺點(diǎn)是難以管理,
通常在c 中 我們可以這樣定義一個(gè)段(此定義只是解釋段的概念,linux中絕不是如此)
typedef stucrt duan
{
struct duan * next ,*PRe ;/*所所需指針*/
int tag;
iint begin ,end /*始末點(diǎn)*/
int size;
data data ; /*內(nèi)容*/
……..
}
以上實(shí)在是實(shí)際內(nèi)存中可能用到的段的數(shù)據(jù)結(jié)構(gòu).而我們?cè)诒Wo(hù)模式中,所謂的段是保護(hù)管理.大體上和匯編語(yǔ)言中基址尋址有些相似:他是實(shí)現(xiàn)虛擬-物理地址轉(zhuǎn)換的基礎(chǔ)(說(shuō)白了,我個(gè)人認(rèn)為,把所有的段定義成一樣大就是頁(yè),不過(guò)實(shí)際上我還沒看linux 是怎樣做的,所以千萬(wàn)不要被我誤導(dǎo))
段 有一個(gè)基址 (base address)規(guī)定了在線性物理內(nèi)存中的開始地址
有一個(gè)限制位,(limit) 表示段內(nèi)最大偏移量,(也就是大小)
段的屬性 (attribute) 表示該段是否會(huì)被讀寫
這3 個(gè)屬性,包含在段的描述符中
所謂的描述符.是一個(gè)8個(gè)子節(jié)的存儲(chǔ)單元,其結(jié)構(gòu)大概如下:
字節(jié)0 -----0—7 位描述苻
字節(jié)1 ------8—15位描述符
字節(jié)2 -----0—7 位基址
字節(jié)3 -----8—15 位基址
字節(jié)4 -----16—24 段基址
字節(jié)5 -----存儲(chǔ)權(quán)限的字節(jié)
字節(jié)6 -----G| D|0|0| 16-19位段界限
字節(jié)7 -----31-—24 段基址
其中第五個(gè)字節(jié),是存取權(quán)字節(jié),它包含有好幾個(gè)標(biāo)志位,用來(lái)標(biāo)志該段是在內(nèi)存中,還是沒有.后者該段是用戶段或者是系統(tǒng)段之類的.被人水平有限.在此不一一說(shuō)明.希望有興趣的朋友可以查一下資料,將給我們大家聽
在系統(tǒng)段中.有一個(gè)字節(jié).可以來(lái)定義系統(tǒng)段的類型,好像是有16類 像標(biāo)志為有效的386.TSS,386中斷門,386陷阱門等等,在此不一一介紹.在此要弄清楚兩個(gè)名次 TSS(系統(tǒng)狀態(tài)標(biāo)) LDT(局部描述標(biāo)),在相關(guān)的資料中,經(jīng)常會(huì)碰到
在LINUX的內(nèi)核中有一系列的描述苻表.像全局描述苻表(GDT),中斷描述苻表(IDT)還有上面介紹的LDT等等,在他們中間.定義了系統(tǒng)可用的描述苻,中斷門,等等.它的作用是使得機(jī)器的兼容性得到保證
在LDT 中.則定義了一些和具體的任務(wù)相聯(lián)系的代碼段,數(shù)據(jù)段等等.描述苻表的內(nèi)數(shù)據(jù)結(jié)構(gòu)大致如下:
typedef struct desc_struct
{
unsigned long a,b;
}
后面用以下兩行完成了描述苻表的定義以及外部描述苻的定義:
desc_table[256]; //定義了可以在局部描述苻表中的最大描述苻量
extern dessc_table idt,gdt //外部的描述變量
至此,關(guān)于linux的分段機(jī)制大體上節(jié)講解完畢了,剩下的就是在寄存器與選擇器之間的映射,還有一些尋址方法
這部分內(nèi)容,大概和<<匯編語(yǔ)言>>中講的大同小異,在此不多費(fèi)唇舌
新聞熱點(diǎn)
疑難解答
圖片精選