歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> x86架構下的物理內存-通過Linux概述

x86架構下的物理內存-通過Linux概述

日期:2017/2/28 16:20:07   编辑:Linux教程

其它體系結構我沒有深入研究過,然而對於x86而言,我們很多人都是很了解的。其內存可以支持4G(不考慮PAE),因為地址總線為32位,也就是說32條1位的線纜可以選擇4G的地址,因此我們想當然的認為我們買了兩條2G的內存插入以後,我們的系統就可以有4G的內存可用了,我們的系統內存在滿載運行,然而果真如此嗎?答案是否定的!

因為所謂的地址總線32位是指從cpu引腳出來的總線是32位,是針對於cpu而言的,具體這些總線最終能全部連接在主板的ram上嗎?會不會還會連接到其它的設備上呢?這要看主板怎麼設計了。這裡主板上的北橋芯片解除了cpu和設備之間的地址偶合,典型的設計為cpu出來的地址總線32位全部連接在北橋芯片之上,當cpu發出一個32位的地址比如0xcb000000的時候,由北橋來決定該地址發往何處,可能發往內存ram,也可能發往顯示卡,也可能發往其它的二級總線,當然也可能發往南橋芯片(一個類似的解析地址的芯片,北橋解耦了cpu和主板芯片/總線,而南橋則解耦了主板芯片/總線和外部設備,比如ata硬盤,usb之類的設備就可以連接在南橋芯片上)。如果北橋選擇將該地址發往PCI總線上,那麼顯然內存ram就收不到這個地址請求,而且自從主板設計好了之後,理論上該地址就永遠被發送給了PCI,當然了,你可以通過諸如跳線之類的辦法來更改之,(而且現在很多板子都有被bios“自動探測/識別/設置”的功能,www.linuxidc.com此種情形下地址拓撲信息就不必記錄在bios裡面了,而是在bios開始運行的時候自動生成,生成的方式不外乎偵測-往特定針腳發送電平序列信號,然後得到回復,不過具體往哪裡發送電平信息也必須由主板和cpu來確定標准),因此雖然你有4G的所謂的滿載的ram,然而它的地址0xcb000000卻不能被使用。以上僅僅是一個例子,主板上還有很多的設備或者總線會占據一些地址總線上的地址,這樣說來你的4G的ram會有很多不能使用,典型的,intel提出了PAE,即物理地址擴展,使得可以支持4G以上的ram,實際上它的實現很簡單,就是為ram增加幾個地址總線位,變成36位的地址總線,這樣就可以插入64G的ram了,這時4G以上的地址總線空間將不會被其它設備占據,而北橋只會將地址發往ram。

既然4G的地址空間不能完全由ram內存條使用,那麼ram不能使用哪些地址呢?這個信息很重要,因為這個信息會指導操作系統內核進行物理內存分配,比如其它地址使用的地址處的頁面就不能被分配,否則就訪問到設備了,因此這些個地址處的頁面應該設置為保留,永遠不能被使用,事實上,它們被浪費了。這些地址信息存放的位置是BIOS,BIOS裡面存放著很重要的信息,這些信息可以組成一張邏輯拓撲圖,真實反映主板上的芯片是如何排列放置的,待到主板上電後,主板上的芯片和總線就形成了一張真實的“地圖”,在bios拓撲圖的指導下被檢測。

既然BIOS裡面存放拓撲圖,那麼操作系統內核在啟動的時候怎樣得到它呢,得到了它之後,操作系統才能建立自己的物理地址空間映射。得到bios信息的辦法莫多於bios調用了,也就是0x15調用,參數由寄存器指定,如果你想得到地址信息,也就是那張拓撲圖,那麼你要將eax設置成0X0000E820,然後讀取返回即可,以下是Linux在擁有256M內存的機器上得到的地址信息,該信息在內核啟動的時候通過bios調用得到:

Copyright © Linux教程網 All Rights Reserved