【linux】arm mm内存管理
欢迎转载,转载时请保留作者信息,谢谢。
博客园地址:http://www.cnblogs.com/embedded-tzp
Csdn博客地址:http://blog.csdn.net/xiayulewa
这篇文章写的很好:Linux中的内存管理 http://blog.chinaunix.net/uid-26611383-id-3761754.html
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)
【linux】arm mm内存管理的更多相关文章
- 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内核--内核内存管理
如题目所示,为什么要称作“内核内存管理”,因为内核所需要的内存和用户态所需要的内存,这两者在管理上是不一样的. 这篇文章描述内核的内存管理,用户态的内存管理在以后的文章中讲述. 首先简单的说明一下下面 ...
随机推荐
- java学习之IO文件分割
package om.gh.homework; import java.io.*; /** * 实现分割文件; * @param file */ public class HomeWork { /** ...
- BZOJ 1087
var f:..,..,..] of int64; a:Array[..] of longint; count:..] of longint; ans:int64; n,m:longint; proc ...
- Windows failed to start.界面下修复win8引导
首先要保证 系统本身是没有问题的 不是在装机的时候出现这种情况 那么可以按照以下方法来进行 首先要在另外一台电脑上将win8刻进u盘 启动时以u盘为第一启动项启动 进入win8装机界面 点击左下角的修 ...
- 邀请朋友富途开户赢iPhone6的史上最强攻略
最近有关沪港通的消息很多,加上阿里巴巴马上IPO,所以上个月我在朋友推荐下,来富途开了个户.本来对邀请不太感兴趣,但这次的奖品实在诱人,因为超级想要iPhone6,所以也加入了邀请大队.到发贴的时候, ...
- c.Tom and paper
Tom and paper Description There is a piece of paper in front of Tom, its length and width are intege ...
- jz2440开发板设置备份
___________________uboot______________________________________ OpenJTAG> pribootdelay=2baudrate=1 ...
- Huffman树编码-优先队列实现
Huffman编码是之前一道算法作业题,最近又要复习考试了,先把这个的代码再看一下吧. 算法原理很简单,使用优先队列将两个节点弹出,然后合并节点之后再入队列如此循环做下去即可. 主要问题在于树的修改问 ...
- ASP.net 学习路线(详细)
.net学习路线 入门篇1. 学习面向对象(OOP)的编程思想 许多高级语言都是面向对象的编程,.NET也不例外.如果您第一次接触面向对象的编程,就必须理解类.对象.字段.属性.方法和 ...
- POJ 1830 【高斯消元第一题】
首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>. 概念: [矩阵的秩] 在线性代数中,一个矩阵A的列 ...
- 关于PsCreateSystemThread函数
研究了1天这个...MSDN说的不是很清楚NTSTATUS PsCreateSystemThread( _Out_ PHANDLE ThreadHandle, _In_ UL ...