2010年4月14日 星期三

himem.sys及emm386說明


himem.sys及emm386說明轉載自http://club.it.sohu.com/r-os-239366-0-13-900.html
DOS的環境下,系統中存在以下四種記憶體:
   常規記憶體(Conventional Memory)
   高端記憶體(Upper Memory)
   延伸記憶體(Expanded Memory) EMS
   擴展記憶體(Extended Memory) XMS
DOS在實模式下,能直接定址的範圍是1MB。而這1MB分為640KB的常規記憶體和384KB的高端記憶體,加在一起就是1024KB也就是1MB。因為DOS使用16位段基址:偏移量格式(segment:offset),只能使用低端的640KB,這就是有名的640KB限制。其中最低端的1KB,即00000H~003FFH存放的是中斷(IRQ)向量表;接下來是256B(0FFH)的BIOS資料區;DOS及應用程式使用00500H~9FFFFH。這在開始使用DOS的20世紀80年代是完全能夠滿足要求的,因為當時PC上安裝的實體記憶體容量也是640KB,甚至更少。(前面地址中的H代表16進制)系統硬體使用的記憶體位於位址區域的高端,範圍是A0000H~FFFFFH,共384KB。其中有用於顯示的視頻緩衝區和BIOS程式空間,例如顯卡,網卡和主板BIOS。
地址FFFF0H在PC中有特別的用途。
電腦在加電啟動時,CPU中的CS=F000H,IP=FFF0H,即從位址FFFF0H處開始執行,這個區域屬於系統BIOS。F000:FFF0=EA5BE000F0(是JMP F000:E05B指令的十六進位表示),它立即跳轉到BIOS的初始化程式,開始系統自檢。(這段跟DOS沒有關係,只是查資料時看到了,就也寫上了。是想讓大家知道,在按下主機電源開關後,CPU都做了些什麼,為什麼BIOS開始工作,自檢硬體設備)
最後我附了一張圖,本來想自己畫的,可一搜發現已經有人畫好了,並且畫的肯定比我好,我就用人家的圖了,一看這個,肯定就清楚多了,比文字怎麼寫的都強。
上面說的延伸記憶體是一種硬體,那個年代的主板專門預留了擴展槽,可以插上,我是沒見過。擴展記憶體就是記憶體條上大於1M的部分,通過DOS下的一些驅動可以將XMS的一部分虛擬成EMS,以滿足一些為EMS開發的程式的需要。
中間有一段叫高端記憶體,指位於常規記憶體之上的384K記憶體。程式一般不能使用這個記憶體區域,但是EMM386.exe可以啟動高端記憶體的一部分,並且它允許用戶將某些設備驅動程式和用戶程式用Devicehigh或LH(即loadhigh)裝入高端記憶體。dos=high,umb也是把DOS的一部分裝到高端記憶體裏。這裏的umb是高端記憶體塊(Upper Memory Block)的縮寫。(以後我會專門寫config.sys的部分)
DOS的程式,主要還是要使用常規記憶體的,如我刷HP筆記本的BIOS的時候,連點Shift進入最小的DOS模式也就是為了節省640K這部分的空間,以便讓HP的刷寫程式有足夠的空間運行,不然刷寫程式就要報錯,就算XMS再大也沒用。
還有一個叫DOS4GW.EXE的程式,在DOS玩過一些大一些的遊戲如仙劍,紅警等,在啟動的時候,有時候能看到有個DOS4GW一閃而過,它可以使用CPU直接進入保護模式,直接訪問XMS,不過這時就已經脫離了DOS狀態。後來的Windows 3.x,95,98也都運行在保護模式下的,但都需要DOS帶一下。
有些東西要看一下計算機組成原理或彙編之類的書才能理解,尤其是記憶體的定址與CPU的寄存器(上面提到的CS,IP等)。提到了DOS的記憶體管理,從前文的圖中,大家也看到了EMM386.EXE與HIMEM.SYS,這是實際管理記憶體的模組。
EMM386.EXE從名稱上可以很真接的看出,這個是要在386以及之後的CPU上才可以使用的,它的作用是利用XMS創建出EMS,以前的DOS也有N多版本,有的叫EMM386.SYS有的叫EMM386.EXE,在我使用過的DOS我只見到過EMM386.EXE。像其他的擴展記憶體管理一樣EMM386使處理器虛擬8086的模式。而在386增強模式中,視窗會話期間會臨時關閉,同時在視窗保護模式中內核會接管它的角色。最終的作用是在UMA中,EMM386.EXE會把記憶體映射成未使用的塊。允許設備驅動和TSRs(我也不知道是什麼東西)被載入到UMA中,而保留那可憐的640K的常規記憶體。
HIMEM.SYS也是一個DOS設備驅動,他允許DOS程式把資料存到XMS中去。HIMEM.SYS實際上是非常重要的,後來的多種Windows作業系統(本質上底層是依賴於DOS)都需要先載入HIMEM.SYS之後才能正常運行。
從MSDOS 5.0起,HIMEM.SYS被用來把DOS內核的部分代碼載入到HMA中,目的同樣是為了節省那640K的常規記憶體。在config.sys用dos=high設置,config.sys的詳細資訊,後文會有涉及。
HIMEM.SYS提供了一種訪問超過1M實體記憶體的方法,而這正是windows 9x/me作業系統載入圖型化介面所必需的,看前面的圖很清楚,EMM386.EXE的管轄範圍是640K向上到1M之間這部分共384K被稱作上位記憶體UMA的區域。而HIMEM.SYS管轄的是1M再向上的部分,而從1M開始有一小段叫高位記憶體HMA,專門用來放一部分DOS內核。

沒有留言:

張貼留言