




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核分析 韩晓峰 内存管理 主要内容 页区获得 释放页kmalloc kfree vmalloc slab分配器 内核与用户空间不同 它不具备像用户空间那样设置的使用内存的能力 不支持简单便捷的内存分配方式 页 内核把物理页作为内存管理的基本单位 尽管处理器的最小可寻址单位通常为字 甚至字节 但内存管理单元 MMU 通常以页为单位进行处理 从虚拟内存的角度来看 页就是最小单位 体系结构不同 支持的页大小也不同 大多数32位体系结构支持4KB的页 而64位体系结构一般会支持8KB的页 在支持4KB页大小并有1GB物理内存的机器上 物理内存会被划分为262144个页 内核用structpage结构表示系统中的每个物理页 该结构位于linux mm h中 structpage page flags tflags atomic t count atomic t mapcount unsignedlongprivate statctaddress space mapping pgoff tindex structlist headlru void virtual 较重要的域 flag存放页的状态 count存放页的引用计数virtual是页的虚拟地址 系统中的每个物理页都要分配一个这样的结构体假设structpage占用40字节的内存 系统的物理页为4KB大小 系统有128MB物理内存 那么系统中又有page结构消耗的内存只不过是1MB多些 区 由于硬件限制 有些页位于内存中特定的物理地址上 所以不能将其用于一些特定的任务 内核把页划分为不同的区 zone ZHONE DMA 这个区包含的页用来执行DMA操作ZONE NORMAL 这个区包含的都是正常映射的页ZONE HIGHMEMM 这个区包含 高端内存 其中的页并不能永久的映射到内核地址空间 三种区的定义在linux mmzone h中区的实际使用和分布式与体系结构相关的 ZONE HIGHMEM所在的内存是高端内存 其余的内存就是所谓的地段内存 在x86上ZONE DMA为小于16MB的物理内存ZONE NORMAL为16 896MB之间的物理内存ZONE HIGHMEM为高于896MB的所有物理内存 Linux把系统的页划分为区 形成不同的内存池 可以根据用途进行分配 区的划分没有物理意义 只是为了内核管理页的一种逻辑上的分组 每个区都用structzone表示 定义在linux mmzone h文件中 结构体中lock域是一个自旋锁 防止该结构被并发访问name域是一个以NULL结束的字符串 表示这个区的名字 内核启动期间初始化这个值 代码位于mm page alloc c中名字分别为 DMA Normal HighMem 获得页 释放页 获得页 内核提供了一种请求内存的底层机制 并提供了对它进行访问的几个接口 所有接口都以页尾单位分配内存 定义在linux gfp h中 structpage alloc pages unsignedintgfp mas unsignedintorder 该函数分配2的order次方个连续的无力也 并返回一个指针 指向第一个页的page结构体 void page address structpage page 函数返回一个指针 指向给定物理页当前所在的逻辑地址 unsignedlong get free pages unsignedintgfp mask unsignedintorder 这个函数与alloc page 作用相同 直接返回所请求的第一个页的逻辑地址 如果只需要一个页 这可使用封装好的函数 structpage alloc page unsignedintgfp mask unsignedlong get free page unsignedintgfp mask 获得填充为0的页unsignedlongget zeroed page unsignedintgfp mask 该函数把分配好的页都填充为0 这样可以清除随机的垃圾数据 释放页 void free pages structpage page unsignedintorder voidfree pages unsignedlongaddr unsignedintorder voidfree page unsignedlongaddr 释放页时需要谨慎 传递了错误的structpage或地址 用了错误的order值 都可能导致系统崩溃 内核是不会检查这些参数指定的范围是否正确 获得8个页的例子 unsignedlongpage page get free pages GFP KERNEL 3 if page return BNOMEM free pages page 3 kmalloc kmalloc kmalloc 函数与用户空间的malloc 一族函数非常类似 只是多了一个flags参数 使用此函数可以获得以字节为单位的一块内核内存 kmalloc 在linux slab h中声明 void kmalloc size tsize intflags 这个函数返回一个执行内存块的指针 其内存块至少要有size大小 分配的内存区在屋里上式连续的 出错返回NULL 必须判断返回值再进行使用 分配结构体例子 structbird ptr ptr kmalloc sizeof structbird GFP KERNEL if ptr 处理错误 kfree kfree kfree 声明在linux slab h中 voidkfree constvoid ptr kfree 函数释放由kmalloc 分配出来的内存块 如果指定释放的内存不应该操作 则会导致严重后果 char buf buf kmalloc BUF SIZE GFP ATOMIC if buf 内存分配出错处理 kfree buf vmalloc vmalloc vmalloc 函数的工作方式类似于kmalloc 只不过vmalloc分配的内存虚拟地址是连续的 而物理地址无需连续 这也是用户空间分配函数malloc的工作方式 kmalloc函数确保页在物理地址上是连续的 虚拟地址自然也是连续的 由于使用vmalloc需要把物理上不连续的页转换为虚拟地址空间上连续的页 必须专门建立页表项 所以vmalloc仅在不得已时才会使用 一般是为了获得大块内存时 例如当模块被动态的插入到内核中时 就把模块装载到由vmalloc分配的内存上 vmalloc 函数在linux vmalloc h中声明 在mm vmalloc c中定义 用法与用户空间的malloc 相同 void vmalloc unsignedlongsize 该函数返回一个指针 指向逻辑上连续的一块内存区 函数可能睡眠 因此不能从中孤单上下文中进行调用 也不能从其他不允许阻塞的情况下进行调用 释放vfree 要释放通过vmallo 获得的内存 使用voidvfree void addr 函数会释放从addr开始的内存块 addr是由vmalloc 分配的内存块地址 char buf buf vmalloc 16 PAGE SIZE if buf 分配内存错误 vfree buf slab层 分配和释放数据结构是所有内核中最普遍的操作之一 为了便于数据的频繁分配和回收 slab分配器扮演了通用数据结构缓存层的角色 slab分配器基本原则 频繁使用的数据结构也会频繁分配和释放 因此需要缓存他们 频繁分配和回收必然会导致内存碎片 使用空闲链表的缓存会连续的存放使用空闲链表提高分配和释放的性能 对多处理器进行优化 slab层把不同的对象划分为所谓高速缓存 cache 组 其中每个高速缓存都存放不同类型的对象 每种对象类型对应一个高速缓存 这些高速缓存又被划分为slab slab由一个或多个物理上连续的页组成 每个slab都包含一些对象成员 这里的对象指的是被缓存的数据结构 每个slab处于三种状态 满 没有空闲的对象部分满 slab中有分配和未分配的对象空 没有分配出任何对象 对象分配 当内核的某一部分需要一个新的对象时 先从部分满的slab中进行分配 如果没有部分满的slab 就从空的slab中进行分配 如果没有空的slab 就要创建一个slab 高速缓冲 slab 对象关系 每个高速缓存都是用kmem cache s结构来表示 这个结构包含三个链表slabs full slabs partial和slabs empty 均存放在kmem list3结构内 slab描述符structslab用来描述每个slabstructslab structlist headlist 链表 unsignedlongcolouroff void s mem slab中第一个对象 unsignedintinuse 已分配对象数 kmem bufctl tfree 第一空闲对象 相关系统调用 内存相关系统调用 Linux采用malloc calloc realloc和free函数对动态内存进行分配 动态内存分配是编制高效率程序的基础 能够高效率使用内存和重要的系统资源 malloc 配置内存空间 includevoid malloc size tsize 函数说明malloc 用来配置内存空间 其大小由指定的size决定 返回值若配置成功则返回一指针 失败则返回NULL calloc 配置内存空间 includevoid calloc size tnmemb size tsize calloc 用来配置nmemb个相邻的内存单位 每一单位的大小为size 并返回指向第一个元素的指针 这和使用下列的方式效果相同 malloc nmemb size 不过 在利用calloc 配置内存时会将内存内容初始化为0 返回值若配置成功则返回一指针 失败则返回NULL realloc函数改变以前分配的内存大小 可以使用realloc调整以前由malloc和calloc调用获得的内存大小 includevoid realloc void ptr size tsize ptr 必须是malloc和calloc返回的指针 size可以大于原来的内存块的大小 也可以小于 realloc不对增加的内存块做初始化 realloc如果不能大于内存块 就返回NULL 而且保持原来的数据不动realloc的第一个参数如果为NULL 他和malloc作用一样realloc的第二个参数如果为0 则释放原来的内存块 free释放一块内存 includevoidfree void ptr ptr必须是malloc和calloc放回的指针 内存映射 Linux允许任何一个进程把一个磁盘文件映像到内存中 在磁盘文件和内存中的映像创建一个逐字节的对应关系 在内存映像文件上的I O操作跳过了内核缓冲 速度快许多 Linux用mmap munmap msync mprotect mlock munlock mlockall和munlockall 这些系统调用管理内存映像文件 mmap 建立内存映射 include includevoid mmap void start size tlength intport intflags intfd off toffset mmap 用来将某个文件内容映射到内存中 对该内存区域的存取即是直接对该文件内容的读写 参数start指向欲对应的内存起始地址 通常设为NULL 代表让系统自动选定地址 对应成功后该地址会返回 参数length代表将文件中多大的部分对应到内存 参数prot代表映射区域的保护方式有下列组合PROT EXEC映射区域可被执行PROT READ映射区域可被读取PROT WRITE映射区域可被写入PROT NONE映射区域不能存取 参数flags会影响映射区域的各种特性MAP FIXED如果参数start所指的地址无法成功建立映射时 则放弃映射 不对地址做修正 通常不鼓励用此旗标 MAP SHARED对映射区域的写入数据会复制回文件内 而且允许其他映射该文件的进程共享 MAP PRIVATE对映射区域的写入操作会产生一个映射文件的复制 即私人的 写入时复制 copyonwrite 对此区域作的任何修改都不会写回原来的文件内容 MAP ANONYMOUS建立匿名映射 此时会忽略参数fd 不涉及文件 而且映射区域无法和其他进程共享 MAP DENYWRITE只允许对映射区域的写入操作 其他对文件直接写入的操作将会被拒绝 MAP LOCKED将映射区域锁定住 这表示该区域不会被置换 swap 在调用mmap 时必须要指定MAP SHARED或MAP PRIVATE 参数fd为open 返回的文件描述词 代表欲映射到内存的文件 参数offset为文件映射的偏移量 通常设置为0 代表从文件最前方开始对应 offset必须是分页大小的整数倍 返回值若映射成功则返回映射区的内存起始地址 否则返回MAP FAILED则返回 1 错误原因存于errno中 munmap函数 munmap接触内存映像并把内存释放返回给操作系统 include includeintmunmap void start size tlength start指向要解除映像的内存区的起始位置length指出要解除映像的内存区的大小 执行成功返回0 失败返回 1并设置errno变量 msync函数 msync函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能叉车生产流程优化方案
- 煤炭仓储物流项目技术方案
- 2025年上册二级试卷及答案
- 加工订货合同范本
- 石材幕墙工程施工专项建筑施工组织设计及对策
- 赞助商权益最大化足球赛事合同范本
- 轻型钢结构项目管理实施方案
- 住宅小区景观水池装修与物业管理服务协议
- 税务局电子档案管理系统短信验证码接入合同
- 离婚配偶房产分割子女居住权保障过户合同范本
- 北师大版六年级数学上册《百分数的认识》教学设计
- 2023八年级数学上册 第七章 平行线的证明4 平行线的性质教案 (新版)北师大版
- NB-T32042-2018光伏发电工程建设监理规范
- 博士高校面试答辩模板
- 《国家心力衰竭指南2023》(完整版)解读课件
- 深圳市劳动法律法规参考手册模板
- 在线网课知道知慧《战舰与海战》单元测试答案
- 2017一级建造师考试港口与航道工程实务真题及答案
- 部编小学语文单元作业设计四年级上册第八单元
- 班组长质量管理意识培训
- 陈旭大卫不可以 省赛一等奖
评论
0/150
提交评论