⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmu.c

📁 FS2410 开发板上启用 MMU 实现虚拟内存管理
💻 C
字号:
#include "addr.h"
#include "mmu.h"

void init_mmu() {
  unsigned long ttb = (unsigned long)MMU_TBL_BASE;
  __asm__(
	  "mov r0, #0\n"

	  /* disable ICache, DCache on v4*/
	  "mcr p15, 0, r0, c7, c7, 0\n"

	  /* drian wirte buffer on v4*/
	  "mcr p15, 0, r0, c7, c10, 4\n"

	  /* disable ICache, DCache, TLBs on v4*/
	  "mcr p15, 0, r0, c8, c7, 0\n"

	  /* load page table pointer*/
	  "mov r4, %0\n"
	  "mcr p15, 0, r4, c2, c0, 0\n"

	  /*
           * write domain id (cp15_r13)
	   * domain=0b11, manager mode, no check for permission
           */
	  "mvn r0, #0\n"
	  "mcr p15, 0, r0, c3, c0, 0\n"

	  /* set control register v4*/
	  "mrc p15, 0, r0, c1, c0, 0\n"

	  /* clear out 'unwanted' bits*/
	  "ldr r1, =0x1384\n"
	  "bic r0, r0, r1\n"

          /*
	   * turn on what we want
	   * base location of exception = 0xffff0000
           */
	  "orr r0, r0, #0x2000\n"
	  /* fault checking enabled*/
	  "orr r0, r0, #0x0002\n"
#ifdef CONFIG_CPU_DCACHE_ON
	  "orr r0, r0, #0x0004\n"
#endif
#ifndef CONFIG_CPU_ICACHE_ON
	  "orr r0, r0, #0x1000\n"
#endif
	  /* MMU enabled*/
	  "orr r0, r0, #0x0001\n"

	  /* write control register*/
	  "mcr p15, 0, r0, c1, c0, 0\n"
	  : /* no output*/
	  : "r"(ttb));
}

/* init MMU page table*/
void init_mmu_tlb() {
  unsigned long vm_addr, idx;
  unsigned long *tb_base = (unsigned long *)MMU_TBL_BASE;

  for (vm_addr = MEM_START; vm_addr < MEM_END; vm_addr += PAGE_SIZE) {
    idx = vm_addr >> 20;
    /* entry: section base, AP=0b11, domain=0b00,cached,write-through*/
    *(tb_base + idx) = vm_addr|(0x3<<10)|(0<<5)|(1<<4)|(1<<3)|0x02;
  }

  /* set IO mapped-memory addr for function register*/
  for (vm_addr = MEM_IO_MAPPED_START; vm_addr < MEM_IO_MAPPED_END; vm_addr += PAGE_SIZE) {
    idx = vm_addr >> 20;
    /* entry: section base, AP=0b11, domain=0b00, NCNB*/
    *(tb_base + idx) = vm_addr|(0x03<<10)|(0<<5)|(1<<4)|0x02;
  }

  /* 
   * exception vectors
   * entry: AP=0b11, domain=0b00, cached, write-through
   */
  *(tb_base + 0x00000000) = (0x00000000)|(0x03<<10)|(0<<5)|(1<<4)|(1<<3)|0x02;
  *(tb_base + (0xffff0000>>20)) = VECTORS_PHY_BASE|(0x03<<10)|(0<<5)|(1<<4)|(0<<3)|0x02;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -