ARM裸机1期加强版 024_mmu_cache_021 02_mmu_021_004mmu.c 文件
/* 2.3 for 64M sdram */
创建页表 SDRAM 64M 虚拟地址到物理地址的映射: MEM 类型
/* 2.5 for Framebuffer : 0x33c00000 */
创建framebuffer 虚拟地址到物理地址的映射:IO 类型
问题:
1. framebuffer 所指向的内存也属于SDRAM ,步骤 /* 2.3 for 64M sdram */ 已经实现了 整个SDRAM的虚拟地址到物理地址的 一对一 映射,在 /* 2.5 for Framebuffer : 0x33c00000 */ 中又映射了一次,他们不会重复吗?
2. CPU 发出 framebuffer 对应的地址时,MMU怎么区分是执行/* 2.3 for 64M sdram */ 的映射 还是 执行 /* 2.5 for Framebuffer : 0x33c00000 */ 的映射?
mmu.c -> void create_page_table(void) 代码如下:
- void create_page_table(void)
- {
- /* 1. 页表在哪? 0x32000000(占据16KB) */
- /* ttb: translation table base */
- unsigned int *ttb = (unsigned int *)0x32000000;
- unsigned int va, pa;
- int index;
- /* 2. 根据va,pa设置页表条目 */
- /* 2.1 for sram/nor flash */
- create_secdesc(ttb, 0, 0, IO);
- /* 2.2 for sram when nor boot */
- create_secdesc(ttb, 0x40000000, 0x40000000, MEM);
- /* 2.3 for 64M sdram */
- va = 0x30000000;
- pa = 0x30000000;
- for (; va < 0x34000000;)
- {
- create_secdesc(ttb, va, pa, MEM);
- va += 0x100000;
- pa += 0x100000;
- }
- /* 2.4 for register: 0x48000000~0x5B00001C */
- va = 0x48000000;
- pa = 0x48000000;
- for (; va <= 0x5B000000;)
- {
- create_secdesc(ttb, va, pa, IO);
- va += 0x100000;
- pa += 0x100000;
- }
- /* 2.5 for Framebuffer : 0x33c00000 */
- create_secdesc(ttb, 0x33c00000, 0x33c00000, IO);
- /* 2.6 for link address */
- create_secdesc(ttb, 0xB0000000, 0x30000000, MEM);
- }
复制代码