韦东山Linux嵌入式课程社区
直播中

李辛华

7年用户 206经验值
私信 关注

裸机加强版***相同

ARM裸机1期加强版 024_mmu_cache_02102_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);
  • }

复制代码

回帖(2)

李慧芳

2019-4-18 12:46:09
群友回复:framebuff的那个页表会重新把它在sdram中的那个大页表重新设置一次,设置结果肯定以第二次的为准。就像a=3;...........a=5;最终还是以5为a的结果
1 举报
  • a932265643: 你好,请问 我把create_secdesc(ttb, 0x33c00000, 0x33c00000, IO);改成create_secdesc(ttb, 0x63c00000, 0x33c00000, IO);
    同事吧fb_base也改为0x63c00000,为什么LCD显示就不正常了

乐侨珂

2019-4-18 13:01:10
群友回复:开启mmu后,才会通过页表查找。现在只是配置,你在启动mmu前设置多少遍都以最后一次为准。有个简单的理解,你配置无论多少次,始终配置的同一个页地址,你后一次写肯定会覆盖掉前面内容的。
1 举报
  • a932265643: 你好,请问 我把create_secdesc(ttb, 0x33c00000, 0x33c00000, IO);改成create_secdesc(ttb, 0x63c00000, 0x33c00000, IO);
    同事吧fb_base也改为0x63c00000,为什么LCD显示就不正常了

更多回帖

发帖
×
20
完善资料,
赚取积分