• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            focus on linux, c/c++, lua

            Win32 Asm Tips

            1,當(dāng)80386處理器工作在保護(hù)模式和虛擬8086模式的時候,可以使用全部32根地址線訪問4 GB大的內(nèi)存。段地址加偏移地址的計算方法顯然無法覆蓋這么大的范圍。但計算一下就可以發(fā)現(xiàn),實(shí)際上和8086同樣的限制已經(jīng)不復(fù)存在,因?yàn)?/span>80386所有的通用寄存器都是32位的,232次方相當(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.swpWindows 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í)行的時候,CSDSESSS都已經(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ù)門幾種。

            posted on 2010-10-20 10:09 zuhd 閱讀(299) 評論(0)  編輯 收藏 引用 所屬分類: my tips

            久久综合久久综合久久| 欧洲性大片xxxxx久久久| 久久精品国产亚洲AV电影| 国产91久久精品一区二区| 成人精品一区二区久久久| 久久久久久无码国产精品中文字幕| 亚洲欧洲久久久精品| 精品一区二区久久| 亚洲va久久久噜噜噜久久男同| 欧美精品一本久久男人的天堂| 噜噜噜色噜噜噜久久| 91秦先生久久久久久久| 午夜不卡久久精品无码免费| 久久人人爽人人精品视频| 久久精品午夜一区二区福利| 精品久久久久久久国产潘金莲 | 亚洲国产日韩欧美久久| 久久精品国产99国产精偷| 囯产精品久久久久久久久蜜桃| 一级做a爰片久久毛片人呢| 久久精品蜜芽亚洲国产AV| 欧美精品乱码99久久蜜桃| 久久噜噜久久久精品66| 国内精品久久久久影院网站| 国产成人精品久久一区二区三区| 国产成人精品综合久久久久| 国产精品久久久久蜜芽| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | a高清免费毛片久久| 久久久噜噜噜www成人网| 亚洲精品国产字幕久久不卡| 久久亚洲精品国产亚洲老地址| 91久久国产视频| 国产精品一区二区久久精品无码| 久久久久中文字幕| 久久精品免费大片国产大片| 久久久久人妻精品一区三寸蜜桃| 很黄很污的网站久久mimi色| 精品久久人人妻人人做精品| 久久人搡人人玩人妻精品首页| 久久久国产精华液|