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]
ARMLinuxS3C6410架构2 6 35内核内存映 相关文章:
- ARM Linux (S3C6410架构/2.6.35内核)的内存映射(三)(11-09)
- ARM Linux (S3C6410架构/2.6.35内核)的内存映射(四)(11-09)
- ARM Linux (S3C6410架构/2.6.35内核)的内存映射(二)(11-09)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- 基于TMS320DM642的农药喷洒系统(04-22)
- 用DSP56F805 PWM模块输出高频正弦波(05-25)