1,當(dāng)80386處理器工作在保護(hù)模式和虛擬8086模式的時候,可以使用全部32根地址線訪問4 GB大的內(nèi)存。段地址加偏移地址的計算方法顯然無法覆蓋這么大的范圍。但計算一下就可以發(fā)現(xiàn),實(shí)際上和8086同樣的限制已經(jīng)不復(fù)存在,因?yàn)?/span>80386所有的通用寄存器都是32位的,2的32次方相當(dāng)于4G,所以用任何一個通用寄存器來間接尋址,不必分段就已經(jīng)可以訪問到所有的內(nèi)存地址。
2,內(nèi)存分頁管理只能在保護(hù)模式下才可以實(shí)現(xiàn),實(shí)模式不支持分頁機(jī)制。但不管在哪種模式下,所有尋址指令使用的都是線性地址,程序不用關(guān)心數(shù)據(jù)最后究竟存放在物理內(nèi)存的哪個地方。
3,Windows系統(tǒng)一般在硬盤上建立大小為物理內(nèi)存兩倍左右的交換文件(文件名在Windows 9x下為Win386.swp,Windows NT下為PageFile.sys)用做虛擬內(nèi)存。利用80386處理器的內(nèi)存分頁機(jī)制,交換文件在尋址上可以很方便地作為物理內(nèi)存使用。只需在真正訪問到的時候?qū)⒂脖P文件的內(nèi)容讀入物理內(nèi)存,然后重新將線性地址映射到這塊物理內(nèi)存就可以了。同樣道理,被執(zhí)行的可執(zhí)行文件也不必真正裝入內(nèi)存,只要在頁表中建立映射關(guān)系,以后到真正訪問到的時候再調(diào)入物理內(nèi)存。(win32的是不用關(guān)心物理地址的,它直接映射到線性地址,和實(shí)模式不同,實(shí)模式直接映射到物理地址)
4,由此可以引出Win32編程中幾個很重要的概念:
● 每個應(yīng)用程序都有自己的4 GB的尋址空間。該空間可存放操作系統(tǒng)、系統(tǒng)DLL和用戶DLL的代碼,它們之中有各種函數(shù)供應(yīng)用程序調(diào)用。再除去其他的一些空間,余下的是應(yīng)用程序的代碼、數(shù)據(jù)和可以分配的地址空間。
● 不同應(yīng)用程序的線性地址空間是隔離的。雖然它們在物理內(nèi)存中同時存在,但在某個程序所屬的時間片中,其他應(yīng)用程序的代碼和數(shù)據(jù)沒有被映射到可尋址的線性地址中,所以是不可訪問的。從編程的角度看,程序可以使用4 GB的尋址空間,而且這個空間是“私有”的。
● DLL程序沒有自己“私有”的空間。它們總是被映射到其他應(yīng)用程序的地址空間中,當(dāng)做其他應(yīng)用程序的一部分運(yùn)行。原因很簡單,如果它不和其他程序同屬一個地址空間,應(yīng)用程序該如何調(diào)用它呢?
5,正因?yàn)槿绱耍?/span>Windows操作系統(tǒng)干脆為用戶程序“安排好了一切”。具體表現(xiàn)在為用戶程序的代碼段、數(shù)據(jù)段和堆棧段全部預(yù)定義好了段描述符。這些段的起始地址為0,限長為ffffffff,所以用它們可以直接尋址全部的4 GB地址空間。程序開始執(zhí)行的時候,CS,DS,ES和SS都已經(jīng)指向了正確的描述符,在整個程序的生命周期內(nèi),程序員不必改動這些段寄存器,也不必關(guān)心它們的值究竟是多少(實(shí)際上,想改也改不了)。
所以對Win32匯編程序來說,整個源程序中竟然可以不用出現(xiàn)段寄存器的身影。這在DOS匯編編程中是不可想像的。回顧本節(jié)開頭提出的問題,答案是:并不是Win32匯編源代碼用不到段寄存器,而是用戶在使用中不必去關(guān)心段寄存器
6,在保護(hù)模式下,中斷或異常處理往往從用戶代碼切換到操作系統(tǒng)代碼中執(zhí)行。由于保護(hù)模式下的代碼有優(yōu)先級之分,因此出現(xiàn)了從優(yōu)先級低的應(yīng)用程序轉(zhuǎn)移到優(yōu)先級高的系統(tǒng)代碼中的問題,如果優(yōu)先級低的代碼能夠任意調(diào)用優(yōu)先級高的代碼,就相當(dāng)于擁有了高優(yōu)先級代碼的權(quán)限。為了使高優(yōu)先級的代碼能夠安全地被低優(yōu)先級的代碼調(diào)用,保護(hù)模式下增加了“門”的概念。“門”指向某個優(yōu)先級高的程序所規(guī)定的入口點(diǎn),所有優(yōu)先級低的程序調(diào)用優(yōu)先級高的程序只能通過門重定向,進(jìn)入門所規(guī)定的入口點(diǎn)。這樣可以避免低級別的程序代碼從任意位置進(jìn)入優(yōu)先級高的程序的問題。保護(hù)模式下的中斷和異常等服務(wù)程序也要從“門”進(jìn)入,80386的門分為中斷門、自陷門和任務(wù)門幾種。