1.了解mmu的功能和作用:mmu全称为虚拟内存管理器,搞懂mmu可以让我使用更多的内存,而不是简单的只有物理内存。可以做到相同的虚拟地址在不同的进程中,读取的不同的数。不同的进程地址转换规则不同。
2.深入解析mmu:
地址转换分为两个层。level one level two
通过TTB的后两位,把转换分为段转换,细叶转换,和粗页转换。这就是第二层!TTB这张表由程序员建立,储存在内存中把其基地址写在cp15 的c2上。
粗页转换不常用,我只学另外两个。
段转换:31-20为段基地址,后面20位为偏移地址。
细叶转换:31-12细叶页表基地址0-11为偏移地址。
3.建立页表
建立一级页表,把TTB写入cp15 的c2,打开MMU
下面用段转换来实现控制LED的虚地址点亮LED,我的led相关配置寄存器物理地址为
#define GPFCON *(volatile unsigned long*)0x56000050
#define GPFDAT *(volatile unsigned long*)0x56000054
物理地址的基地址为0x56000000,虚拟地址的基地址随意选,我选择0xa0000000,我用的为2440的片子,把页表存在内存的开头0x30000000处。创建页表
初始化mmu:
现在在程序中可以使用虚拟地址了:
成功!