• 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; }

  • 相关阅读:
    CodeForces 1294B Collecting Packages(排序+贪心)
    计算系数(组合数)
    垒骰子(矩阵快速幂)
    蒜头君倒水(矩阵快速幂)
    Buy Tickets POJ
    Billboard HDU
    树状数组求逆序对 附HDU1394
    codeforces 1304D Shortest and Longest LIS
    codeforces 1301C Ayoub's function
    Codeforces 1301B Motarack's Birthday(二分)
  • 原文地址:https://www.cnblogs.com/jfyl1573/p/6256747.html
Copyright © 2020-2023  润新知