<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM Linux (S3C6410架構/2.6.35內核)的內存映射(五)

ARM Linux (S3C6410架構/2.6.35內核)的內存映射(五)

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏

ARM Linux的訪(fǎng)問(wèn)權限控制

ARM1176JZF-S處理器為訪(fǎng)問(wèn)權限控制定義了兩個(gè)層次:第一層是"域"(Domain)的訪(fǎng)問(wèn)類(lèi)型,第二層是頁(yè)或者段的"讀寫(xiě)權限"(Access Permission)。具體來(lái)說(shuō),過(guò)程是這樣的:

本文引用地址:http://dyxdggzs.com/article/201611/317856.htm

1.在A(yíng)RM處理器中,MMU將整個(gè)存儲空間分成最多16個(gè)域,記作D0~D15,每個(gè)域對應一定的存儲區域,該區域具有相同的訪(fǎng)問(wèn)控制屬性。每個(gè)域的訪(fǎng)問(wèn)權限分別由CP15的C3寄存器中的兩位來(lái)設定,c3寄存器的大小為32bits,剛好可以設置16個(gè)域的訪(fǎng)問(wèn)權限。

Bits31, 3029, 2827, 2625, 2423, 2221, 2019, 1817, 1615, 1413, 1211, 109, 87, 65, 43, 21, 0
DomainD15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0

對于每一個(gè)域所對應的兩個(gè)bit,訪(fǎng)問(wèn)類(lèi)型設置方法如下:

訪(fǎng)問(wèn)類(lèi)型含義
0b00無(wú)訪(fǎng)問(wèn)權限此時(shí)訪(fǎng)問(wèn)該域將產(chǎn)生訪(fǎng)問(wèn)失效
0b01用戶(hù)(client)根據CP15的C1控制寄存器中的R和S位以及頁(yè)表中地址變換條目中的訪(fǎng)問(wèn)權限控制位AP來(lái)確定是否允許各種系統工作模式的存儲訪(fǎng)問(wèn)
0b10保留使用該值會(huì )產(chǎn)生不可預知的結果
0b11管理者(Manager)不考慮CP15的C1控制寄存器中的R和S位以及頁(yè)表中地址變換條目中的訪(fǎng)問(wèn)權限控制位AP,在這種情況下不管系統工作在特權模式還是用戶(hù)模式都不會(huì )產(chǎn)生訪(fǎng)問(wèn)失效
2. 如果域的訪(fǎng)問(wèn)類(lèi)型是0b01的話(huà),下面就進(jìn)入第二層。所訪(fǎng)問(wèn)內存頁(yè)或段的權限還要根據CP15的C1寄存器中的R和S位以及頁(yè)/段表項中的訪(fǎng)問(wèn)權限控制位AP(X)來(lái)決定。
APXAP[1:0]特權模式訪(fǎng)問(wèn)權限用戶(hù)模式訪(fǎng)問(wèn)權限
0b00禁止訪(fǎng)問(wèn);S=1,R=0或S=0,R=1時(shí)只讀禁止訪(fǎng)問(wèn);S=1,R=0時(shí)只讀
0b01讀寫(xiě)禁止訪(fǎng)問(wèn)
0b10讀寫(xiě)只讀
0b11讀寫(xiě)讀寫(xiě)
1b00保留保留
1b01只讀禁止訪(fǎng)問(wèn)
1b10只讀只讀
1b11只讀只讀
[8]參考ARM1176JZF-S Revision: r0p7->6.5.2 Access permissions
下面看一下Linux是如何實(shí)現的。
在談到create_mapping之前,必須說(shuō)明一下Linux是如何實(shí)現對頁(yè)面的訪(fǎng)問(wèn)控制的。
Linux使用結構體mem_type來(lái)定義不同的內存映射類(lèi)型(arch/arm/mm/mm.h),不同的映射類(lèi)型定義了不同的訪(fǎng)問(wèn)權限:
[c]struct mem_type {unsigned int prot_pte;unsigned int prot_l1;unsigned int prot_sect;unsigned int domain;};[/c] 

其中處成員含義如下:
prot_pte代表頁(yè)表項的訪(fǎng)問(wèn)控制權,pte即第二級映射表項(頁(yè)表項)。
prot_l1代表段表項的訪(fǎng)問(wèn)控制位,l1即第一級映射表項(段表項/主頁(yè)表項)。
prot_sect代表主頁(yè)表(注意,不是主頁(yè)表項)的訪(fǎng)問(wèn)控制位和內存域。
domain代表所屬的內存域。
對于A(yíng)RM處理器,Linux定義了一個(gè)類(lèi)型為struct mem_type的局部靜態(tài)數組(arch/arm/mm/mmu.c)。根據不同的映射類(lèi)型,定義了不同的訪(fǎng)問(wèn)權限。

[c]static struct mem_type mem_types[] = {[MT_DEVICE] = { .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED |L_PTE_SHARED,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PROT_SECT_DEVICE | PMD_SECT_S,.domain = DOMAIN_IO,},[MT_DEVICE_NONSHARED] = { .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_NONSHARED,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PROT_SECT_DEVICE,.domain = DOMAIN_IO,},[MT_DEVICE_CACHED] = { .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_CACHED,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PROT_SECT_DEVICE | PMD_SECT_WB,.domain = DOMAIN_IO,},[MT_DEVICE_WC] = { .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_WC,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PROT_SECT_DEVICE,.domain = DOMAIN_IO,},[MT_UNCACHED] = {.prot_pte = PROT_PTE_DEVICE,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,.domain = DOMAIN_IO,},[MT_CACHECLEAN] = {.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN,.domain = DOMAIN_KERNEL,},[MT_MINICLEAN] = {.prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE,.domain = DOMAIN_KERNEL,},[MT_LOW_VECTORS] = {.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |L_PTE_EXEC,.prot_l1 = PMD_TYPE_TABLE,.domain = DOMAIN_USER,},[MT_HIGH_VECTORS] = {.prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |L_PTE_USER | L_PTE_EXEC,.prot_l1 = PMD_TYPE_TABLE,.domain = DOMAIN_USER,},[MT_MEMORY] = {.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,.domain = DOMAIN_KERNEL,},[MT_ROM] = {.prot_sect = PMD_TYPE_SECT,.domain = DOMAIN_KERNEL,},[MT_MEMORY_NONCACHED] = {.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE,.domain = DOMAIN_KERNEL,},};[/c] 

系統中定義了多個(gè)映射類(lèi)型,最常用的是MT_MEMORY,它對應RAM;MT_DEVICE則對應了其他I/O設備,應用于ioremap;MT_ROM對應于ROM;MT_LOW_VECTORS對應0地址開(kāi)始的向量;MT_HIGH_VECTORS對應高地址開(kāi)始的向量,它有vector_base宏決定。

[c]arch/arm/include/asm/io.h#define MT_DEVICE               0#define MT_DEVICE_NONSHARED     1#define MT_DEVICE_CACHED        2#define MT_DEVICE_WC            3arch/arm/include/asm/mach/map.h#define MT_UNCACHED             4#define MT_CACHECLEAN           5#define MT_MINICLEAN            6#define MT_LOW_VECTORS          7#define MT_HIGH_VECTORS         8#define MT_MEMORY               9#define MT_ROM                  10[/c] 

盡管ARM定義了16種不同的域,但是Linux只使用其中的三種:D0 ~ D2 (arch/arm/include/asm/domain.h)

[c]#define DOMAIN_KERNEL   0#define DOMAIN_TABLE    0#define DOMAIN_USER     1#define DOMAIN_IO       2[/c] 

內存空間和三種域的對應關(guān)系如下:

內存空間
設備空間DOMAIN_IO
內部高速SRAM空間/內部MINI Cache空間DOMAIN_KERNEL
RAM內存空間/ROM內存空間DOMAIN_KERNEL
高低端中斷向量空間DOMAIN_USER


ARM處理器為每一個(gè)域定義了四種不兩只的訪(fǎng)問(wèn)類(lèi)型(0b00 ~ 0x11),Linux使用其中的三種(0b10不用),宏定義如下:
arch/arm/include/asm/domain.h

[c]#define DOMAIN_NOACCESS 0#define DOMAIN_CLIENT   1#define DOMAIN_MANAGER  3[/c] 

Linux在系統引導設置MMU時(shí)初始化c3寄存器來(lái)實(shí)現對內存域的訪(fǎng)問(wèn)控制。其中對DOMAIN_USER,DOMAIN_KERNEL和DOMAIN_TABLE均設置DOMAIN_MANAGER權限;對DOMAIN_IO設置DOMAIN_CLIENT權限。
arch/arm/include/asm/domain.h

[c]#define domain_val(dom,type)    ((type) << (2*(dom)))arch/arm/kernel/head.S......mov     r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | domain_val(DOMAIN_IO, DOMAIN_CLIENT))mcr     p15, 0, r5, c3, c0, 0           @ load domain access registermcr     p15, 0, r4, c2, c0, 0           @ load page table pointerb       __turn_mmu_onENDPROC(__enable_mmu)[/c] 

在系統的引導過(guò)程中對這3個(gè)域的訪(fǎng)問(wèn)控制位并不是一成不變的,它提供了一個(gè)名為modify_domain的宏來(lái)修改域訪(fǎng)問(wèn)控制位。系統在setup_arch中調用early_trap_init后,DOMAIN_USER的權限位將被設置成DOMAIN_CLIENT。
arch/arm/include/asm/domain.h

[c]#define set_domain(x)                                   do {                                            __asm__ __volatile__(                           "mcr    p15, 0, %0, c3, c0      @ set domain"   : : "r" (x));                                 isb();                                          } while (0)#define modify_domain(dom,type)                                 do {                                                    struct thread_info *thread = current_thread_info();     unsigned int domain = thread->cpu_domain;               domain &= ~domain_val(dom, DOMAIN_MANAGER);             thread->cpu_domain = domain | domain_val(dom, type);    set_domain(thread->cpu_domain);                         } while (0)[/c] 



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>