開始位置
結束位置
使用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中乙個進 程最...