1、段方式MMU

利用虚拟地址然后找到物理地址,通过物理地址访问到led,其过程如下:
一个段的大小是[19:0]总共有1M的地址空间。

从上面可知对应GPIO的段物理基地址是0x7f000000.那么要在虚拟地址当中找一个段与之形成对应关系,那么这个段是多少呢,假如是0xa0000000这个段,把这两个段关联起来,那么通过页表来建立这个关系。那么这个页表存放在内存的起始地址0x50000000。接下来就要建立该页表的页表项,要建立页表项就要知道它在页表当中的位置,它的位置实际上就是页表的起始地址+虚拟地址的高12位,

找具体表项里面的内容看芯片手册

[31:20]保存的段的物理基地址的高12位,[19:12]should be zero固定为零。[11:10]access permission控制访问权限的,[9]:也为0;[8:5]域,[4]固定为1,[3]是否使用cache

,[2]是否使用write buffer

,[1]固定为1,[0]固定为0.
表项中的第一个部分[31:20](0x7f000000&0xfff00000)
表项中的第二个部分[19:12]0b00000000
表项中的第三个部分[11:10]AP:
表项中的第四个部分[9]为0
表项中的第五个部分[8:5]domain
表项中的第六个部分[4]固定为1
表项中的第七个部分[3]c是否使用cache
表项中的第八个部分[2]b是否使用buffer
表项中的第九个部分[1:0]固定为0b10段的模式
域和AP来共同决定访问权限的:


有疑问???怎么把域写到对应页表项,是直接把对应数字域写到[8:5]位吗?比如要域3,将3写到[8:5]这里??,视频里面使用的域0,将0左移5位保存在[8:5]这里。那么下面的3-11表是什么意思??
ARM系统把整个的存储空间分为了16个域,每一个域可以有一个权限,你可以选择你访问的区域放到哪一个域里面去,假如我们放到我们的域0里面,放到哪个域都没有关系,那么放到域0之后,那么这个区域的访问权限怎么来决定呢,

可以将其设置为11对应table3-11
'mvn r0,#0n'
'mcr p15,0,r0,c3,c0,0n'把全部域设置为11,


由三个因素AP、S、R来决定的;S、R由域里面的S、R来决定的,在cp15里面每一个域都有一个S和R设置,当把AP设置为11的时候,就不管S和R了,都可以进行读写操作。
1、建立一级页表

建立好了页表项之后,要写入TTB。
2、写入TTB
TTB是保存在CP15的c2寄存器,
3、打开MMU

别忘了当我们打开了MMU之后,所有的地址都要经过一个转换的过程,不管是访问内存还是外设,故

代码如下:



关键字:MMU 配置 物理地址
引用地址:
专题1-MMU-lesson3-MMU配置与使用
推荐阅读最新更新时间:2026-03-20 11:13
通过mmap方式应用程序在Linux下访问物理地址提高实时性
前言 按照Linux分层驱动思想,外设驱动与主机控制器的驱动不相关,主机控制器的驱动不关心外设,而外设驱动也不关心主机,外设访问核心层的通用应用程序接口进行数据传输,主机和外设之间可以进行任意的组合。这样思想要求应用程序不应当直接访问物理地址,而是应当通过驱动程序的调用来实现,以便保持应用程序的可移植性,操作访问的统一性,应用程序利用系统的统一调用接口访问外设,如使用write(),read()等函数进行实际的外设读写控制。应用程序通过调用接口进入内核函数后,内核利用copy_from_user()获得应用层数据,内核驱动程序也通过分层最终执行物理访问,之后把获得的数据用copy_to_user()回传给应用程序的调用者。由于驱动
[单片机]
4412 物理地址
单片机MCU 现代中央处理器CPU 4412 的物理地址包括 CPU内部寄存器registere MMC TF卡 现代CPU和单片机相比就多了缓存和内存管理单元 缓存比内存贵,速度快,所有它在挨着CPU的第一级 内存比存储介质贵,速度快,所以它在缓存和内存之间 4412访问物理地址的过程是:从cache缓存到内存到物理地址。哪怕CPU访问内部寄存器也是要过cache和内存的。 产生的历史背景 • MMU是中央处理器中用来管理虚拟存储器、物理存储器的控制线路,同时负责虚拟地址映射为物理地址 • 在原始的PC上,程序员编程的时候遇到一个问题 – 程序大于内存 – 当时的解决办法是程序员将程序“分割”
[单片机]
MMU工作原理以及S3C2440的MMU
MMU,全称Memory Manage Unit, 中文名——存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以 内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面 前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将 调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯
[单片机]
【mini2440】S3C2440的MMU
1. 什么是MMU? 参考:https://blog.csdn.net/p1279030826/article/details/105827355 1.1 背景与发展 随着计算机科学技术的发展,所需解决的问题越来越复杂,单任务批处理已不能满足需求了。 应用程序需要的内存量越来越大。 虚拟内存的思想。 程序所需的内存可以远超物理内存的大小,将当前需要执行的留在内存中,而不需要执行的部分留在磁盘中。 可以满足多应用程序同时驻留内存能并发执行。 1.2 MMU 内存管理单元(Memory Management Unit)。 为编程提供方便统一的内存空间抽象。 以最小的开销换取性能最大化。(利用 MMU 管理内存肯定不如直接对内存进行
[单片机]
嵌入式Linux之我行——ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一
[单片机]
阅读ARM Memory(L1/L2/MMU)笔记
《ARM Architecture Reference Manual ARMv8-A》里面有Memory层级框架图,从中可以看出L1、L2、DRAM、Disk、MMU之间的关系,以及他们在整个存储系统中扮演的角色。 涉及到的相关文档有: 《ARM Architecture Reference Manual ARMv8-A》:E2 The AArch32 Application Level Memory Model和G3 The AArch32 System Level Memory Model两个章节,从总体架构上介绍了ARMv8-A Memory系统。 《Cortex-A53 TRM》:6 Level 1 Memory Sy
[单片机]
arm的MMU详解(虚拟地址)
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办
[单片机]
S3C2440之MMU驱动代码模板(RealView MDK)
好记心不如烂笔头,为方便以后查看代码及代码重复利用,这里贴出自己写的S3C2440 MMU代码库。使用友善MINI2440开发板,开发环境为RealView MDK 4.22。 该源码结构简单明了,原始工程下载地址: 点击打开链接 Register 0, ID code register: unsigned int MMU_ReadID(void) { unsigned int id; __asm( mrc p15, 0, id, c0, c0, 0 ); return id; } Register 0, cache type register: unsigned int
[单片机]