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

  • 相关阅读:
    VC中隐藏和显示IDC_STATIC
    在VC++中使用Tab Control控件
    关于CTreeView中CTreeCtrl空间的使用
    MFC打开/保存文件对话框:CFileDialog
    Python自学笔记3-数据类型
    MFC实现原理
    VS2008 MFC内部工作原理
    MFC视频教程(孙鑫)学习笔记2-掌握C++
    MFC视频教程(孙鑫)学习笔记1-Windows程序内部运行原理
    error C2440: “=”: 无法从“const char [11]”转换为“LPCWSTR”
  • 原文地址:https://www.cnblogs.com/jfyl1573/p/6256747.html
Copyright © 2011-2022 走看看