Win32基础知识5 - Win32汇编语言006
生活随笔
收集整理的這篇文章主要介紹了
Win32基础知识5 - Win32汇编语言006
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Win32基礎(chǔ)知識(shí)5
?讓編程改變世界
Change the world by program
?
Windows的內(nèi)存安排
? 這節(jié)課我們需要理解三個(gè)概念:每個(gè)應(yīng)用程序都有自己的4 GB的尋址空間,就算這個(gè)程序只暫 1KB的內(nèi)存;
不同應(yīng)用程序的線性地址空間是隔離的,盡管他們?cè)趦?nèi)存中是搞在一起;
時(shí)刻要記住,DLL程序是“小三”,因此它們沒有自己“私有”的空間。
? 本節(jié)課我們將圖文并茂地來進(jìn)行原理層面的分析! ?虛擬內(nèi)存安排:
? Windows 系統(tǒng)一般在硬盤上建立大小為物理內(nèi)存兩倍左右的交換文件用作虛擬內(nèi)存。 利用 80386處理器的內(nèi)存分頁機(jī)制,交換文件的尋址上可以很方便地作為物理內(nèi)存使用。 (只需要在真正調(diào)用的時(shí)候?qū)⑵渥x入物理內(nèi)存并同時(shí)修改線性地址映射到這塊內(nèi)存即可)。 同樣道理,反正是映射一個(gè)地址而已,所以被執(zhí)行的程序也可以不必裝入內(nèi)存,只需要在頁表中建立映射關(guān)系,真正運(yùn)行到這段代碼才調(diào)入內(nèi)存。 ? 眾所周知,Windows 是一個(gè)分時(shí)的多任務(wù)操作系統(tǒng),CPU時(shí)間(就是CPU運(yùn)行的過程)被分成一個(gè)個(gè)的時(shí)間片后分配給不同程序輪流使用。 在A程序的時(shí)間片中,和這個(gè)程序執(zhí)行無關(guān)的部分(B和C等其他程序的代碼和數(shù)據(jù))并不需要映射到線性地址中。 ? 附加解析: 內(nèi)存中,所有的程序都搞在一起,關(guān)系十分混亂; CPU只能看到線性地址(假的),每個(gè)程序擁有自己的線性地址(小三除外)。 ? [caption id="attachment_665" align="aligncenter" width="679"] 虛擬內(nèi)存安排[/caption] ? ?總結(jié):WIN32編程中幾個(gè)很重要的概念
?第一點(diǎn):
每個(gè)應(yīng)用程序都有自己的4 GB的尋址空間。 該空間可存放操作系統(tǒng)、系統(tǒng)DLL和用戶DLL的代碼,它們之中有各種函數(shù)供應(yīng)用程序調(diào)用。 再除去其他的一些空間,余下的是應(yīng)用程序的代碼、數(shù)據(jù)和可以分配的地址空間。 ?第二點(diǎn):
不同應(yīng)用程序的線性地址空間是隔離的。 雖然它們?cè)谖锢韮?nèi)存中同時(shí)存在,但在某個(gè)程序所屬的時(shí)間片中,其他應(yīng)用程序的代碼和數(shù)據(jù)沒有被映射到可尋址的線性地址中,所以是不可訪問的。 從編程的角度看,程序可以使用4 GB的尋址空間,而且這個(gè)空間是“私有”的。 ?第三點(diǎn):
DLL程序沒有自己“私有”的空間。 它們總是被映射到其他應(yīng)用程序的地址空間中,當(dāng)做其他應(yīng)用程序的一部分運(yùn)行。 原因很簡單,如果它不和其他程序同屬一個(gè)地址空間,應(yīng)用程序該如何調(diào)用它呢? ?從WIN32匯編的角度看內(nèi)存尋址
? 如果堅(jiān)持不到這句話出現(xiàn)的同學(xué)就因?yàn)榍斑匴indows原理太復(fù)雜而放棄的童鞋,小甲魚覺得很可惜…… Win32匯編中的內(nèi)存訪問遠(yuǎn)比DOS下的分段尋址方式簡單,這是為什么呢? 因?yàn)閃indows是一個(gè)多任務(wù)的操作系統(tǒng),最首要的宗旨就是“穩(wěn)定壓倒一切”。 ? 如果把描述符表以及頁表等內(nèi)容交給用戶程序管理是很不安全的。 任何權(quán)限上開放引發(fā)的安全問題都是很嚴(yán)重的,如Windows 9x中的中斷描述符表是可寫的,CIH病毒可利用它將自己的權(quán)限提高到優(yōu)先級(jí)0; 而Windows NT下的中斷描述符表是不可寫的,CIH病毒在Windows NT下就無法使用同樣的方法進(jìn)駐內(nèi)存。 ? 關(guān)于CIH病毒可以到魚C論壇“資源分享”版塊下載^_^ ? 正因?yàn)槿绱?#xff0c;Windows操作系統(tǒng)干脆為用戶程序“安排好了一切”。 具體表現(xiàn)在為用戶程序的代碼段、數(shù)據(jù)段和堆棧段全部預(yù)定義好了段描述符。這些段的起始地址為0,限長為ffffffff,所以用它們可以直接尋址全部的4 GB地址空間。 ? 程序開始執(zhí)行的時(shí)候,CS,DS,ES和SS都已經(jīng)指向了正確的描述符,在整個(gè)程序的生命周期內(nèi),程序員不必改動(dòng)這些段寄存器,也不必關(guān)心它們的值究竟是多少(實(shí)際上是想改也改不了)。 所以對(duì)Win32匯編程序來說,整個(gè)源程序中竟然可以不用出現(xiàn)段寄存器的身影。 這在DOS匯編編程中是不可想像的。 ?回顧之前提出的問題:
“為什么在WIN32匯編源代碼中看不到CS,DS,ES,SS等段寄存器的使用?” 答案是:并不是Win32匯編源代碼用不到段寄存器,而是用戶在使用中不必去關(guān)心段寄存器! [buy]?獲得所有教學(xué)視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://urlxf.qq.com/?Jfyeqe3']視頻下載[/Downlink]轉(zhuǎn)載于:https://www.cnblogs.com/LoveFishC/archive/2011/08/11/3847114.html
總結(jié)
以上是生活随笔為你收集整理的Win32基础知识5 - Win32汇编语言006的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 23种设计模式的索引
- 下一篇: 从源文件中读出最后10KB内容到目的文件