Linux核心記憶體

2021-08-15 12:58:34 字數 2426 閱讀 3826

核心空間占用4g虛擬記憶體的後1g

明確:不論在核心空間還是使用者空間,看到的位址都是虛擬位址,只是虛擬位址空間不一樣;

但是cpu最終訪問的位址是虛擬位址對應的實體地址;虛擬位址轉換成對應的實體地址需要mmu;

將來mmu利用頁表進行位址轉換;

引申:uclinux支援不帶mmu的處理器;

問:使用者空間的虛擬記憶體和物理記憶體的對映關係?

問:核心空間的虛擬記憶體和物理記憶體的對映關係?

答:4.概念:

io空間:

記憶體空間:

對於x86架構,有兩類匯流排:

一類匯流排的位寬為16位,位址空間的大小為64k,如果外設連線到這類匯流排,

cpu訪問外設只能通過in,out兩條指令;對於這個位址空間又稱io空間;

另一類匯流排的位寬為32位,位址空間的大小為4g(實體地址),如果外設連線到這類匯流排,

*(volatile unsigned long *)0xe0200080 = 0x11000;

對於arm架構:

無io空間,有記憶體空間

將來軟體上以位址指標的形式訪問這個外設即可;

這個位址可以通過晶元手冊和原理圖來獲取

5.使用者虛擬記憶體和物理記憶體的對映:

採用動態記憶體對映,需要訪問了,動態建立使用者虛擬位址和實體地址的對映關係,

訪問完畢,要解除使用者虛擬位址和實體地址的對映關係;

這種動態記憶體對映造成記憶體的訪問效率不高;

使用者最大能夠訪問3g物理記憶體;

6.核心虛擬記憶體和物理記憶體的對映:

採用靜態記憶體對映,在核心啟動的時候,就已經將核心1g的虛擬記憶體和物理記憶體做一一的對映關係,

這種對映對記憶體的訪問效率較高,一一對映:

核心虛擬位址 物理記憶體實體地址

0xc0000000 0x0

0xc0000001 0x1

0xc0000002 0x2

0xc0000003 0x3

... ...

如果採用以上一一對映,最終導致核心只能訪問1g的物理記憶體;

劃分的本質目的:最終的目的是既可以保證記憶體的訪問效率,有可以讓核心訪問所有的物理記憶體;

x86平台,核心1g虛擬記憶體的劃分:

直接記憶體對映區:

特點:1.直接記憶體對映區對應的核心虛擬記憶體,在核心啟動的時候,就已經跟物理記憶體進行一一對映;這塊記憶體的訪問效率要高;

2.如果物理記憶體大於1g,此時直接記憶體對映區的大小為896m,如果物理記憶體小於1g(512m),那麼直接記憶體對映區的大小就是物理記憶體的大小;

3.直接記憶體對映區又稱低端記憶體;

動態記憶體對映區:

特點:1.如果要訪問某塊物理記憶體或者某個實體地址,

可以將這個物理記憶體或者實體地址動態對映到動態記憶體對映區的虛擬記憶體上或者虛擬位址上;

這種記憶體的訪問效率要低,如果不再使用,記得要解除位址對映;

2.預設大小為120m

永久記憶體對映區:

固定記憶體對映區:

特點:1.永久是固定,固定就是永久

2.如果頻繁訪問某個物理記憶體或者實體地址,

可以將這個實體地址或者物理記憶體對映到永久記憶體對映區或者固定記憶體對映區,

無需頻繁建立對映和解除對映,加快記憶體的訪問效率;

注意:前者在對映的時候會導致休眠,不能用於中斷上下文

後者可以用於中斷上下文中;

3.各自大小為4m

注意:動態 + 永久 + 固定 = 高階記憶體

arm架構

s5pv210處理器,核心1g虛擬記憶體的劃分:

1.啟動開發板

2.檢視核心列印資訊,找到如下資訊:

virtual kernel memory layout:

起始位址 結束位址 大小

異常向量表

vector : 0xffff0000 - 0xffff1000 ( 4 kb)

固定記憶體對映區

fixmap : 0xfff00000 - 0xfffe0000 ( 896 kb)

dma記憶體對映區:

dma : 0xff000000 - 0xffe00000 ( 14 mb)

動態記憶體對映區:

vmalloc : 0xf4800000 - 0xfc000000 ( 120 mb)

直接記憶體對映區

lowmem : 0xc0000000 - 0xf4000000 ( 832 mb)

modules : 0xbf000000 - 0xc0000000 ( 16 mb)

.init : 0xc0008000 - 0xc0037000 ( 188 kb)

.text : 0xc0037000 - 0xc0838000 (8196 kb)

.data : 0xc0838000 - 0xc088c900 ( 339 kb)   

linux核心記憶體分配

核心中的記憶體分配通常通過kmalloc kfree來進行,但是也有其它的方式來獲取記憶體,所有這些方式共同提供了核心中分配 釋放記憶體的介面。類似於標準c中的malloc free,kmalloc kfree是核心中的用於常規記憶體分配的介面。kmalloc kfree是工作在slab分配器的基礎...

linux核心記憶體管理

整個linux虛擬記憶體發布如下 3g以上是核心位址,0 3g是程序位址空間。在x86結構中,核心位址分為三種,這三種型別的區域如下 zone dma 記憶體開始的16mb zone normal 16mb 896mb zone highmem 896mb 結束 程序位址空間的3g,通過mmu,隨機...

Linux核心記憶體分配

函式有 kmalloc get free page get free pages get free page vmalloc kmem cache kmem cache alloclinux記憶體分為3中,dma 可以直接訪問 normal memory,high memory 一般記憶體中,前16...