歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> ARM Linux內存管理

ARM Linux內存管理

日期:2017/3/1 10:23:40   编辑:Linux編程

1、ARM地址是32位,所以虛擬地址總容量也是4GB。同樣分為系統空間和用戶空間。

對於SA-1100,也是3GB為界。

#define TASK_SIZE 0xc0000000(定義每個進程用戶空間大小)

#define PAGE_OFFSET 0xc0000000

#define PHYS_OFFSET 0xc0000000(內存的物理地址起點)

所以在系統空間,即在內核中,虛擬地址與物理地址在數值上是相同的,這反映在

#define _ _pa(x) _ _virt_to_phys((unsigned long)(x))

#define _ _va(x) ((void*)_ _phys_to_virt((unsigned long)(x)))

#define _ _virt_to_phys(x) (x)

#define _ _phys_to_virt (x)

至於用戶空間的地址映射,動態的,根據需要分配物理內存,並且建立起具體進程的虛擬地址與所分配的物理內存間的映射。

系統空間的一部分不是映射到物理內存,而是映射到一些I/O設備,包括寄存器和一些小塊的存儲器。

2、在ARM系統結構,地址映射可以是單層的按段映射,也可以是二層的按頁面映射。段的大小是1MB,而頁的大小可以是64KB的大頁面,或者是4KB的小頁面,還可以是1KB的細小頁面。其中64KB和4KB的頁面映射稱為粗頁面映射,1KB的頁面映射稱為細頁面映射。

3、采用單層映射,內存中的段映射表共有4096個表項,每個描述項為4個字節,所以整個映射表,大小為16KB,而且,位置必須與16KB邊界對齊。當CPU訪問內存時,其32為虛擬地址的高12位被用作訪問段映射表的下標,從表中找到相應的表項。每個表項提供了12位的物理地址,以及對這個段的訪問許可標志。將這12位物理段地址與虛擬地址的低20位拼接在一起,就得到了32偉位的物理地址。整個過程由MMU硬件完成,無需CPU介入。

4、如果采用頁面映射,段映射表就成了首層映射表,其表項提供的不再是物理段地址,而是相應二層映射表所在的地址。凡是首層映射表的表項都對應一個二層映射表。二層映射表的大小因頁面映射的“粗”“細”而異。如果是4KB的頁面,則二層映射表中有256個表項。

CPU訪問內存時,映射過程如下:

(1)以32位虛擬地址的高12位作為訪問首層映射表的下標,從表中找到相應的表項,每個表項指向一個二層映射表。

(2)以虛擬地址的次8位(12-19bit)作為訪問所得二層映射表的下標,進一步從相應表項中取得20位的物理頁面地址。

(3)最後,將此20位的物理頁面地址與虛擬地址中的最低12位拼接在一起,就得到了32位的物理地址。

同樣,整個過程由MMU硬件完成,CPU並不介入。

5、由於首層映射表項用途上的多樣性,表項中有兩位的位段,表示其用途。00表示無映射,01表示“粗”頁面表,即頁面大小為64KB或4KB的二層映射表,10表示段映射,11則表示指向“細”頁面表,即頁面大小為1KB的二層映射表。

6、同樣二層映射表中還提供了對頁面的訪問許可,以及頁面大小等信息。因為二層表項所給出的只是20位的物理頁面地址,表項中還有12位可以另作它用。二層映射表項的大小也是4個字節,所以當頁面大小為4KB是,二層映射表大小為1KB,並且須與1KB邊界對齊。頁面為1KB時,有1K個表項,所以表的大小為4KB。頁面為64KB時,按理說二層映射表只要16個就夠了,但實際是ARM系統結構中的二層映射表只有粗細之分,頁面大小為64KB時的二層映射表仍有256個表項,而每個大頁面在表中占16個連續的表項,即把相同的表項重復16次,

7、ARM系統結構還把大頁面和小頁面劃分成4個子頁面。子頁面不是確定地址映射的最小單位,而是確定訪問權限的最小單位。

8、ARM的系統結構還有個“域Domain”的概念。一個域是若干段,從而是若干頁面的集合,而每一個頁面都屬於某一個特定的域,在首層映射表項中都有4位的Domain位段,說明本段屬於那一個域。另一方面,MMU中有個域訪問控制寄存器,通過這個寄存器可以將16個域分別設置成不可訪問、訪問時檢查訪問權限(Client類型)、或不檢查訪問權限(Manager類型)。

9、協處理器中與MMU有關的處理器主要有三個:


Copyright © Linux教程網 All Rights Reserved