linux高端內(nèi)存映射方式
linux高端內(nèi)存映射方式
1.1內(nèi)核地址空間(線性空間)分布。(1)直接映射區(qū):線性空間中從3G開始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。(2)動態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來分配,特點是:線性空間連續(xù),但是對應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對應(yīng)的物理頁可能處于低端內(nèi)存,也可能處于高端內(nèi)存。(3)永久內(nèi)存映射區(qū):該區(qū)域可訪問高端內(nèi)存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。(4)固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個地址項都服務(wù)于特定的用途,如ACPI_BASE等。說明。
導(dǎo)讀1.1內(nèi)核地址空間(線性空間)分布。(1)直接映射區(qū):線性空間中從3G開始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。(2)動態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來分配,特點是:線性空間連續(xù),但是對應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對應(yīng)的物理頁可能處于低端內(nèi)存,也可能處于高端內(nèi)存。(3)永久內(nèi)存映射區(qū):該區(qū)域可訪問高端內(nèi)存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。(4)固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個地址項都服務(wù)于特定的用途,如ACPI_BASE等。說明。
![](https://img.51dongshi.com/20250105/wz/18528821552.jpg)
系統(tǒng)大全為您提供1.1內(nèi)核地址空間(線性空間)分布(1)直接映射區(qū):線性空間中從3G開始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。(2)動態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來分配,特點是:線性空間連續(xù),但是對應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對應(yīng)的物理頁可能處于低端內(nèi)存,也可能處于高端內(nèi)存。(3)永久內(nèi)存映射區(qū):該區(qū)域可訪問高端內(nèi)存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。(4)固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個地址項都服務(wù)于特定的用途,如ACPI_BASE等。說明:注意用戶空間當然可以使用高端內(nèi)存,而且是正常的使用,內(nèi)核在分配那些不經(jīng)常使用的內(nèi)存時,都用高端內(nèi)存空間(如果有),所謂不經(jīng)常使用是相對來說的,比如內(nèi)核的一些數(shù)據(jù)結(jié)構(gòu)就屬于經(jīng)常使用的,而用戶的一些數(shù)據(jù)就屬于不經(jīng)常使用的。用戶在啟動一個應(yīng)用程序時,是需要內(nèi)存的,而每個應(yīng)用程序都有3G的線性地址,給這些地址映射頁表時就可以直接使用高端內(nèi)存。而且還要糾正一點的是:那128M線性地址不僅僅是用在這些地方的,如果你要加載一個設(shè)備,而這個設(shè)備需要映射其內(nèi)存到內(nèi)核中,它也需要使用這段線性地址空間來完成,否則內(nèi)核就不能訪問設(shè)備上的內(nèi)存空間了??傊瑑?nèi)核的高端線性地址是為了訪問內(nèi)核固定映射以外的內(nèi)存資源。進程在使用內(nèi)存時,觸發(fā)缺頁異常,具體將哪些物理頁映射給用戶進程是內(nèi)核考慮的事情。在用戶空間中沒有高端內(nèi)存這個概念。1.2高端內(nèi)存映射高端內(nèi)存映射含義為:將線性地址空間(范圍從PAGE_OFFSET+896M至4G的最后128M)映射到896M以上的物理頁框。:高端內(nèi)存映射有三種方式(都是非直接映射):1.2.1映射到“內(nèi)核動態(tài)映射空間”(非連續(xù)內(nèi)存區(qū)映射)這種方式很簡單,因為通過vmalloc(),在內(nèi)核“動態(tài)映射空間”申請內(nèi)存的時候,就可能從高端內(nèi)存獲得頁面(參看vmalloc的實現(xiàn)),因此說高端內(nèi)存有可能映射到“內(nèi)核動態(tài)映射空間”中。1.2.2永久內(nèi)核映射如果是通過alloc_page()獲得了高端內(nèi)存對應(yīng)的page,如何給它找個線性空間?內(nèi)核專門為此留出一塊線性空間,從PKMAP_BASE到FIXADDR_START,用于映射高端內(nèi)存。在2.4內(nèi)核上,這個地址范圍是4G-8M到4G-4M之間。這個空間起叫“內(nèi)核永久映射空間”或者“永久內(nèi)核映射空間”這個空間和其它空間使用同樣的頁目錄表,對于內(nèi)核來說,就是swapper_pg_dir,對普通進程來說,通過CR3寄存器指向。通常情況下,這個空間是4M大小,因此僅僅需要一個頁表即可,內(nèi)核通過來pkmap_page_table尋找這個頁表。通過kmap(),可以把一個page映射到這個空間來。由于這個空間是4M大小,最多能同時映射1024個page。因此,對于不使用的page,及應(yīng)該時從這個空間釋放掉(也就是解除映射關(guān)系),通過kunmap(),可以把一個page對應(yīng)的線性地址從這個空間釋放出來。永久內(nèi)存映射允許建立長期映射。1.2.3臨時映射內(nèi)核在FIXADDR_START到FIXADDR_TOP之間保留了一些線性空間用于特殊需求。這個空間稱為“固定映射空間”在這個空間中,有一部分用于高端內(nèi)存的臨時映射。這塊空間具有如下特點:1、每個cpu占用一塊空間2、在每個cpu占用的那塊空間中,又分為多個小空間,每個小空間大小是1個page,每個小空間用于一個目的,這些目的定義在kmap_types.h中的km_type中。當要進行一次臨時映射的時候,需要指定映射的目的,根據(jù)映射目的,可以找到對應(yīng)的小空間,然后把這個空間的地址作為映射地址。這意味著一次臨時映射會導(dǎo)致以前的映射被覆蓋。通過kmap_atomic()可實現(xiàn)臨時映射??梢杂迷谥袛嗵幚砗瘮?shù)和可延遲函數(shù)的內(nèi)部,從不阻塞。因為臨時內(nèi)存映射是固定內(nèi)存映射的一部分,一個地址固定給一個內(nèi)核成分使用。???以上就是系統(tǒng)大全給大家介紹的如何使的方法都有一定的了解了吧,好了,如果大家還想了解更多的資訊,那就趕緊點擊系統(tǒng)大全官網(wǎng)吧。??本文來自系統(tǒng)大全http:///如需轉(zhuǎn)載請注明!推薦:win7純凈版
linux高端內(nèi)存映射方式
1.1內(nèi)核地址空間(線性空間)分布。(1)直接映射區(qū):線性空間中從3G開始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。(2)動態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來分配,特點是:線性空間連續(xù),但是對應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對應(yīng)的物理頁可能處于低端內(nèi)存,也可能處于高端內(nèi)存。(3)永久內(nèi)存映射區(qū):該區(qū)域可訪問高端內(nèi)存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。(4)固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個地址項都服務(wù)于特定的用途,如ACPI_BASE等。說明。
為你推薦