1. 程式人生 > >嵌入式 Linux驅動虛擬地址和實體地址的對映

嵌入式 Linux驅動虛擬地址和實體地址的對映

7)高階記憶體概念的由來:如上所述,Linux4GB的線性地址空間劃分成兩部分,從0x000000000xBFFFFFFF3GB空間作為使用者空間由使用者程序獨佔,這部分線性地址空間並沒有固定對映到實體記憶體空間上;從0xC00000000xFFFFFFFF的第4GB線性地址空間作為核心空間,在嵌入式系統中,這部分線性地址空間除了對映實體記憶體空間之外還要對映處理器內部外設暫存器空間等I/O空間。0xC0000000~high_memory之間的核心邏輯地址空間專用來固定對映系統中的實體記憶體,也就是說0xC0000000~high_memory之間空間大小與系統的實體記憶體空間大小是相同的(當然在配置了CONFIG_DISCONTIGMEMD選項的非連續記憶體系統中,核心邏輯地址空間和實體記憶體空間一樣可能存在記憶體孔洞),如果系統中的實體記憶體容量遠小於1GB
,那麼核心現行地址空間中核心邏輯地址空間之上的high_memory~0xFFFFFFFF之間還有足夠的空間來固定對映一些I/O空間。可是,如果系統中的實體記憶體容量(包括記憶體孔洞)大於1GB,那麼就沒有足夠的核心線性地址空間來固定對映系統全部實體記憶體以及一些I/O空間了,為了解決這個問題,在x86處理器平臺設定了一個經驗值:896MB,就是說,如果系統中的實體記憶體(包括記憶體孔洞)大於896MB,那麼將前896MB實體記憶體固定對映到核心邏輯地址空間0xC0000000~0xC0000000+896MB=high_memory)上,而896MB之後的實體記憶體則不建立到核心線性地址空間的固定對映,這部分記憶體就叫高階實體記憶體。此時核心線性地址空間high_memory~0xFFFFFFFF
之間的128MB空間就稱為高階記憶體線性地址空間,用來對映高階實體記憶體和I/O空間。896MBx86處理器平臺的經驗值,留了128MB線性地址空間來對映高階記憶體以及I/O地址空間,我們在嵌入式系統中可以根據具體情況修改這個閾值,比如,MIPS中將這個值設定為0x20000000B512MB),那麼只有當系統中的實體記憶體空間容量大於0x20000000B時,核心才需要配置CONFIG_HIGHMEM選項,使能核心對高階記憶體的分配和對映功能。什麼情況需要劃分出高階實體記憶體以及高階實體記憶體閾值的設定原則見上面的記憶體頁區(zone)概念說明。