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

  • 相关阅读:
    理解Golang包导入
    go语言执行windows下命令行的方法
    Go中使用动态库C/C++库
    MongoDB · 引擎特性 · MongoDB索引原理
    Linux中more和less命令用法
    修改Linux文件句柄限制
    MongoDB自动删除过期数据--TTL索引
    mongodb可以通过profile来监控数据 (mongodb性能优化)
    MongoDB学习笔记(索引)
    查看nginx cache命中率
  • 原文地址:https://www.cnblogs.com/jfyl1573/p/6256747.html
Copyright © 2011-2022 走看看