欢迎转载,转载时请保留作者信息,谢谢。

arm mmu硬件原理

由上图,arm分四种模式,section,大小页+ 极小页,  section模式简单,也能说明mmu本质,其它模式只是用了多级数组索引而已,本质是一样的,详细可以阅读arm920t的技术文档,此处仅说section模式。

虚拟地址到物理地址转换是由arm硬件自动管理的,上面这图的Translation table是存在内存中的,是一个数组,数组的首地址即TTB(Translation table base), 其值被赋值给协处理器CP15的Register 2, translation table base (TTB) register, 该数组是被Indexed by modified virtual address bits [31:20],共12位索引,数组元素个数有2 ^ 12 = 4096个,每个MVA高12位可以索引1M的section。

该数组元素的内容是:

因此程序要做的工作主要为在内存中申请该数组(全局,栈,堆都行),然后将该数组赋值,再将该数组首地址给CP15的TTB寄存器,内存管理从宏观来说就是这么简单。

转换成程序语言就是:

static __global unsigned long  mmu_translation_table[4096] = {}; // 2^12

CP15.R2 = &mmu_translation_table[0]; //TTB

由此可见,mmu_translation_table会额外占用4096 * 4(sizeof(unsigned long)) = 16KB的空间。

那mmu_translation_table[0],mmu_translation_table[1]...等又该如何初始化和赋值呢?

上图的Section base本质上是物理地址,占31:20位。

可以定义成一个结构体, 假设为小端:

typedef  struct {

u32  pfn : 12; // Section base address, page frame number

u32  reserve0: 8;

u32  AP: 2; // access permissions

u32  reserve1: 1;

u32  domain: 4; // Specify one of the 16 possible domains (held in the domain accesscontrol register) that contain the primary access controls

u32  reserve2: 1;

u32  C: 1;

u32  B: 1; // These bits (C and B) indicatewhether the area of memory mapped by this section is treated as write-back cachable, write-through cachable, noncached buffered, or noncached nonbuffered

u32  des_type: 2; //section,大小页+ 极小页

} mmu_translation_table_element_t;

根据上述定义,可以重新定义mmu table。

static __global mmu_translation_table_element_t  mmu_translation_table[4096] = {0}; // 2^12

CP15.R2TTB = &mmu_translation_table[0]; (自然语言)

公式

综上所述,物理地址与虚拟地址的关系明确为:

mmu_translation_table[VA >> 20] = PA & ((~0) << 20) + 权限控制位(共20位)

可见,mmu_translation_table高12位由物理地址的高12位组成,低20位为该物理段的权限控制。

PA =  mmu_translation_table[VA >> 20] & ((~0) << 20) + VA & (1 << 20 - 1);

上述公式的解释为:虚拟地址的高12位作为下标去索引mmu_translation_table,索引到的内容只取高12位,得到了物理地址的高位地址,再与虚拟地址的低20位组合,则获得了真实的物理地址。

linux mmu

内核地址空间划分:

在src\arch\arm\kernel\vmlinux.lds中,定义 . = 0xC0000000 + 0x00008000, 因此linux kernel 代码的虚拟地址从0xC0008000处开始。

而在u-boot加载内核代码时,有tftp 0x30008000 uImage,因此linux kernel的物理地址从0x30008000开始。

PA(0x30008000) ↔ VA(0xC0008000)

24小时学通Linux内核之内存管理方式

昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

Linux内核笔记--内存管理之用户态进程内存分配

内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

Linux内核之内存管理

Linux内核之内存管理 Linux利用的是分段+分页单元把逻辑地址转换为物理地址; RAM的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构; RAM的其余部分称动态内存(dyna ...

Linux内核之内存管理完全剖析

linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析   (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...

Linux kernel学习-内存管理【转】

转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://z ...

Linux kernel学习-内存管理

转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://z ...

Linux内核之 内存管理

前面几篇介绍了进程的一些知识,从这篇开始介绍内存.文件.IO等知识,发现更不好写哈哈.但还是有必要记录下自己的所学所思.供后续翻阅,同时写作也是一个巩固的过程. 这些知识以前有文档涉及过,但是角度不同 ...

Linux内核笔记——内存管理之slab分配器

内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现. 如果我们需要请求具有连续物理地址 ...

linux内核--内核内存管理

如题目所示,为什么要称作“内核内存管理”,因为内核所需要的内存和用户态所需要的内存,这两者在管理上是不一样的. 这篇文章描述内核的内存管理,用户态的内存管理在以后的文章中讲述. 首先简单的说明一下下面 ...

随机推荐

ABP中使用Redis Cache&lpar;1&rpar;

本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...

Linux下使用NMON监控、分析系统性能

一.下载nmon. 根据CPU的类型选择下载相应的版本:http://nmon.sourceforge.net/pmwiki.php?n=Site.Downloadwget http://source ...

iframe session过期跳转到登陆页面

在login.jsp中添加js: if(window !=top){ top.location.href=location.href; }

+ 转载自:Zend Framework 2参考Zend\Authentication(数据库表认证) 介绍 Zend\Authentication\Adapter\DbTable提供对存储在数据库表 ...

Eclipse的设置小细节提高开发效率

1. 自动联想功能增强 preference->java->Editor->Content Assist中, Auto activation triggers for java中默认 ...

HTML高级选项卡(1)————表标签

利用上述表格属性,能够简单的创建一个表格.并随意的分割行和列.

表格的应用...

《深入理解java虚拟机-高效并发》读书笔记

Java内存模型与线程 概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能,多任务运行是压榨手段,就如windows一样,我们使劲的压榨它运行多个任务,俱要high又要耍.并发则是另外一种更 ...

char 类型的操作函数

1.内存充填 void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的 ...

arm的linux怎么管理任务,【linux】arm mm内存管理相关推荐

  1. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  2. C语言内存管理内幕(二)----半自动内存管理策略

    2019独角兽企业重金招聘Python工程师标准>>> C语言内存管理内幕(二)----半自动内存管理策略 转载于:https://my.oschina.net/hengcai001 ...

  3. Spark内存管理(3)—— 统一内存管理设计理念

    Spark内存管理系列文章:  Spark内存管理(1)-- 静态内存管理  Spark内存管理(2)-- 统一内存管理 在本文中,将会对各个内存的分布以及设计原理进行详细的阐述  相对于静态内存模型 ...

  4. Spark内存管理(2)—— 统一内存管理

    Spark内存管理系列文章:  Spark内存管理(1)-- 静态内存管理 堆内内存 Spark 1.6之后引入的统一内存管理机制,与静态内存管理的区别在于Storage和Execution共享同一块 ...

  5. 《Objective-c》-(内存管理之三:@property的内存管理)

    内存管理之三--<@property的内存管理> 1.@property中与setter内存管理相关的参数 retain : release旧值,retain新值(适用于OC对象类型): ...

  6. C++内存管理变革(3):另类内存管理

    本文已经迁移到: http://cpp.winxgui.com/cn:peculiar-ideas-of-memory-management-autofreealloc-s-typical-appli ...

  7. linux 内核空间 缺页,Linux-3.14.12内存管理笔记【缺页异常处理(1)】

    发布时间:2017-06-18 15:57:06 缺页异常是很常见的现象,但是其来源有两种,一种是真实的异常,这是由于内存访问的地址未分配并未映射而产生的访问了非法地址的情况:另外一种是虚拟内存已经分 ...

  8. Linux操作系统原理与应用04:内存管理

    目录 1. Linux内存管理概述 1.1 内存的层次结构 1.2 虚拟内存概述 1.2.1 虚拟内存基本思想 1.2.2 进程虚拟地址空间 1.3 内核空间到物理空间的映射 1.3.1 内核空间的线 ...

  9. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

最新文章

  1. 1. spring boot起步之Hello World【从零开始学Spring Boot】
  2. python自学流程-Python系统学习流程图,教你一步步学习python
  3. Liferay研究-smilingleo
  4. Linux维护笔记四
  5. java ee 上传文件_17.《JavaEE 学习笔记》Servlet 上传文件
  6. GARFIELD@01-19-2005
  7. 国科大高级人工智能12-博弈
  8. MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移
  9. Open3d之颜色映射优化
  10. Spring Cloud 微服务架构图
  11. javascript 中时区知识的整理 UTC GMT
  12. DNS - 什么是云解析DNS?
  13. 怎么在计算机中添加电脑桌面,如何在电脑正在使用的主题中添加桌面背景图片...
  14. 给上层添加SuperSu来获取root权限
  15. Ensemble Learning(集成学习--AdaBoost,GBDT,Xgboost等)
  16. Vscode好用的快捷键:批量文字修改快捷键选中相同内容快捷键
  17. Spring websocket+Stomp+SockJS 实现实时通信 详解
  18. 《金匮要略》试题及答案
  19. 二分查找详解(Java)
  20. blinker控制步进电机起保停,正反转,加减速(Arduino uno+esp8266+TB6600驱动器)

热门文章

  1. 叫春、主旋律、本山大叔的硬伤和春晚苍蝇
  2. Unity脚本子线程修改UI的一种方式
  3. Linux:限制网络带宽
  4. 怎么查百度竞价外地排名情况
  5. 英语老师教计算机,英语教案-小学计算机老师教案?
  6. 最新最全的中国手机号码正则表达式
  7. sin和soi区别_FinFET和FD SOI的比较?
  8. 计算机一级基本操作题创建快捷方式,2018年3月计算机一级考试MSOffice模拟试题(4)...
  9. 15.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
  10. scala 判断手机号码_手机上的Scala