arm linux虛擬記憶體布局

2021-07-23 19:03:48 字數 3569 閱讀 5727

開始位置

結束位置

使用0xffff8000

0xffffffff

用於 copy_user_page / clear_user_page。在sa11xx和xscale平台,用於建立乙個迷你快取對映

0xffff4000

0xffffffff

armv6及以後的cpu cache混淆

0xffff1000

0xffff7fff

保留位址空間,各平台不能使用

0xffff0000

0xffff0fff

cpu中斷向量頁。如果cpu支援向量重定位(控制暫存器v bit),cpu中斷向量表對映到該位址範圍

0xfffe0000

0xfffeffff

xscale快取沖刷區。在 proc-xscale.s檔案中使用這個位址範圍沖刷整個資料快取(xscale沒有tcm).

0xfffe8000

0xfffeffff

各平台的dtcm對映區

0xfffe0000

0xfffe7fff

各平台的itcm對映區

0xffc00000

0xffefffff

固定對映區,呼叫fix_to_virt()函式分配該區域

0xfee00000

0xfeffffff

pci i/o對映空間。是vmalloc空間的靜態對映

vmalloc_start

vmalloc_end-1

vmalloc() / ioremap() 空間。 vmalloc/ioremap返回的動態定位的記憶體區域,機器也可以通過iotable_init()函式指定靜態對映。 vmalloc_start基於 high_memory的變化值。vmalloc_end等於 0xff000000。

page_offset

high_memory-1

核心直接對映記憶體區。所有平台典型的1:1對映關係

pkmap_base

page_offset-1

核心持久對映區。對映高階記憶體頁到核心空間的方法之一

modules_vaddr

modules_end-1

核心模組對映空間。核心模組通過insmod安裝並動態對映到此區域

0x00001000

task_size-1

使用者程序對映區。每個程序通過mmap()函式對映到這個區域

0x00000000&

0x00000fff

cpu向量頁/空指標陷阱。不支援中斷向量重對映的cpus在此區間進行對映。核心和使用者空間釋放空指標也在此空間捕捉

以imx6dl為例看一下具體的虛擬位址空間如何分配的,原始碼參考自飛思卡爾基於linux-3.0.35版本發布的imx6核心**),先上具體的對映布局直觀感受一下:

圖 imx6dl虛擬記憶體空間布局

具體位址及定義出處:

0xffff0000 ~ 0xffff1000 ( 4 kb)

vector的起始位址在核心預設配置arch/arm/configs/qmx6_deconfig中定義config_vectors_base 為0xffff0000,該對映區占用乙個頁的大小。

0xfff00000 ~0xfffe0000 ( 896 kb)

fixmap起始位址fixaddr_start,結尾位址fixaddr_top均定義在arch/arm/include/asm/fixmap.h,分別固定為0xfff00000和0xfffe0000

0xf4600000 - 0xffe00000 ( 184 mb)

起始位置consistent_base, 結束位置consistent_end均定義在 arch/arm/include/asm/memory.h,其中

consistent_base =consistent_end – consistent_dma_zise
consistent_end固定為0xffe00000

consistent_dma_zise的定義在arch/arm/plat-mxc/include/mach/memory.h中,cpu為mx6的開發板,大小為184*sz_1m

該區域被i/o對映所占用,呼叫ioremap()會對映到這個區域中,具體定義在arch/arm/plat-mxc/include/mach/mx6.h中,外設基位址peripabase_virt定義為0xf2000000,為i/o對映的起始位址

0xc0800000 - 0xf2000000 ( 792 mb)

vmalloc_start 定義在arch/arm/ include/asm/pgtable.h中,vmalloc_start具體定義為

#define vmalloc_start      (((unsigned long)high_memory + vmalloc_offset) & ~(vmalloc_offset-1))
high_memory由物理記憶體的結束位址轉化而來,然後換算成虛擬位址,最後得到0xc0000000,也就是直接對映區(lowmem)的末尾。

vmalloc_offset為直接對映區到vmalloc的偏移量,大小8m,此page gap用於守護記憶體訪問越界錯誤。vmalloc_end定義在arch/arm/plat-mxc/include/mach/vmalloc.h中,固定為0xf2000000

lowmem : 0x80000000 - 0xc0000000 (1024 mb)

起始位址page_offset,結束位址為high_memory,page_offset定義在.config中為0x8000000,high_memory的值在bootmem_init時候計算出來,在vmalloc中計算vmalloc_start時也應用了該值。

核心映象對映位址空間在lowmem 範圍內,起始位址定義在vmlinx.lds.s中,為page_offset+test_offset,test_offset定義在arch/arm/makefile中,值為0x00008000, 所以核心映象所在的起始位址為0x80008000,其中又包括.init/.text/.data/.bss段等,就不詳細說了。而0x80000000~0x80008000的空間用於存放核心頁表,。

modules : 0x7f000000 - 0x80000000 ( 16 mb)

起始位址modules_vaddr = page_offset – 16*1024*1024

結束位址modules_end = page_offset

定義在arch/arm/include/asm/memory.h中

0x00000000 ~0x7f000000

task_size =config_page_offset – 0x01000000
定義在arch/arm/include/asm/memory.h,config_page_offset在lowmem中已經說明為0x80000000,所減去的16m空間被modules所占用,所以task_size實際為0x7f000000,而0x00000000為起始的第一頁為cpu向量頁/空指標陷阱。

4G虛擬記憶體布局

為了保證程序執行的安全性,作業系統使用保護模式,系統不會直接訪問資料真實的位址,採用虛擬記憶體,虛擬記憶體與真實記憶體對映,通過對映關係來獲取檔案和資料。系統會給每個程序都分配乙個4g大小的虛擬記憶體 虛擬記憶體空間的布局 分為使用者空間 3g 和核心空間 1g 資料區為了方便理解是我自己劃分的 實...

虛擬記憶體應用

虛擬記憶體的重要性體現在下面幾個方面 1 虛擬記憶體可以對映到硬碟,以達到擴充套件記憶體的作用,這樣系統在物理記憶體已經用滿的情況下,就不會因為沒有記憶體可用,而導致系統崩潰。2 虛擬記憶體是以程序空間為定址空間的,一般情況,程序使用者模式下的定址空間 是2g,為了避免記憶體的碎片,可以把2g程序空...

虛擬記憶體(Virtual Memory)

虛擬記憶體 virtual memory 是windows管理所有可用記憶體的方式。對於32位windows系 統,每個程序所用到的虛擬記憶體位址從0到2 32 1,總容量4gb,其中2gb是與作業系統以 及其他所有程序所共享,另外2gb分派給程序獨佔 這就是常說的32位windows中乙個進 程最...