陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009.

Slides:



Advertisements
Similar presentations
因数与倍数 2 、 5 的倍数的特征
Advertisements

2 和 5 的倍数的特征 运动热身 怎样找一个数的倍数? 从小到大写出 2 的倍数( 10 个): 写出 5 的倍数( 6 个) 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 5 , 10 , 15 , 20 , 25 , 30.
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
实用操作系统概念 张惠娟 副教授 1.
§5.3 定积分的换元法 和分部积分法 一、 定积分的换元法 二、 定积分的分部积分法 三、 小结、作业.
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Linux内存管理 内存管理概述 Linux内存管理数据结构 Linux内存分配与回收 Slab分配器 Linux进程的地址空间 页表
面向对象建模技术 软件工程系 林 琳.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
存储系统.
辅导课程六.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
网络常用常用命令 课件制作人:谢希仁.
临界区软件互斥软件实现算法.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Windows网络操作系统管理 ——Windows Server 2008 R2.
Online job scheduling in Distributed Machine Learning Clusters
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
临界区软件互斥软件实现算法 主讲教师:夏莹杰
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
《手把手教你学STM32-UCOS》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
从zval看PHP变量
第一章 函数与极限.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
Chapter 7 掌控記憶體.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
本节内容 Private Memory 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 7 掌控記憶體.
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
嵌入式操作系统 陈香兰 Fall 2009.
本节内容 线性地址的管理 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
3.1私有内存的分配.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 结构体.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十七讲 密码执行(1).
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
Presentation transcript:

陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 xlanchen@ustc.edu.cn 助教:陈博、李春华 Spring 2009

内存管理

内存管理 二级页表 动态存储器 Slab算法 非连续存储区 2019/8/30 嵌入式OS

内存管理 RAM的某些部分永久地分配给内核,用以存放内核代码以及静态数据 RAM的其余部分称为动态存储器(dynamic memory) 2019/8/30 嵌入式OS

Arm存储系统之粗粒度的2级页表 第一级页表: 第二级页表: 每一项描述1MB空间的映射关系 每个条目4B 页表大小:16KB 2019/8/30 嵌入式OS

Linux中 虚拟地址空间: swapper_pg_dir Head.S中:__create_page_tables KERNEL_RAM_VADDR: 3GB以上+TEXT_OFFSET(大多为0x8000) swapper_pg_dir KERNEL_RAM_VADDR-0x4000,大小为16KB Head.S中:__create_page_tables 0x4000=4KB×4=16KB swapper_pg_dir 2019/8/30 嵌入式OS

__create_page_tables swapper_pg_dir 虚拟 物理 第0项 第3GB对应项 3GB 2019/8/30 嵌入式OS

动态存储器 进程和内核都需要动态存储器 属于稀缺资源 整个系统的性能取决于如何有效地管理动态存储器 对于动态存储器要尽可能做到: 按需分配,不需要时释放 2019/8/30 嵌入式OS

主要内容 内核如何给自己分配动态存储器 页框管理 小内存管理 非连续存储区管理 2019/8/30 嵌入式OS

页框管理 Linux采用页作为内存管理的基本单位 Linux采用的标准的页框大小为4KB 例如:512M的物理内存对应于128K个页框 传输效率高 管理方便 例如:512M的物理内存对应于128K个页框 算法:伙伴算法 2019/8/30 嵌入式OS

请求页框 内核实现了一种底层的内存分配机制,并提供了几个接口供其他内核函数调用。 分配: 释放 alloc_pages/alloc_page __get_free_pages/__get_free_page/__get_dma_pages/get_zeroed_page 释放 free_pages/__free_pages/free_page__free_page 2019/8/30 嵌入式OS

页框数据结构 内核必须记录每个页框当前的状态 哪些属于进程,哪些存放了内核代码/数据 是否空闲,即是否可用 如果不可用,内核需要知道是谁在用这个页框 这个页框可能的使用者有用户态进程、动态分配的内核数据结构、静态的内核代码、页面cache、设备驱动程序缓冲的数据等等 2019/8/30 嵌入式OS

页描述符 页描述符:struct page 每个物理页框都用一个页描述符表示 count:页的使用引用计数器 0:空闲 >0:页已经分配给一个或多个进程或用户某些内核数据结构 flags:页框状态,最多可以有32个,每个使用一个位表示 参见枚举类型pageflags 2019/8/30 嵌入式OS

当内核调用一个页框分配函数时,必须指明请求页框所在的区。这个一般是通过一些flag标志来指定的 GFP_XXX 2019/8/30 嵌入式OS

关于NUMA 不考虑 物理内存被划分为若干个node 存取时间不等 考虑CPU局部性 Node使用数据结构pg_data_t描述 每个node被划分成若干个zone 2019/8/30 嵌入式OS

存储区(Memory Zones) 在一个理想的体系结构中,一个页框就是一个物理存储单元,可以用于任何事情,例如 存放内核数据/用户数据/缓存磁盘数据等 实际上存在硬件制约:一些页框由于自身的物理地址的原因不能被一些任务所使用,例如 ISA总线的DMA控制器只能对ram的前16M寻址 在一些具有大容量ram的32位计算机中,CPU不能直接访问所有的物理存储器,因为线性地址空间不够 2019/8/30 嵌入式OS

zone 为了应付这种限制,Linux把具有同样性质的物理内存划分成——区(zones) Linux把物理存储器划分为4个区 ZONE_DMA ZONE_DMA32 (未见用) ZONE_NORMAL ZONE_HIGHMEM 参见枚举类型zone_type 2019/8/30 嵌入式OS

ZONE_DMA 和ZONE_NORMAL区 包含存储器的“常规”页,通过把它们映射到线性地址空间的3GB以上,内核就可直接访问 而ZONE_HIGHMEN区 中包含的存储器页面不能由内核直接访问 每个zone使用struct zone表示 关键:free_area 2019/8/30 嵌入式OS

mem_map数组 所有物理页框的描述符,组织在mem_map的数组中 2019/8/30 嵌入式OS

Mem_map、node、zone之间的关系 start_kernelsetup_archpaging_initbootmem_init bootmem_init_nodefree_area_init_node alloc_node_mem_map 页描述符将会占用很大的一段空间 Mem_map、node、zone之间的关系 2019/8/30 嵌入式OS

请求页框 内核实现了一种底层的内存分配机制,并提供了几个接口供其他内核函数调用。 分配: 释放 alloc_pages/alloc_page/alloc_pages_node/alloc_pages_current/… __get_free_pages/__get_free_page/__get_dma_pages/get_zeroed_page 释放 free_pages/__free_pages/free_page__free_page 2019/8/30 嵌入式OS

关于unsigned int gfp_mask 指明可在何处并以何种方式查找空闲的页框 GFP_ATOMIC, 这种分配是高优先级的并且不能睡眠。一般在中断处理程序,下半部分和其他不能睡眠的场合下使用 GFP_KERNEL, 这是普通的分配模式,允许睡眠。一般在用户进程可能调用到的内核函数中使用,这个时候进程是可以安全的睡眠的 GFP_DMA, 设备驱动程序需要DMA内存时使用 2019/8/30 嵌入式OS

在内核中释放页框时要非常小心,必须确保只释放了所请求的页框,否则内核可能会崩溃 page = __get_free_page(GFP_KERNEL,3); If (!page){ /*如果内存不足,分配失败,必须在这里处理这个失败*/ } /*现在’page’变量指向了8个连续页框的起始线性地址*/ free_pages(page,3); /*现在页框被释放,不应该再对page中存放的线性地址进行操作*/ 2019/8/30 嵌入式OS

页框管理算法 内核要为分配一组连续的页框建立一种稳定、高效的分配策略 这种策略要解决碎片问题:即频繁的请求和释放不同大小的一组连续页框,必然导致在物理页框中分散许多小块的空闲页框 这样,即使有足够的空闲页框页框满足请求,但要分配一个大块的连续页框可能就无法满足了 2019/8/30 嵌入式OS

基于下面的原因,Linux内核首选第二种方法 有两种办法可以避免这样的碎片 利用MMU把一组非连续的物理空闲页框映射到连续的线性地址空间 使用一种适当的技术来记录现存的空闲连续页框的情况,以尽量避免为满足对小块的请求而把大块的空闲块进行分割 基于下面的原因,Linux内核首选第二种方法 在某些情况下,必须使用连续的页框,如DMA 尽量少的修改内核页表 2019/8/30 嵌入式OS

buddy算法(伙伴算法) Linux使用著名的伙伴算法来解决碎片问题。 把所有空闲页框分组为10个块链表,每个块链表分别包含大小为1,2,4,6,8,16,32,64,128,256和512个连续的页框 每个块的第一个页框的物理地址是该块大小的整数倍。 例如:大小为16个页框的块,其起址是16×4KB的倍数 2019/8/30 嵌入式OS

伙伴的定义 例如:0和1是伙伴,1和2不是伙伴 两个伙伴的大小必须相同,物理地址必须连续 事实上伙伴是通过对大块的物理内存划分获得的 假定伙伴的大小为b 那么第一个伙伴的物理地址必须是2×b×4KB对齐 事实上伙伴是通过对大块的物理内存划分获得的 假如从第0个页面开始到第3个页面结束的内存 每次都对半划分,那么第一次划分获得大小为2页的伙伴 进一步划分,可以获得大小为1页的伙伴,例如0和1,2和3 1 2 3 1 2 3 2019/8/30 嵌入式OS

数据结构 Linux为每个zone使用各自独立的伙伴系统 每个伙伴系统使用的主要数据结构为: 空闲内存管理数组free_area 2019/8/30 嵌入式OS

mem_map数组 空闲内存管理数组 前面介绍过的页描述符数组 每个页描述符描述一个物理页框 整个mem_map数组描述整个zone中的所有的物理内存 空闲内存管理数组 空闲内存按照伙伴管理的方法进行组织 使用free_area结构 2019/8/30 嵌入式OS

伙伴 当两个伙伴都为空闲的时候,就合并成一个更大的块 该过程将一直进行,直到找不到可以合并的伙伴为止 寻找伙伴 给定一个要释放的空闲块 找到其伙伴 查看其状态:合并 or 不合并 2019/8/30 嵌入式OS

举例 假设有128MB的ram。 假设要请求一个大小为128个页框的块(0.5MB)。 128MB最多可以分成215=32768个页框,214=16384个8KB(2页)的块或213=8192个16KB(4页)的块,直至64个大小为512个页的块 假设要请求一个大小为128个页框的块(0.5MB)。 算法先free_area[7]中检查是否有空闲块(块大小为128个页框) 若没有,就到free_area[8]中找一个空闲块(块大小为256个页框) 若存在这样的块,内核就把256个页框分成两等份,一半用作满足请求,另一半插入free_area[7]中 如果在free_area[8]中也没有空闲块,就继续找free_area[9]中是否有空闲块。 2019/8/30 嵌入式OS

若有,先将512分成伙伴,一个插入free_area[8]中,另一个进一步划分成伙伴,取其一插入free_area[7]中,另一个分配出去 2019/8/30 嵌入式OS

内存的分配与回收 阅读相关代码 关键:nr_free __free_one_page __rmqueue __free_pages __free_pages_ok free_one_page buffered_rmqueue get_page_from_freelist __alloc_pages_internal __alloc_pages 2019/8/30 嵌入式OS

页框管理小结 Mem_map Zone Free_area 伙伴算法 2019/8/30 嵌入式OS

内存区管理(memory area) 单单分配页面的分配器肯定是不能满足要求的 内核中大量使用各种数据结构,大小从几个字节到几十上百k不等,都取整到2的幂次个页面那是完全不现实的 早期内核的解决方法是提供大小为2,4,8,16,...,131056字节的内存区域 需要新的内存区域时,内核从伙伴系统申请页面,把它们划分成一个个区域,取一个来满足需求 如果某个页面中的内存区域都释放了,页面就交回到伙伴系统 2019/8/30 嵌入式OS

但这种分配方法有许多值得改进的地方: 不同的数据类型用不同的方法分配内存可能提高效率。比如需要初始化的数据结构,释放后可以暂存着,再分配时就不必初始化了 内核的函数常常重复地使用同一类型的内存区,缓存最近释放的对象可以加速分配和释放 对内存的请求可以按照请求频率来分类,频繁使用的类型使用专门的缓存,很少使用的可以使用通用缓存 使用2的幂次大小的内存区域时硬件高速缓存冲突的概率较大,有可能通过仔细安排内存区域的起始地址来减少硬件高速缓存冲突 缓存一定数量的对象可以减少对buddy系统的调用,从而节省时间并减少由此引起的硬件高速缓存污染 2019/8/30 嵌入式OS

SLOB Allocator: Simple List Of Blocks Slab Slub:slab的一个变种 NUMA Slab Slub:slab的一个变种 Kmalloc/kfree 本课介绍基本的slab算法 2019/8/30 嵌入式OS

slab分配器 slab分配器体现了这些改进思想 slab分配器把内存区看成对象 slab分配器把对象分组放进高速缓存。 每个高速缓存都是同种类型内存对象的一种“储备” 例如当一个文件被打开时,存放相应“打开文件”对象所需的内存是从一个叫做filp(file pointer)的slab分配器的高速缓存中得到的 也就是说每种对象类型对应一个高速缓存 2019/8/30 嵌入式OS

每个高速缓存被分成多个slabs,每个slab由一个或多个连续的页框组成,其中包含一定数目的对象 2019/8/30 嵌入式OS

普通和专用高速缓存 每个高速缓存使用kmem_cache_s表示 普通高速缓存根据大小分配内存 专用高速缓存根据类型分配 26个,2组(一组用于DMA分配,另一组用于常规分配) 每组13个,大小从25=32个字节,到217=132017个字节 数据结构cache_sizes 数组:malloc_sizes 专用高速缓存根据类型分配 2019/8/30 嵌入式OS

高速缓存描述符和slab描述符之间的关系 2019/8/30 嵌入式OS

每个slab有三种状态:全满,半满,全空 半满介于两者之间 当内核函数需要一个新的对象时, 优先从半满的slab满足这个请求 否则从全空的slab中取一个对象满足请求 如果没有空的slab则向buddy系统申请页面生成一个新的slab 2019/8/30 嵌入式OS

slab分配器和伙伴系统的接口 slab分配器调用kmem_getpages()来获取一组连续的空闲页框 相应的有kmem_freepages()来释放分配给slab分配器的页框 2019/8/30 嵌入式OS

slab分配器提供的接口 创建专用高速缓存:kmem_cache_create 撤销专用高速缓存:kmem_cache_destroy 从专用高速缓冲中分配和释放 从高速缓存中分配/释放一个内存对象 kmem_cache_alloc/kmem_cache_free 从普通高速缓存中分配和释放 kmalloc/kfree 举例说明使用情况 2019/8/30 嵌入式OS

如果编写的内核模块有许多创建和释放数据结构的操作,可以考虑调用前面所述的slab分配器的接口创建一个高速缓存 这样可以大大减少内存的访问时间 2019/8/30 嵌入式OS

非连续存储区管理 把线性空间映射到一组连续的页框是很好的选择 有时候不得不将线性空间映射到一组不连续的页框 优点:避免碎片 2019/8/30 嵌入式OS

为非连续内存区保留的线性地址空间 VMALLOC_START~VMALLOC_END 2019/8/30 嵌入式OS

非连续存储区的描述符vm_struct Vmalloc等分配一个非连续存储区 Vfree释放非连续线性区间 2019/8/30 嵌入式OS

页框管理、内存区管理、非连续存储区管理之间的关系 使用分配到缓冲区 使用分配到线性区 直接使用分配到的 页框,例如进程描述符 使用slab算法,以若干 个字节为单位进行管理 非连续存储区,映射 到非连续的物理页框上 分配出 一些页框 分配出 一些页框 物理内存:页框管理,以页框为单位进行管理 2019/8/30 嵌入式OS

Thanks! The end.

start_kernel page_address_init build_all_zonelists mem_init setup_arch page_alloc_init paging_init Arm与x86相似 2019/8/30 嵌入式OS

page_address_init 在include/linux/mm.h 文件中 2019/8/30 嵌入式OS

我们不考虑高端内存 2019/8/30 嵌入式OS

Paging_init Arm/mm/mmu.c 2019/8/30 嵌入式OS

Arm的cache Cachepolicy数据结构 Cachepolicy变量 cache_policies[] 2019/8/30 嵌入式OS

cpu_architecture获得CPU体系结构信息 根据processor_id来判断 processor_id在head_common.S中switch_data被__mmap_switched中被初始化 2019/8/30 嵌入式OS

CPU体系结构信息 2019/8/30 嵌入式OS