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

邮箱:tangzhongp@163.com

博客园地址: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内存管理的更多相关文章

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

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

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

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

  3. Linux内核之内存管理

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

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

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

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

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

  6. Linux kernel学习-内存管理

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

  7. Linux内核之 内存管理

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

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

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

  9. linux内核--内核内存管理

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

随机推荐

  1. Laravel 简单使用七牛云服务

    前言 路漫漫其修远兮,吾将上下而求索.学习 Laravel 之初觉得所有东西都很厉害的样子,现在看来就是很厉害啊!最近在写一个项目上传的模块,要上传图片到七牛云,昨天看了一下午七牛云官方的文档感觉还是 ...

  2. ASP.NET JQuery 随笔-搜索框默认提示

    一.文本框中创建默认文本提示 通常用户在搜索内容时,在文本框输入内容前,文本框都会给出默认提示,提示用户输入正确的内容进行搜索. 当文本框获得焦点,如果文本框内容跟提示内容一样,提示内容会自然消失. ...

  3. H面试程序(15): 冒泡排序法

    #include<stdio.h> #include<assert.h> void display(int * a, int n) { for(int i = 0; i < ...

  4. asp.net利用剪切板导出excel

    public enum ClipboardFormats : uint { CF_TEXT = 1, CF_BITMAP = 2, CF_METAFILEPICT = 3, CF_SYLK = 4, ...

  5. G - I Think I Need a Houseboat(简单题,粘贴下来是因为数据精度需要注意)

    These will be floating point numbers:看这句话,就是说数据会是浮点型的, 问题(一)数据定义成double类型就过了 我当时以为定义成float类型就可以了, 因为 ...

  6. 那些年搞不懂的"协变"和"逆变"

    博主之前也不是很清楚协变与逆变,今天在书上看到了有关于协变还是逆变的介绍感觉还是不太懂,后来看了一篇园子里面一位朋友的文章,顿时茅塞顿开.本文里面会有自己的一些见解也会引用博友的一些正文,希望通过本篇 ...

  7. (step8.2.2)hdu 2509(Be the Winner——简单博弈)

    题目大意:输入一个整数n,表示火柴堆数(原题其实指的是苹果堆数,但是为了尽量与模板保持一致,所以在这里理解为火柴堆数....其实理解为什么都没关系, 重要的是,理解就行....).在接下来的一行中,有 ...

  8. asp.net jquery+ajax异步刷新1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 基于visual Studio2013解决算法导论之015第二小元素

     题目 查找第二小元素 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  10. hdu 1395 2^x mod n = 1 (简单数论)

    题目大意: 求出一个最小的x 使得 2的x次方对n取模为1 思路分析: 若要 a*b%p=1  要使得b存在 则 gcd (a,p)=1. 那么我们应用到这个题目上来. 当n为偶数 2^x 也是偶数, ...