zoukankan      html  css  js  c++  java
  • ARM4412的MMU内存管理单元

    由于在裸板驱动的时候要中断>>异常>>MMU

    MMU是一个内存管理单元,在CP15协处理器里面,而CP15处理器是嵌入在ARM芯片里。功能是将虚拟地址映射到物理地址里面。

    在使用MMU寄存器机制之前首先要配置寄存器。将寄存器的功能打开

    映射的机制支持段模式1M,小段模式,小页模式(更精细)

    000000-------1000000  rom的地址

    TLB虚拟地址与物理地址缓存的对应关系

    页表的产生:假如将4个G的虚拟地址映射到1G的物理地址,假如有100个线程同时使用表,此时,建立的表的大小为:

    4G*8*100=3200G。而此时将表放到内存中。。。。。。

    但是将虚拟地址映射到物理的地址比如:将3000 0000地址映射到5000 0000的物理地址,此时可将虚拟地址分为高12位(基地址)和低20位(偏移地址),假如是3201 2345的虚拟地址映射到的物理5201 2345地址,此时只要映射基地值的值。只将320地址映射。而偏移地址的值存在对应的5000 0000+(基地值 * 4)这个地址里面。此时,只要使用2的12子方*4=16K。

    这就是一级页表;

     1   2 int (*printf)(char *, ...) = 0xc3e114d8;
     2   3 
     3   4 void init_ttb(unsigned long *addr);
     4   5 void enable_mmu(void);
     5   6 
     6   7 int main()
     7   8 {
     8   9     unsigned long *p = (unsigned long *)0x50000000;
     9  10     *p = 0x498afec0;
    10  11     printf("%x
    ", *p);
    11  12 
    12  13     enable_mmu();
    13  14 
    14  15     unsigned long *r = (unsigned long *)0x30000000;
    15  16     printf("%x
    ", *r);
    16  17 }
    17  18 
    18  19 void init_ttb(unsigned long *addr)
    19  20 {
    20  21     unsigned long va = 0;
    21  22     unsigned long pa = 0;
    22  23 
    23  24     for(va=0x30000000; va<=0x40000000; va+=0x100000){
    24  25         pa = va + 0x20000000;
    25  26         addr[va >> 20] = pa | 2;
    26  27     }
    27  28     for(va=0x40000000; va<=0x80000000; va+=0x100000){
    28  29         pa = va;
    29  30         addr[va >> 20] = pa | 2;
    30  31     }
    31  32     for(va=0x00000000; va<=0x14000000; va+=0x100000){
    32  33         pa = va;
    33  34         addr[va >> 20] = pa | 2;
    34  35     }
    35  36 }
    36  37 
    37  38 void enable_mmu(void)
    38  39 //配置mmu寄存器
    39  40 {
    40  41     unsigned long addr = 0x60000000;
    41  42 
    42  43     init_ttb(addr);
    43  44     //内存映射表,将
    44  45     //0x30000000  =>  0x50000000;
    45  46     unsigned long mmu = 1 | (1 << 1) | (1 << 8);
    46  47     printf("hahaha
    ");
    47  48     __asm__ __volatile__(
    48  49         "mov r0, #3
    "
    49  50         "MCR p15, 0, r0, c3, c0, 0
    "
    50  51         "MCR p15, 0, %0, c2, c0, 0
    "
    51  52         "MCR p15, 0, %1, c1, c0, 0
    "
    52  53         :
    53  54         //输出
    54  55         : "r" (addr), "r" (mmu)
    55  56         //输入
    56  57         : "r0"
    57  58         //
    58  59     );
    59  60 }
    View Code
  • 相关阅读:
    如何用ASP.NET加密Cookie数据过程分析
    PHP监控linux服务器负载情况分析解决方案
    我发现了博客的一个小问题
    人生总是有太多的失望
    小公司根据实据情况部署实施Linux集群网站
    刚刚收到光棍短信祝福了!
    我对你的期望有点过了
    PHP在接下来的几年内将是主主流的
    不付出一定不会有收获!
    关于创建RootDesigner的文章
  • 原文地址:https://www.cnblogs.com/hongzhunzhun/p/4501180.html
Copyright © 2011-2022 走看看