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\n", *p);
11  12
12  13     enable_mmu();
13  14
14  15     unsigned long *r = (unsigned long *)0x30000000;
15  16     printf("%x\n", *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\n");
47  48     __asm__ __volatile__(
48  49         "mov r0, #3\n"
49  50         "MCR p15, 0, r0, c3, c0, 0\n"
50  51         "MCR p15, 0, %0, c2, c0, 0\n"
51  52         "MCR p15, 0, %1, c1, c0, 0\n"
52  53         :
53  54         //输出
54  55         : "r" (addr), "r" (mmu)
55  56         //输入
56  57         : "r0"
57  58         //
58  59     );
59  60 }

时间: 2024-10-08 11:56:05

ARM4412的MMU内存管理单元的相关文章

MMU内存管理单元

arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权.多任务多进程操作系统.(来自百度百科,对其几个点不熟悉,因此可以只考虑加粗部分) 发展历史 注意:学习一个知识点,很重要的一步是了解其为什么而存在?它的存在是为了解决什么问题?然后,在学习的过程中带着这些问题去理解.去思考. 在许多年以前,还是使用DOS或一些古老的操作系

MMU内存管理单元相关知识点总结

1.MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统. 2.虚拟内存由来:许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序.但随着图形界面的兴起还有用户需求的不断增大,应用程序

02-JZ2440裸机学习之MMU内存管理单元【转】

本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/66479248 版权声明:本文为博主原创文章,转载请注明http://blog.csdn.net/fengyuwuzu0519. 1.MMU定义: MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系

关于内存管理单元须要掌握的相关知识

1.怎样将虚拟地址转换为物理地址, 2.MMU的内存訪问权限机制, 3.TLB,Catch和write buffer原理. ---------- 内存管理单元MMU的功能:将虚拟地址映射到物理地址,并提供内存訪问权限. 没启动MMU时.cpu核.cache,MMU和外设等全部部件使用的都是物理地址. 启动MMU后,cpu核发出虚拟地址.由MVA转换成物理地址供cache和MMU使用. 最后使用物理地址訪问实际设备. 问题: 为什么是从虚拟地址到物理地址的转换. NAND Flash控制器须要掌握

关于内存管理单元需要掌握的相关知识

1.如何将虚拟地址转换为物理地址, 2.MMU的内存访问权限机制, 3.TLB,Catch和write buffer原理. ---------- 内存管理单元MMU的功能:将虚拟地址映射到物理地址,并提供内存访问权限. 没启动MMU时,cpu核,cache,MMU和外设等所有部件使用的都是物理地址. 启动MMU后,cpu核发出虚拟地址,由MVA转换成物理地址供cache和MMU使用. 最后使用物理地址访问实际设备. 问题: 为什么是从虚拟地址到物理地址的转换. NAND Flash控制器需要掌握

内存管理单元编程实例【转】

转自:http://blog.chinaunix.net/uid-29091195-id-4020919.html 一.MMU初步了解    概念:内存管理单元(memory management unit),简称MMU    主要作用:负责虚拟地址到物理地址之间的转换             提供硬件机制的内存访问权限检查        发展由来:由于程序的大小逐步发展到大于内存的大小这一问题的出现    导致了虚拟存储器的产生,虚拟存储器的基本思想是:数据.堆栈的总    大小可以超越物理存

SoC软件架构设计之二:内存管理单元的硬件设计实现

程序的大部分代码都可以在必要的时候才加载到内存去执行,运行完后可以被直接丢弃或者被其他代码覆盖.我们PC上同时跑着很多的应用程序,每个应用程序使用的虚拟地址空间几乎可以整个线性地址空间(除了部分留给操作系统或者预留它用),可以认为每个应用程序都独占了整个虚拟地址空间(字长是32的CPU是4G的虚拟地址空间),但我们的物理内存只是1G或者2G.即多个应用程序在同时竞争使用这块物理内存,其必然会导致某个时刻只存在程序的某个片段在执行,也即是所有程序代码和数据分时复用物理内存空间-这就是内存管理单元(

内存管理单元MMU

一. .text .global _start _start: ldr sp, =4*1024 @调用C函数之前,要设置栈指针:栈的作用:保存上下文,传递参数,保存临时变量:因为堆栈向下生长,所以要将栈指针设置到地址空间的顶层:总共可用的只有4K,也就是4*1024 bl close_watchdog @关看门狗 bl mem_ctrl_set @设置存储控制器 bl copy_code_sdram @复制代码到sdram bl set_page @设置页表 bl start_mmu @启动mm

Mini2440内存管理单元MMU

一级页表: TTB base代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址是16K对齐,使用[31:14]存储页表基址,[13:0]为0.一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,要么存储它对应的1MB物理空间的起始地址,要么存储下一级页表的地址.使用MVA[31:20]来索引一级页表(2^12=4096个描述符),得到一个描述符,每个描述符占4个字节. 一级描述符低两位: 00:无效(Fault) 01:粗