以保護模式估量記憶體大小 by Robert R. Collins ----------------------- 估量記憶體大小的概念 如果不先介紹RAM的工作原理,估量記憶體的大小的概念將會是不完整的,考慮記憶體為一 個行列數相等的二維陣列,每個元素代表記憶體中的一位元(非位元組),為了定址陣列上 的單一位元,我們提供有行位址與列位址的隨機存取記憶體晶片(RAM chips),為了最小化 chip的接口(pin)數,只用一組的位址接口,同時用作行與列位址,memory controller 必 須提供訊號告訴RAM chip何時列位址是有效的(透過Row Address Strobe(RAS)),與何時 行位址是有效的(透過Column Address Strobe(CAS)),用一組位址線來表示列跟行位址的 概念稱為多工(multiplexing(MUX)),由於位址線的多工,RAM chip的大小總是二(或二的 偶數次乘積)的平方,八條位址線的chip有64k的資訊((2^8)^2)==65536);九條位址線的chip 有256k,十條有1M,依此類推... 現在利用這些資訊,我們可以討論CPU位址匯流線跟memory位址匯流線的關係,如果CPU是286 ,有24個位址接口;如果是386,486,或Pentinm,有32個位址接口;如果是pentium Pro就有 36個位址接口.RAM chip明顯擁有比CPU少的位址接口,所以要把CPU位址轉換成 RAM RAS 跟 CAS 位址,CPU位址匯流線進入memory controller.memory controller把CPU位址信號轉換 成RAS位址,CAS位址,跟BANK位址(待會有更多關於BANK的介紹),假定我們電腦是286,只提供 四個BANK的記憶體(即使80286已經落伍,但對這個例子,描述它的記憶體組態是合適的),此記 憶體可以包括64k,256k,1M跟4M chip,但是每個BANK必須以固定大小的RAM chip所組成,要提供 4M memory chip,我們的記憶體必須提供訊號11個RAS位址,加上11個CAS位址,總共用去了 CPU可以使用的二十四條位址線中的二十二條,剩下兩條由memory controller來解釋,用來選擇 記憶體中的那個BANK來存取,圖二表示關於CPU位址匯流排跟記憶體匯流排的一個假想 關係,根據此圖,任何時間CPU是A00...A10,RAM chip接受到行位址,同樣,當CPU是A13..A23 ,RAM chip接受到列位址,CPU的A11,A12被用來選擇RAM bank,因為我們的假定電腦只有 提供四個BANK,當=00,memory controller選擇BANK0;當=01,memory controller選擇BANK1;當=10,memory controller選擇BANK2;當=11 ,memory controller選擇BANK3,有了這資訊,我們可以寫入電腦裡任何BANK的任一列 ,這麼一來,我們可以偵測出多少banks of RAM被灌入電腦,以及決定每個RAM bank 的大小,要完成對於RAM sizing的討論我們所必需的是某個理論跟演算法來應用我們的知識. 在我們假想的電腦,memory controller根據RAM chip的大小來多工處理位址,圖二表示4M chip 的CPU與記憶體位址匯流線的關係,當chip的大小小於4M時,CPU匯流線跟記憶體匯流線的 關係改變.在我們的電腦,在每個RAM bank的chip大小是可程式的(programable);因此在我們可以完整 存取記憶體前,我們必須決定在插座的chip的大小和後來重新程式memory controller. 偵測RAM可藉由寫入RAM bank完成,完整地重新裝載prefetch quece以及檢查我們所寫的值,如果 我們回到我們所寫的值,我們已經足以決定RAM是有用的對記憶體的bank,然後我們可以檢查chip的 大小. 為了決定RAM真正的大小我們需要偵測有多少條位址線與RAM chip相連,考慮在我們4MB RAM chip socket的那十一條位址線,如果我們的RAM是一個4M 的chip,則那十一條位址線通通 與之相連(MA0 - M10),如果RAM是一個1M的chip,只有十條相連(MA0 - MA9),為了決定是不 是4M chip被灌入,我們必須決定是否MA10與之相連,我們寫入MA10,然後在RAM位址0處 讀回(MA0 -MA10 not asserted),如果一個4M chip在socket,那麼我們在MA10寫入的資料 將出現在MA10,而且不會在RAM位址0,但是如果RAM chip不是個4M chip,那麼MA10將不與之相 連,因此我們在MA10處寫入的資料將會寫入位址0,依照相同的演算法,對1M chip使用 MA9, 對256k chip使用MA8,如果MA8-MA10通通失敗,那麼假定這個bank由64k chip所組成, 當我們已經決定在socket中的RAM存在. 為了決定電腦裡有多少記憶體bank,我們對每個bank的RAM是否存在做測試,要完成測試, 可藉由寫入可以控制RAM bank的選擇的CPU位址線,即位址線A11跟A12. 藉著對記憶體的每個bank重複RAM sizing的演算法,我們可以決定有多少的RAM被灌入電腦 中,圖三簡要說明了RAM位址匯流線跟CPU位址匯流線的關係,圖中的CPU位址線可從 MA(multiplexed address)表計算出,如果我們主張,那麼我們計算CPU 的位址為223+211+212=801800h. Figure 3 - Where to Read/Write to test for RAM chip size Write at CPU Write at CPU Read at CPU Read at CPU 位址線 位址 位址線 位址 Bank 0: 4 MB 800000h <> 000000h 1 MB 400000h <> 000000h 256 kb 200000h <> 000000h 64 kb 100000h <> 000000h Bank 1: 4 MB 800800h 000800h 1 MB 400800h 000800h 256 kb 200800h 000800h 64 kb 100800h 000800h Bank 2: 4 MB 801000h 001000h 1 MB 401000h 001000h 256 kb 201000h 001000h 64 kb 101000h 001000h Bank 3: 4 MB 801800h 001800h 1 MB 401800h 001800h 256 kb 201800h 001800h 64 kb 101800h 001800h 摘要: 對於決定RAM的大小以及數量,知道關於CPU位址與RAM行與列位址跟bank選擇位址是必 要的,RAM Bank的選擇由寫入CPU位址線所完成,對bank的選擇由memory controller所解釋 ,RAM sizing由對一個給定的chip size寫入最高的RAM列位址,和在0處讀取RAM,如果資 料出現在0,你知道在這chip上的RAM列位址並不被連接,繼續這過程,直到每個bank的所 有RAM size都已決定,完成這程序後,我們重新程式memory controller以便系統中有較 適合的RAM組態. 程式控制下的sizing RAM跟它在電源開啟順序所達成的方式不同,在電源開啟順序期間, BIOS保證有對系統以及資源絕對的控制權,在順序期間,BIOS可以保證cache不能干涉到 結果,在程式控制下,我們不能寫一個對硬體或是cache做任何假定的RAM sizing的演算法, 若果我們重新程式memory controller,我們的程式幾乎確定會失敗,如CPU位址轉換隨著 RAM位址轉換而改變,我們必須採用不同的方式,一個不需依賴硬體知識的方法,這表示我 們不能重新程式硬體,memory controller,或是cache controller,因為我們不能重新程 式這些memory controller(或是對cache controller的存在性,狀態或是可程式性做任 何的假設),我們必須寫一個可以偵測記憶體的存在,不受cache RAM的干涉,因此當記憶體 的存在時,這個演算法必須可以使cache RAM的內容無效. 資訊二 鄭衡陽