在網路上看到了有人寫了一系列講解電腦內部運作的好文章,作者為 Gustavo Duarte ,作為一個軟體學徒,看到這麼牛的前輩花了如此多的精神整理出來的心得,實在很想推荐給大家,所以斗膽試譯一下,順便督促自己仔細地閱讀過一遍。這將會是一系列的譯文。從主機板常識、CPU cache,x86的開機過程、Linux開機過程、kernel記憶體管理、行程的address space、虛擬記憶體的管理等等,個人覺得真是一氣呵成,很是精彩啊~
OK,第1篇,講的是主機板晶片組與其memory map。
作者: Gustavo Duarte
主機板晶片組與其memory map
Motherboard Chipsets and the Memory Map
為了解釋現代的核心是如何工作的,我將會陸續寫幾篇文章來解釋電腦的內部運作。我希望這些文章可以讓一些沒有太多經驗的愛好者以及程式設計師覺得有所幫助。我們會聚焦在Linux, Windows以及Intel處理器。內部機制是我的興趣,我已經寫過一些kernel-mode的程式碼但沒有持續一直玩它。第1篇文章描述現代以Intel為基礎的主機板是如何存取記憶體以及系統記憶體的對應。
我們先來看看一個Intel電腦是怎麼接在一起的。下圖表示了主機板上的主要的元件:
現代主機板方塊圖。southbridge與northbridge構成了chipset。
如同你看到的,最要緊的是要記住CPU並不會真的知道什麼東西跟它接在一起。它透過pin腳跟外界相連,但它不在乎外在世界為何。外在世界可能是電腦裡的一塊主機板,但也可能是個烤麵包機、路由器、大腦植入器或者是CPU測試機台。外界與CPU溝通主要有三種方式:memory address space, I/O address space以及interrupt。我們目前只先關心主機板與memory。[譯註:環境(主機板)與溝通方式(memory)]
在主機板上,CPU的對外通道就是替它連接到northbridge的front-side bus。每當CPU要讀寫記憶體時,是這麼透過bus去進行的:它透過一些pin傳出想讀寫的physical address,然後另一些pin送出要寫的值或是收要讀的值。一個Intel Core 2 QX6600有33根pin來傳輸physical address(所以有233個記憶體位址),以及64根pin拿來收送資料(所以資料是以64位元在傳送,也就是一個8-byte)。這允許CPU實際上可定址64GB的記憶體(233 個位址 * 8 bytes),即使一般的chipset最多只能處理到8GB的記憶體。[譯註:當然2011年已經可以到64GB嘍!]
現在困難來了。我們習慣以RAM來思考記憶體,這個東西就是程式一直在讀寫的東東。而大部份的時候的確如此,CPU對記憶體的需求都會透過northbridge到RAM模組。但並不總是這樣。Physical memory addresses也被用來和主機板上的各種裝置溝通(這種溝通方式稱為memory-mapped I/O)。這類裝置包括視訊卡、大多數的PCI卡(掃描器或SCSI卡)以及在BIOS中的flash memory。
當northbridge收到一個physical memory的需求時,它會決定如何如何進行:它應該去RAM存取嗎?或是視訊卡呢?這種選擇會依據memory address map來決定。對每一段physical memory address的區域來說,memory map知道哪個裝置擁有該區域。 大部分的addresses會對應到RAM,但是chipset會知道當無法對應到RAM時,要由哪個裝置來處理。這些不屬於RAM的addresses在PC memory中形成了著名的"洞",範圍從640KB到1MB。當一些memory addresses被視訊卡與PCI裝置保留時,還會有更大的洞產生。這也是為何32位元的作業系統一般在使用4GB RAM時會有些問題。在Linux中,/prco/iomem整齊地列出這些位址對應。下圖呈現出Intel PC中前4GB的physical memory addresses典型的memory map:
Intel電腦的physical memory address前4GB的分布
實際的addresses與範圍會根據主機板與在其上的裝置有所不同,但大部分的Core 2系統跟上圖非常接近。所有棕色的區域都不是對應到RAM。記住,這是在主機板的bus上使用的physical addresses。在CPU內部(舉例來說,我們跑的那些程式),記憶體位址是 logical 的,並且在送到bus上存取memory前,必須被CPU轉換成physical addresses。
logical addresses轉換成pyhsical addresses的規則非常複雜,並且跟CPU正在執行的mode有關(real mode, 32-bit protected mode以及64-bit protected mode)。無論何種轉換機制,CPU mode都會決定有多少的physical addresses可以被存取。舉例來說,如果CPU跑在32-bit mode,那麼他就只能夠定址4GB(嗯,其實有一個例外,叫作physical address extension,但我們先忽略它)。既然大約有1GB的physical addresses被對應到主機板上的裝置,所以CPU僅能用到大約3GB的RAM(有時候會更少,我有一台Vista,只有2.4GB被使用)。如果CPU在real mode中,那它僅能夠定址到1MB的physical RAM(這是早期的Intel處理器的唯一一種mode)。另一方面,當CPU跑在64-bit mode時,可以定址到64GB(僅少數chipset支援這麼多RAM)。在64-bit mode中,有可能用比全部physical RAM的數量還多的pyhsical addresses去存取主機板的裝置。這叫作reclaiming memory,需由chipset的協助來完成。[譯註:這句沒把握...-_-]
這是我們在下一篇文章中會用到的記憶體,會描述從上電到boot loader,然後進入kernel的開機過程。如果你對這些東西有興趣,我高度推荐Intel手冊。I'm big into primary sources overall,但Intel手冊寫的特別好並且精確。這邊是其中一些:[譯註:我不知道I'm big into...是啥意思...-_-]
留言
張貼留言