一。x86實(shí)模式介紹
x86體系的處理器剛開(kāi)始時(shí)只有20根地址線,尋址寄存器是16位。我們知道16位的寄存器可以訪問(wèn)64K的地址空間,如果程序要想訪問(wèn)大于64K的內(nèi)存,就需要把內(nèi)存分段,每段64K,用段地址+偏移量的方式來(lái)訪問(wèn),這樣使20根地址線全用上,最大的尋址空間就可以到1M字節(jié),這在當(dāng)時(shí)已經(jīng)是非常大的內(nèi)存空間了。
二。實(shí)模式的問(wèn)題與保護(hù)模式的出現(xiàn)
事實(shí)上,實(shí)模式將整個(gè)物理內(nèi)存看成分段的區(qū)域,程序代碼和數(shù)據(jù)位于不同區(qū)域,系統(tǒng)程序和用戶程序并沒(méi)有區(qū)別對(duì)待,而且每一個(gè)指針都是指向?qū)嶋H的物理地址。這樣一來(lái),用戶程序的一個(gè)指針如果指向了系統(tǒng)程序區(qū)域或其他用戶程序區(qū)域,并修改了內(nèi)容,那么對(duì)于這個(gè)被修改的系統(tǒng)程序或用戶程序,其后果就很可能是災(zāi)難性的。再者,隨著軟件的發(fā)展,1M的尋址空間已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足實(shí)際的需求了。最后,對(duì)處理器多任務(wù)支持需求也日益緊迫,所有這些都促使新技術(shù)的出現(xiàn)。
為了克服實(shí)模式下的內(nèi)存非法訪問(wèn)問(wèn)題,并滿足飛速發(fā)展的內(nèi)存尋址和多任務(wù)需求,處理器廠商開(kāi)發(fā)出保護(hù)模式。在保護(hù)模式中,除了內(nèi)存尋址空間大大提高;提供了硬件對(duì)多任務(wù)的支持;物理內(nèi)存地址也不能直接被程序訪問(wèn),程序內(nèi)部的地址(虛擬地址)要由操作系統(tǒng)轉(zhuǎn)化為物理地址去訪問(wèn),程序?qū)Υ艘粺o(wú)所知。至此,進(jìn)程(程序的運(yùn)行態(tài))有了嚴(yán)格的邊界,任何其他進(jìn)程根本沒(méi)有辦法訪問(wèn)不屬于自己的物理內(nèi)存區(qū)域,甚至在自己的虛擬地址范圍內(nèi)也不是可以任意訪問(wèn)的,因?yàn)橛幸恍┨摂M區(qū)域已經(jīng)被放進(jìn)一些公共系統(tǒng)運(yùn)行庫(kù)。這些區(qū)域也不能隨便修改,若修改就會(huì)有出現(xiàn)linux中的段錯(cuò)誤,或Windows中的非法內(nèi)存訪問(wèn)對(duì)話框。
三。386以上處理器的特點(diǎn)
386處理器有三種工作方式:實(shí)模式、保護(hù)模式和虛擬8086模式。
在保護(hù)方式下,全部32條地址線有效,可尋址高達(dá)4G字節(jié)的物理地址空間;擴(kuò)充的存儲(chǔ)器分段管理機(jī)制和可選的存儲(chǔ)器分頁(yè)管理機(jī)制,不僅為存儲(chǔ)器共享和保護(hù)提供了硬件支持,而且為實(shí)現(xiàn)虛擬存儲(chǔ)器提供了硬件支持;支持多任務(wù),能夠快速地進(jìn)行任務(wù)切換和保護(hù)任務(wù)環(huán)境;4個(gè)特權(quán)級(jí)和完善的特權(quán)檢查機(jī)制,既能實(shí)現(xiàn)資源共享又能保證代碼和數(shù)據(jù)的安全和保密及任務(wù)的隔離;支持虛擬8086方式,便于執(zhí)行8086程序。只有在剛剛啟動(dòng)的時(shí)候是實(shí)模式,等到linux操作系統(tǒng)運(yùn)行起來(lái)以后就運(yùn)行在保護(hù)模式。虛擬8086模式是運(yùn)行在保護(hù)模式中的實(shí)模式,為了在32位保護(hù)模式下執(zhí)行純16位程序。它不是一個(gè)真正的CPU模式,還屬于保護(hù)模式。
保護(hù)模式同實(shí)模式的根本區(qū)別是進(jìn)程內(nèi)存受保護(hù)與否??蓪ぶ房臻g的區(qū)別只是這一原因的果。實(shí)模式將整個(gè)物理內(nèi)存看成分段的區(qū)域,程序代碼和數(shù)據(jù)位于不同區(qū)域,系統(tǒng)程序和用戶程序沒(méi)有區(qū)別對(duì)待,而且每一個(gè)指針都是指向“實(shí)在”的物理地址。這樣一來(lái),用戶程序的一個(gè)指針如果指向了系統(tǒng)程序區(qū)域或其他用戶程序區(qū)域,并改變了值,那么對(duì)于這個(gè)被修改的系統(tǒng)程序或用戶程序,其后果就很可能是災(zāi)難性的。為了克服這種低劣的內(nèi)存管理方式,處理器廠商開(kāi)發(fā)出保護(hù)模式。這樣,物理內(nèi)存地址不能直接被程序訪問(wèn),程序內(nèi)部的地址(虛擬地址)要由操作系統(tǒng)轉(zhuǎn)化為物理地址去訪問(wèn),程序?qū)Υ艘粺o(wú)所知。 至此,進(jìn)程(這時(shí)我們可以稱程序?yàn)檫M(jìn)程了)有了嚴(yán)格的邊界,任何其他進(jìn)程根本沒(méi)有辦法訪問(wèn)不屬于自己的物理內(nèi)存區(qū)域,甚至在自己的虛擬地址范圍內(nèi)也不是可以任意訪問(wèn)的,因?yàn)橛幸恍┨摂M區(qū)域已經(jīng)被放進(jìn)一些公共系統(tǒng)運(yùn)行庫(kù)。這些區(qū)域也不能隨便修改,若修改就會(huì)有: SIGSEGV(linux 段錯(cuò)誤);非法內(nèi)存訪問(wèn)對(duì)話框(windows 對(duì)話框)。CPU啟動(dòng)環(huán)境為16位實(shí)模式,之后可以切換到保護(hù)模式。但從保護(hù)模式無(wú)法切換回實(shí)模式
四。保護(hù)模式下的地址轉(zhuǎn)換
通過(guò)采用段地址加偏移量的方式,80386支持的虛擬地址空間可達(dá)64T字節(jié)。但由于實(shí)際物理內(nèi)存的大小可能會(huì)遠(yuǎn)小于虛擬地址空間,所以實(shí)際上虛擬地址中只有部分才可以真正映射到物理存儲(chǔ)器。同時(shí)由于每一個(gè)任務(wù)有一個(gè)虛擬地址空間。為了避免多個(gè)并行任務(wù)的多個(gè)虛擬地址空間直接映射到同一個(gè)物理地址空間,還需要使用線性地址空間來(lái)隔離虛擬地址空間和物理地址空間。線性地址空間由一維的線性地址構(gòu)成,線性地址空間和物理地址空間是對(duì)等。線性地址也是32位長(zhǎng),尋址空間為4G字節(jié)。
在操作系統(tǒng)中,應(yīng)用程序使用虛擬地址(也即邏輯地址)訪問(wèn)內(nèi)存,操作系統(tǒng)將虛擬地址轉(zhuǎn)換為線性地址,然后由處理器將線性地址轉(zhuǎn)換為物理地址,但是在交由處理器轉(zhuǎn)換前,操作系統(tǒng)必須設(shè)置處理器所需要的相關(guān)描述符表和描述符信息。其實(shí)在Linux系統(tǒng)中,這在系統(tǒng)啟動(dòng)時(shí)就設(shè)置好了,而且是設(shè)置后就不會(huì)再改動(dòng)了。
在80386中,通過(guò)使用分段管理和分頁(yè)管理實(shí)現(xiàn)虛擬地址到物理地址的轉(zhuǎn)換,其中分頁(yè)管理是可選的。
事實(shí)上,現(xiàn)在的64位奔騰4處理器,擁有三種基本模式和一種擴(kuò)展模式,
基本模式:
保護(hù)模式:純32位保護(hù)執(zhí)行環(huán)境。
實(shí)模式:純16位無(wú)保護(hù)執(zhí)行環(huán)境。
系統(tǒng)管理模式:當(dāng)SMI引腳為有效進(jìn)入系統(tǒng)管理模式,首先保存當(dāng)前的CPU上下文。它有獨(dú)立的地址空間,用來(lái)執(zhí)行電源管理或系統(tǒng)安全方面的指令。
擴(kuò)展模式:
IA-32e模式: 64位操作系統(tǒng)運(yùn)行在該模式。該模式有兩種子模式:
1)兼容模式:該模式下,64位操作系統(tǒng)運(yùn)行在32位兼容環(huán)境,能正常運(yùn)行16,32位應(yīng)用程序就像基本的保護(hù)模式一樣,訪問(wèn)32位地址空間,但不能運(yùn)行純16位實(shí)模式程序(就是不能運(yùn)行虛擬86模式程序了)。
2)64位模式:在該模式下,處理器完全執(zhí)行64位指令,使用64位地址空間和64操作數(shù),運(yùn)行16,32位程序必須切換到兼容模式。
IA-32e子模式的切換完全基于代碼段寄存器。這樣一來(lái),運(yùn)行在
IA-32e模式中(64位)的OS完全可以無(wú)縫的運(yùn)行所有16,32,64為應(yīng)用程序,通過(guò)設(shè)置32位后的CS。