没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
73页
本文从几个角度来介绍一下linux 内存管理;分析的代码是TI linux-davinci-staging;内核版本为2.6.32。 1. Linux 内核管理哪些物理空间;arm 版本的4G虚拟地址是如何组织的; 2. 内核空间如何获得虚拟/物理空间,并使用它们; 3. 用户空间如何获得虚拟/物理空间,并使用它们; 4. 内核空间和用户空间如何交互; 5. 整体的介绍一些Linux的缺页处理主流程; 6. 按照时间轴,从汇编代码开始,整个内存管理体系如何建立并运作起来的;
资源推荐
资源详情
资源评论
Linux 学习心得——内存管理方法
目录
1. 概述............................................................................................................................................ 3
2. 物理空间/虚拟空间................................................................................................................... 3
2.1 物理空间 .......................................................................................................................... 3
2.1.1 物理空间概述 ....................................................................................................... 3
2.1.2 Linux 内核分配的物理内存 ................................................................................ 6
2.2 虚拟空间 .......................................................................................................................... 8
2.2.1 内核虚拟空间 ....................................................................................................... 9
2.2.2 进程虚拟空间 ..................................................................................................... 11
2.3 物理空间和虚拟空间的转换 ........................................................................................ 14
3. 内核使用内存 .......................................................................................................................... 15
3.1 内核负责分配 ................................................................................................................ 15
3.1.1 物理内存管理 ..................................................................................................... 15
3.1.2 bootmem 系统 ..................................................................................................... 16
3.1.3 buddy 系统 ......................................................................................................... 18
3.1.4 CPU 页框高速缓存 ........................................................................................... 18
3.1.5 管理区分配器 ..................................................................................................... 19
3.1.6 分区页框分配器/__get_free_pages .................................................................... 19
3.1.7 Vmalloc/vfree ...................................................................................................... 23
3.1.8 module_alloc/vfree .............................................................................................. 26
3.1.9 dma_alloc_coherent/ dma_alloc_coherent .......................................................... 28
3.1.10 slab(cache)系统................................................................................................. 30
3.1.11 kmem_cache_alloc/ kmem_cache_free ............................................................. 32
3.1.12 kmalloc/kfree..................................................................................................... 32
3.1.13 low mem 小结 ................................................................................................... 34
3.1.14 high mem 的使用 .............................................................................................. 34
3.1.15 kmap/ kunmap + alloc_pages( )/free_ pages( ) ................................................. 35
3.1.16 kmap_atomic/ kunmap_atomic + alloc_pages( )/free_ pages( ) ........................ 37
3.2 内核不负责分配 ............................................................................................................ 39
3.2.1 静态 IO 映射/create_mapping ............................................................................ 39
3.2.2 动态 IO 映射/ ioremap/__iounmap .................................................................... 41
4. 进程使用内存 .......................................................................................................................... 43
4.1 基础知识 ........................................................................................................................ 43
4.1.1 内存描述符 ......................................................................................................... 45
4.1.2 线性区描述符 ..................................................................................................... 45
4.1.3 分配线性地址区间 ............................................................................................. 47
4.1.4 释放线性地址区间 ............................................................................................. 48
4.2 获取物理内存和建立物理内存到进程虚拟地址的映射 ............................................ 48
4.2.1 非匿名映射;从 buddy 系统获取物理内存;一次性映射完毕 ..................... 49
4.2.2 非匿名映射;从 buddy 系统获取物理内存;缺页机制一页一页的映射 ..... 52
4.2.3 非匿名映射;使用 reserve 的物理内存;一次性映射完毕; ........................ 53
4.2.4 非匿名映射;使用 reserve 的物理内存;缺页机制一页一页的映射不可能 54
4.2.5 匿名映射;从 buddy 系统获取物理内存;一次性映射完毕 不可能 ........... 54
4.2.6 匿名映射;使用 reserve 的物理内存;一次性映射完毕 不可能 .................. 55
4.2.7 匿名映射;使用 reserve 的物理内存;缺页机制一页一页的映射不可能 .... 55
4.2.8 匿名映射;从 buddy 系统获取物理内存;缺页机制一页一页的映射; ..... 55
4.3 释放物理内存和摧毁物理内存到进程虚拟地址的映射 ............................................ 56
4.4 进程虚拟空间的创建过程 ............................................................................................ 57
5. 内核空间和进程空间的交互 .................................................................................................. 65
5.1 内核 mmu 页表和用户 mmu 页表 ............................................................................... 65
5.2 内核空间和用户空间交互函数 .................................................................................... 67
6. Linux 缺页处理 ....................................................................................................................... 69
7. 内存管理体系建立流程 .......................................................................................................... 70
7.1 内核自解压缩代码: .................................................................................................... 71
7.2 内核汇编代码: ............................................................................................................ 71
7.3 内核启动流程 C 代码阶段(start_kernel) ................................................................ 71
1. 概述
本文从几个角度来介绍一下 linux 内存管理;分析的代码是 TI linux-davinci-staging;内
核版本为 2.6.32。没有分析 SMP(多处理器);复杂的内存组织方式(多个 node): 比较难
懂,功力不够,只是大致了解,没有深入。
1. Linux 内核管理哪些物理空间;arm 版本的 4G 虚拟地址是如何组织的;
2. 内核空间如何获得虚拟/物理空间,并使用它们;
3. 用户空间如何获得虚拟/物理空间,并使用它们;
4. 内核空间和用户空间如何交互;
5. 整体的介绍一些 Linux 的缺页处理主流程;
6. 按照时间轴,从汇编代码开始,整个内存管理体系如何建立并运作起来的;
2. 物理空间/虚拟空间
2.1 物理空间
2.1.1 物理空间概述
物理空间指 SOC 系统的线性地址空间(非线性的 nandflash, sd 等都不算),对于 ARM
SOC 来说就是 4G 的地址空间。包括 sdram/ddr 区间;寄存器空间等等。
SOC 系统的硬件模块(除了 CPU 以外的模块)都只能访问物理空间。
模
块
寄
存
器
空
间
Norflash/ROM
Sdram/ddr
0x0000 0000
0x0020 0000
0x6000 0000
SDIO
CLKRST
0x6000 2000
0x6000 4000
0x6000 5000
0x6000 0000
0x7000 0000
0x8000 0000
0xc000 0000
Sram
0x2000 0000
0x2010 0000
典型的物理内存组织
一个典型的物理内存如上组织,最少只需要 3 大块空间(sram 不一定要有)就行(像
我们公司的芯片的硬件 remap功能,很多 SOC系统没有,因此也就不作为典型的来描述了):
1. 0x0000 0000 起的 Norflash 或者 ROM 空间:用来存储 bootloader;
2. 0x2000 0000起为 SOC系统的高速片内存储;假定为 1M(也可以是采用类似 s3c2410
等的,某个 bank 上的存储)
3. 各个硬件模块的寄存器空间:每个模块实际占用的空间都比较小,但一般都是 4k
对齐的;因此会有很多空洞;
4. sdram/ddr 空间:linux 程序运行的主要空间;我们设定其大小为 1G Bytes;这样
有典型意义些;好分析 high mem。
以上 4 个区域:
1. Norflash/ROM 主要是运行 bootloader;一般情况下,Linux 系统不会运行在这个空
间(特殊情况除外);因此一旦 boot 完毕,跳转到 Linux 内核代码开始执行一段代
码后(启用了 mmu,进行了一些初始化后),Linux 系统就不会再使用这些空间。
2. sram 空间比较小,可以归 Linux 系统进行分配(归为 high mem);也可以 Linux
内核不分配;但是肯定不是用来运行 Linux 的。
3. 寄存器空间由 Linux 的 IO 系统进行管理;其使用上分为静态使用和动态使用。
静态使用由系统初始化时进行地址空间的映射;由 machine 的 map_io 函数调
用函数 iotable_init 来进行;内核移植时需要提供一个 map_desc 数组,用来指
定虚拟地址,物理地址,长度,属性;映射到虚拟地址中内核空间的一个 reserve
区域;同时记录下内核虚拟地址以供后来软件使用。
动态使用需要由各个内核模块调用函数 ioremap 函数;将物理 IO 地址(寄存
器空间)映射到 VMALLOC_START 和 VMALLOC_END 之间;然后基于这段
内核虚拟地址使用。
4. sdram/ddr 空间由 Linux 的 mem 系统进行管理;分为 Linux 内核分配 和 Linux 内
核不负责分配两种。(为什么用分配, 而非管理 2 字呢??因为实际上还是都会有
一些管理的,比如我们要将一段物理内存映射到内核空间,或者用户空间,还是需
要 Linux 内核进行管理的;还有比如我们用 request_mem_region 的方式,向系统
申请一段物理空间时(严格的说,这也不叫做申请,只是 IO 管理的一部分;主要
是让 linux 内核帮忙 check 是否有冲突用;并不是 Linux 内核分配一段空间);linux
内核都要进行一些管理)。
Linux 内核分配:由 Linux 内核的 buddy 系统管理起来的区域。这部分区域的
信息在 start_kernel 时 , 统 计 在 结 构 体 : struct meminfo meminfo;
(linux\arch\arm\mm\init.c)中;具体的见文章《内存管理分析之_内核启动时
如何了解物理内存参数.pdf》;其有 2 种方法(也可以说是 3 种方法);来填充
meminfo:start_kernel-> setup_arch 里面。
i. 通过 machine 的 mdesc->fixup 函数;
ii. 通过 bootloader 传入的 cmdline,或者内核 menuconfig 里面指定的 cmdline
mem=768M(格式为 mem=size@start);
结构体如下:
struct meminfo {
int nr_banks;//记录有多少个 bank
struct membank bank[NR_BANKS];//每个 bank 的信息
};
struct membank {
unsigned long start;//bank 起始物理地址
unsigned long size;// bank 物理空间大小
unsigned short node;//属于哪个 node
unsigned short highmem;//是否是 highmem;最初不标记,由后面的程序填
写
};
最简单的情况,如果我们只在 menuconfig 里面指定的 cmdline mem=768M;
则最终整理出来如下:
struct meminfo {
int nr_banks =1 ;
struct membank bank[NR_BANKS];//每个 bank 的信息
};
struct membank {
unsigned long start = PHYS_OFFSET(我们在 machine 的 memory.h 里面指
定为 0x8000 0000);
unsigned long size=768*1024*1024; 命令行传入的 768M
unsigned short node = 0; 一般只有一个 0 号 node
unsigned short highmem=0;是否是 1 由后续程序处理
};
如果我们将 sram 区域也传递给 Linux 内核了,将变为:
struct meminfo {
int nr_banks =2 ;
剩余72页未读,继续阅读
xie_keyang
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第157题用Read4读取N个字符-题解.zip
- python-leetcode面试题解之第156题上下翻转二叉树-题解.zip
- python-leetcode面试题解之第155题最小栈-题解.zip
- python-leetcode面试题解之第153题寻找旋转排序数组中的最小值-题解.zip
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
- python-leetcode面试题解之第147题对链表进行插入排序-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页