zoukankan      html  css  js  c++  java
  • MMU工作原理

    MMU的工作原理就是把虚拟地址转换成物理地址。

    虚拟地址:由编译器和连接器在定位程序时分配。

    物理地址:用来访问实际的主存硬件模块。

    使用虚拟存储器的系统都使用一种称为分页(paging)。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。

    自己写的裸机程序:

    void mem_init(unsigned long *ttb); void mmu_init(); void mmu_enable(); void mmap(unsigned long *ttb,unsigned long pa,unsigned long va); int (*printf)(const char *format, ...) = (void *)0x43e11a2c;

    _start() {  unsigned long *va = (void *)0x76500000;  unsigned long *pa = (void *)0xfff00000;

     *va = 123;

     mmu_init();  

     mmu_enable();

     mmap((void *)(0x70000000),(unsigned long)(pa),(unsigned long)(va)); =%d ",*va);   //123 }

    void mem_init(unsigned long *ttb)   

     unsigned long i;

     for(i=0x0000000;i<=0x14000000;i+=(1<<20))  {   ttb[i>>20]=(i & 0xfff00000) | 0x2;  }

     for(i=0x40000000;i<=0x80000000;i+=(1<<20))  {   ttb[i>>20]=(i & 0xfff00000) | 0x2;  } }

    void mmu_init() {  unsigned long *ttp = (void *)(0x70000000); 

     __asm__ __volatile__ (    "MCR P15,0,%0,C2,C0,0;"    "mvn r0,#0x0;"    "MCR P15,0,r0,C3,C0,0;"    :    :"r"(ttp)    :"r0"    ); }

    void mmu_enable() {  __asm__ __volatile__ (    "MRC P15,0,r0,C1,C0,0;"    "orr r0,r0,#1;"    "MCR P15,0,r0,C1,C0,0;"    :    :    :"r0"    ); }

    void mmap(unsigned long *ttb,unsigned long pa,unsigned long va) {  ttb[pa>>20] = (va & 0xfff00000) | 0x2; }

  • 相关阅读:
    NYOJ41三个数从小到大排序
    HDUOJ2115I Love This Game
    NYOJ56阶乘因式分解(一)
    NYOJ65另一种阶乘问题
    HDUOJ1234开门人和关门人
    NYOJ74小学生算术
    NYOJ11奇偶数分离
    HDUOJ3980取模运算
    HDUOJ2014 青年歌手大奖赛_评委会打分
    HDUOJ1860 统计字符
  • 原文地址:https://www.cnblogs.com/jfyl1573/p/6256747.html
Copyright © 2011-2022 走看看