首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文搞懂 | ARM MMU

IO地址(设备device地址),在开启了MMU的系统中,CPU发起的指令读取、数据读写都是虚拟地址,在ARM Core内部,会先经过MMU将该虚拟地址自动转换成物理地址,然后在将物理地址发送到AXI总线上...下图是一个linux kernel系统中宏观的虚拟地址到物理地址转换的视图,可以看出在MMU进行地址转换时,会依赖TTBRx_EL1寄存器指向的一个页表基地址。...我们软件需要做的其实就是管理这个页表,按照ARM的技术要求去创建一个这样的页表,然后再将其基地址写入到TTBR1_EL1或TTBR0_EL1。...: 在secure和non-secure中使用MMU TTBRx_EL1是banked的,在linux和optee双系统的环境下,可同时开启两个系统的MMU。...包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。在上面的【人人都是极客】公众号内回复「peter」,即可免费获取!!

2.4K30

ARM MMU的存在必要及作用

ARM中的MMU就是内存管理单元,是Memory Management Unit的缩写,那这个东西主要是解决什么问题呢,MMU诞生的主要原因就是解决程序,数据、堆栈的总的大小大于实际的物理存储器介质的大小这个问题...而将虚拟地址映射成实际地址就是MMU的作用。 举个例子,现在有个应用程序需要16KB的内存,一共有8KB的实际物理内存(物理内存地址假设为0x00000000 ~ 0x00001FFF)。...应用程序共访问16KB内存,虚拟地址为0x10000000~0x10003FFF,应用程序访问MMU虚拟地址0x10000000~0x10001FFF,则相当于访问实际物理地址0x00000000 ~...0x00001FFF,再将应用程序的剩余8KB搬入物理内存中,应用程序访问MMU虚拟地址0x10002000~0x10003FFF的时候,相当于访问实际物理地址0x00000000 ~ 0x00001FFF...当然现在一般内存够用,那MMU的地址映射的作用主要就是进行内存访问的保护。比如像Linux这样的系统的多进程,通过MMU进行内存访问,一个进程出了问题不会影响到其他进程。

42840
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核 MMU的工作原理

我们还是以刚才那个16位机器结合下图进行一个实例说明,该实例中,虚拟地址8196被送进MMU,MMU把它映射成物理地址。...以上就是MMU的工作过程。...如果处理器启用了MMU,CPU执行单元发出的内存地址将被 MMU 截获,从CPU到MMU 的地址称为虚拟地址,而MMU 将这个地址翻译成另一个地址,发到CPU芯片的外部地址引脚上,也就是将VA映射成了PA...操作系统和 MMU 是这样配合的:操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,然后用指令设置MMU,告诉MMU 页表在物理内存中的什么位置。...用户空间和内核空间 通常操作系统把虚拟地址划分为用户空间和内核空间,例如 X86平台的Linux 系统虚拟地址空间是0x00000000 - 0xFFFFFFFF,前3GB(0x00000000 - 0xBFFFFFFF

1.9K20

Linux内存管理之MMU的过程

有了之前的感性认识,这篇站在arm的角度再深度讲解一下,看完你会发现不理解arm原理就直接撸内核代码简直是耍流氓。 ARMv8中的访问内存流程 我喜欢用图的方式来说明问题,简单直接: ?...「那么CPU是如何通过MMU和Cache来访问内存的呢?」 ? 可以看出虚拟地址和物理地址的转换关键是过程Table Walk Unit。...虚拟地址转换为物理地址的本质 我们知道内核中的寻址空间大小是由CONFIG_ARM64_VA_BITS控制的,这里以48位为例,ARMv8中,Kernel Space的页表基地址存放在TTBR1_EL1...#include #include #include #include ...这个过程也是mmu的过程。 小结 我相信你已经对cpu通过MMU访问内存的本质有所掌握(还是不理解的话不要说认识我),而且通过linux的一个实验,对其软件模拟流程也有所感性的认识。

2.2K42

图解MMU

这是图解系列之MMU MMU叫内存管理单元,现在是处理器/核中的一个硬件单元,通常每个核有一个MMU。 下面cloud3图解一下MMU的工作原理。 ?...CPU发出的地址是虚拟地址,MMU通过页表技术,把虚拟地址转换为物理地址,再去访问物理内存条。 ?...以这张页表为例, 当CPU发出的虚拟地址中页表Index是3时,MMU会去查页表的第3行,发现第3行没有命中,MMU会给CPU发出page fault,CPU自动跳到fault的代码去处理fault。...当CPU发出的虚拟地址中页表Index是2时,MMU会去查页表的第2行,发现第2行命中了物理地址112*4KB,MMU会访问内存条112*4KB这个物理地址。...以上以32位系统中一级和二级页表来描述了MMU的最简单原理,多级页表的实现方式在理论上也是相同的,包括在64位系统中MMU工作原理也是如此。 这是图解系列之MMU

1.4K31

MMU那些事儿

MMU存在的意义 [导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍。...总之,在这样的背景下,MMU应运而生,也由此可见,任何一项技术的发展壮大,都必然是需求驱动的。这是技术本身发展的客观规律。...MMU 以及TLB MMU(Memory Management Unit)内存管理单元: 一种硬件电路单元负责将虚拟内存地址转换为物理内存地址 所有的内存访问都将通过MMU进行转换,除非没有使能MMU。...MMU硬件负责,由操作系统维护页表,MMU直接访问页表,页表格式严格依赖硬件设计格式。...从概念上相对比较易懂的角度描述了MMU的诞生、机制,而忽略了处理器的具体实现细节。作为从概念上更深入的理解MMU的工作机理的角度,还是不失为一篇浅显易懂的文章。

1.1K20

【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | ID-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU )

MMU 概念 1. ARM 存储 (1) ARM 的存储体系 (2) Cache 由来 (3) Cache 定义 2....与 Cache 的 位置 : 在 ① ARM 11 之前, 处理器 -> Cache -> MMU -> 存储器, ② ARM 11 及 ARM 11 之后, 处理器 -> MMU -> Cache...-Tgboot.lds -o gboot.elf ^, 需要使用链接器脚本进行连接, ①链接工具是 arm-linux-ld 工具, ②使用 -Tgboot.lds 设置链接器脚本 是刚写的 gboot.lds...链接器脚本, ③输出文件是 gboot.elf 这是个中间文件, ④ 依赖文件是 ^ 代表所有的依赖; ( 3 ) 转换成可执行二进制文件 : arm-linux-objcopy -O binary...-g -c $^ %.o : %.c #通用规则, 如 start.o 是由 start.c 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^

2.3K10

liteos MMU(十八)

概述 1.1 基本概念 MMU全称“Memory Management Unit”,顾名思义就是“内存管理单元”。...综合来说,对MMU操作就是通过修改页表描述符和控制CP15协处理器来实现的,具体运作流程如下图1所示。 ?...Huawei LiteOS的MMU有两个方面的作用: 提供硬件机制的内存cache/nocache属性的控制接口。 提供硬件机制的内存访问权限控制接口。 2....开发指导 2.1 使用场景 系统内部有些内存不希望被修改,否则会造成不可预测的后果,此时可以用MMU修改该段内存的访问权限。...3 注意事项 目前MMU二级页表可操作最小内存单位是4KB,所以要设置访问权限的内存区域的起始地址和结束地址都要4KB对齐。一级页表修改未做对外接口,无需关注。

87830

深入理解Linux内核之mmu-gather操作

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 本文讲解Linux内核虚拟内存管理中的mmu_gather...相关的主要数据结构有三个: struct mmu_gather struct mmu_table_batch struct mmu_gather_batch 1)mmu_gather 来表示一次mmu...address); \ //存放页表的物理页放入页表的积聚结构中 } while (0) #endif 再看看__pte_free_tlb: // arch/arm64...tlb_reset_range(tlb); //将tlb->start 和tlb->end以及tlb->freed_tables,tlb->cleared_xxx复位 } 我们来看下tlb_flush: arch/arm64..., end); //刷mm的tlb,释放所有积聚物理页,释放所有积聚结构相关物理页 4.总结 Linux内核mmu-gather用于积聚解除映射的相关物理页面,并保证了刷tlb和释放物理页面的顺序。

2.1K52

Cortex-M可以跑Linux操作系统吗?

单片机、Cortex-M、Linux它们和嵌入式有什么区别? 2. 跑 Linux 操作系统需要什么处理器?ARM9、ARM11? 3. Cortex-M比ARM9更新,为什么不能跑Linux?...相信很多小伙伴都有类似这样的疑问,下面围绕Cortex-M、 ARMLinux来讲讲相关内容。...在Linux等多用户、多进程的操作系统中,MMU使得各个用户进程都有独立的地址空间,以防止内存越界。 ? ▲图2 MMU的地位 MCU都有一个地址集和,被称为虚拟地址范围。...▲ 图6 进程树 总结 通过上述描述我们可以知道,Linux操作系统对MMU(内存管理单元)有极强的依赖,若在没有内存管理单元的CPU中运行Linux,恐怕整个系统只能停留在Uboot阶段了。...由于ARM的Cortex-M处理器没有内存管理单元,,一般来说不建议跑Linux操作系统。

3.6K30

arm-linux 开发步骤

ARM-Linux开发步骤 拿到一块YC2440(s3c2440)的开发板,经过几天的学习,我对arm-linux系统开发步骤有了一些认识。...就以开发这个开发板为例,arm-linux开发工作大概分4个部分 1. 硬件(hardware) 2. 引导加载器(bootloader) 3. 内核(kernel) 4....拷贝代码到RAM并不需要很多指令,因为ARM对RAM的管理需要一个MMU控制器(可以让CPU访问更多的RAM或许)而这个控制器需要配置相关寄存器,所以代码可能要多一点,另外可能还有许多别的功能,所以代码可能会更多...以ubuntu 8.10说明一下: a) 下载编译器,比如arm-linux-gcc 3.4.1 b) sudo tar vxjf arm-linux-gcc 3.4.1.bz2 –C / c) 命令行编译需要设置环境变量...sudo gedit /etc/bash.bashrc 在文件最后添加 export PATH=$PATH:/usr/local/arm/3.4.1/bin 重新登录 d) arm-linux-gcc

3.9K30

stm32可以跑Linux操作系统吗?

ST是意法半导体的简称,M是指微控制器(也就是单片机的)MCU的第一个英文字母,32是指32位的CPU,它的CPU是采用的ARM公司的Cortex-M系列的内核设计。 1....Cortex-M 的定位 ARM处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的模型。ARM的指令集从ARMv1发展到今天的ARMv9,每一次体系结构的修改都会添加实用技术。...Linux系统 一般将操作系统分为实时操作系统和非实时操作系统。实时操作系统大多为单进程、多线程(多任务),因此不涉及到线程间的地址空间分配,不需要使用MMU,例如VxWorks。...总结 综合以上内容,linux系统对内存管理单元有极强的依赖,若在没有MMU的处理器中运行linux,恐怕整个系统只能停留在Uboot阶段了。...由于Cortex®-m处理器没有内存管理单元,因此跑不了linux系统。任何事情都不是绝对的,如果你重写了linux内核且搭配足够大的内存芯片,从理论上来说是可以省掉MMU的。

4.4K30

arm的一些概念(ARM9、Cortex的区别)

arm的一些概念(ARM7、Cortex-M的区别) ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构。...ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统,因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间...ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。...ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。...所以看上去ARM7跟Cortex-M很像,因为他们都是MCU,但确是不同代不同架构的MCU(Cortex-M比ARM7高了三代!),所以性能也有很大的差距。

1.5K10

ARM64中的ASID地址空间标识符

为每一个进程分配一个ASID的话,256个就溢出了,所以在Linux中ASID溢出后就要重新洗牌了。...说到ASID,还要从ARM的TTBR寄存器开始说起,前面文章我们讲过了MMU的TTBR寄存器,但是并没有给出TTBR寄存器的bit描述,这里列出ARM32和ARM64的TTBR寄存器格式描述 1.2.1...TTBR寄存器的值,那么很容易知道Linux会为每一个进程分配一个独用的ASID码,Linux为每个为进程分配的ASID值都不相同。...这么一来,MMU再做页表转换时也会把当前的ASID值缓存到TLB快表里, ARM64的TLB机制 有了ASID后,TLB跟以前也不一样了,在进程切换的时候,操作系统也不需要去刷TLB了,因为MMU在做地址转换时会将...TLB表项里的ASID和当前进程的ASID值做比较,只有ASID值相等,MMU才认为这条表项是我需要的。

10610

Linux 内核入口分析

跳转过去初始化肯定是在汇编文件中,根据架构可以选择不同的平台,这里看一下链接汇编文件: linux4.14/arch/arm/kernel/vmlinux.lds.S 这里可以看到链接时候 Linux...)) ARM_EXIT_DISCARD(EXIT_TEXT) ARM_EXIT_DISCARD(EXIT_DATA) EXIT_CALL #ifndef CONFIG_MMU *(.text.fixup...PAGE_OFFSET 是 Linux 内核空间的虚拟起始地址,定义在: linux4.14/arch/arm64/include/asm/memory.h 注意,这里的地址都很重要,很多地方会用到。...TEXT_OFFSET 定义在: linux4.14/arch/arm/Makefile 中: 这个值一般是 0x00008000 ,算出 PAGE_OFFSET 后加上这个值就是 Linux 内核的起始地址...__cpu_setup 初始化CPU,这里主要是初始化和 MMU 内存相关的 CPU 部分。 __primary_switch 这里会进行跳转。 在同一个文件中,会跳转到这里,739 行开启了MMU

1.9K10
领券