微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux (S3C6410架构/2.6.35内核)的内存映射(五)

ARM Linux (S3C6410架构/2.6.35内核)的内存映射(五)

时间:11-09 来源:互联网 点击:

系统中定义了多个映射类型,最常用的是MT_MEMORY,它对应RAM;MT_DEVICE则对应了其他I/O设备,应用于ioremap;MT_ROM对应于ROM;MT_LOW_VECTORS对应0地址开始的向量;MT_HIGH_VECTORS对应高地址开始的向量,它有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] 

内存空间和三种域的对应关系如下:

内存空间
设备空间DOMAIN_IO
内部高速SRAM空间/内部MINI Cache空间DOMAIN_KERNEL
RAM内存空间/ROM内存空间DOMAIN_KERNEL
高低端中断向量空间DOMAIN_USER


ARM处理器为每一个域定义了四种不两只的访问类型(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时初始化c3寄存器来实现对内存域的访问控制。其中对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] 

在系统的引导过程中对这3个域的访问控制位并不是一成不变的,它提供了一个名为modify_domain的宏来修改域访问控制位。系统在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] 


上一篇:ARM中的CACHE机制
下一篇:浅谈ARM架构1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top