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