已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核源代码导读 中国科学技术大学计算机系陈香兰 0551 3606864 xlanchen Spring2009 2020 1 31 Linux操作系统源代码分析导读 2 26 进程地址空间 进程地址空间和内存描述符线性区创建和删除线性区创建和删除进程的地址空间缺页处理堆 2020 1 31 Linux操作系统源代码分析导读 3 26 内核态和用户态分配内存的不同 内核中的函数以直接了当的方式获得动态内存内核是操作系统中优先级最高的成分 内核信任自己采用前面介绍的页面级内存分配和小内存分配以及非连续线性区给用户态进程分配内存时请求被认为是不紧迫的用户进程不可信任因此 当用户态进程请求动态内存时 并没有立即获得实际的物理页框 而仅仅获得对一个新的线性地址区间的使用权这个线性地址区间会成为进程地址空间的一部分 称作线性区 memoryareas 2020 1 31 Linux操作系统源代码分析导读 4 26 进程地址空间 进程最多能访问4GB的线性地址空间但进程在访问某个线性空间之前 必须获得该线性空间的许可因此 一个进程的地址空间是由允许该进程访问的全部线性地址组成内核使用线性区资源来表示线性地址空间每个线性区由起始线性地址 长度和一些存取权限描述 2020 1 31 Linux操作系统源代码分析导读 5 26 与进程地址空间相关的描述符 mm struct 2020 1 31 Linux操作系统源代码分析导读 6 26 线性区的开始和结束都必须4KB对齐进程获得新线性区的一些典型情况 刚刚创建的新进程使用exec系统调用装载一个新的程序运行将一个文件 或部分 映射到进程地址空间中当用户堆栈不够用的时候 扩展堆栈对应的线性区 2020 1 31 Linux操作系统源代码分析导读 7 26 与创建 删除地址空间和线性区相关的系统调用 brk 改变进程堆的大小execve Loadsanewexecutablefile thuschangingtheprocessaddressspace exit Terminatesthecurrentprocessanddestroysitsaddressspacefork Createsanewprocess andthusanewaddressspacemmap Createsamemorymappingforafile mmap2 thusenlargingtheprocessaddressspacemremap 扩大或缩小线性区remap file pages Createsanon linearmappingforafilemunmap Destroysamemorymappingforafile thuscontractingtheprocessaddressspaceshmat Attachesasharedmemoryregionshmdt Detachesasharedmemoryregion 2020 1 31 Linux操作系统源代码分析导读 8 26 线性区 memoryarea 比如0 x08048000 0 x0804C000这段线性地址空间被分配给了一个进程 进程就可以访问这段地址空间进程只能访问某个有效的memoryarea 进一步讲 这个area可以被标志为只读或者不可执行 nonexecutable 如果进程试图访问一个有效的area之外的地址或者用不正确的方式访问一个有效的area 内核将通过段异常 segmentationfault 杀死这个进程 2020 1 31 Linux操作系统源代码分析导读 9 26 线性区中可以包含各种内容可执行文件代码段的内存映射 就是 textsection数据段的内存映射 datasectionzeropage的内存映射用来包含未初始化的全局变量 bsssection为库函数和链接器附加的代码 数据 bss段文件的内存映射共享内存的映射匿名内存区域的映射 比如通过malloc 函数申请的内存区域 2020 1 31 Linux操作系统源代码分析导读 10 26 进程地址空间中所有有效的线性地址都确定的存在于一个area中memoryareas不重叠进程中每个单独的area对应一个不同内存区 堆栈 二进制代码 全局变量 文件映射等等 2020 1 31 Linux操作系统源代码分析导读 11 26 增加或删除一个线性区 2020 1 31 Linux操作系统源代码分析导读 12 26 task struct中的地址空间描述符mm struct 部分参考ULK3中文版354页 参见Linux2 6 26源代码 2020 1 31 Linux操作系统源代码分析导读 13 26 分配一个内存描述符 创建进程地址空间 copy mm函数用来在fork 调用中从父进程拷贝内存描述符其中间接使用mm alloc pgd来分配一个新的页表而mm struct数据结构本身的空间是从mm cachep指向的slab缓存中通过allocate mm 宏分配得到的如果父进程在fork 创建子进程时 通过一些标志指明要和子进程共享地址空间 那么 只需要 2020 1 31 Linux操作系统源代码分析导读 14 26 释放一个内存描述符 删除进程地址空间 在进程退出时 exit mm 函数被调用首先做一些清除工作 更新一些内核全局统计数据接着调用mmput 这个函数减mm的mm users域如果mm users域变成了0 就调用mmdrop 函数来减mm count域在mmdrop中 如果mm count域变成了0 就调用 mmdropfree mm 宏调用kmem cache free 函数把mm struct返还给mm cachp指向slab缓存 2020 1 31 Linux操作系统源代码分析导读 15 26 地址空间切换 switch mm用来进行地址空间切换 包括清除和设置prev和next地址空间中当前CPU在CPU位图的对应位 使用next的页目录装载CR3 装载next的LDT 观察switch mm 不考虑CONFIG SMP 2020 1 31 Linux操作系统源代码分析导读 16 26 关于内核线程的地址空间 内核线程总是使用一组最近运行的普通进程的页表高于3G的线性地址空间的特殊性关于task struct中 拥有 的mm和 使用的 active mm高于3G的页表的一致性维护延迟更新 2020 1 31 Linux操作系统源代码分析导读 17 26 线性区 memoryareas 每个线性区由一个vm area struct结构来表示这个结构描述了一段给定的内存区间区间中的地址都有同样的属性 比如同样的存取权限和相关的操作函数用这个结构可以表示各种线性区 比如映射可执行的二进制代码的线形区 用作用户态堆栈的线形区等等 参见源码中的vma area struct 2020 1 31 Linux操作系统源代码分析导读 18 26 线性区的存取权限 vm flags域描述有关这个线性区全部页的信息 例如 进程访问每个页的权限是什么 还有一些标志描述线性区自身 例如它应该如何增长VM READ VM WRITE VM EXECVM SHAREDVM RESERVEDVM GROWSUP 更多 参见ULK3363页 2020 1 31 Linux操作系统源代码分析导读 19 26 线性区的链表和红黑树 通过内存描述符中的两个域mmap和mm rb都可以访问线性区 事实上 它们都指向了同一个vm area struct结构 只是链接的方式不同mmap指向的线性区链表用来遍历整个进程的地址空间红黑树mm rb用来定位一个给定的线性地址落在进程地址空间中的哪一个线性区中mmap cache用来缓存最近用过的线性区 2020 1 31 Linux操作系统源代码分析导读 20 26 处理线性区 内核进程需要对一个线性区进行处理 比如确定一个给定线性地址是否存在于一个线性地址空间中find vma 查找一个线性地址所属或后继线性区两个参数 进程内存描述符的地址mm和线性地址addrfind vma intersection 查找一个与给定地址区间重叠的线性区get unmapped area 查找一个空闲的地址区间insert vm struct 向内存描述符链表中插入一个线性区 2020 1 31 Linux操作系统源代码分析导读 21 26 创建一个线性区间 do mmap 创建一个线性区根据file参数映射指定的文件中偏移量为offset 长度为len的一段内容addr参数指明从何处开始查找一段可用的空闲线性地址区间Prot参数指定这个区间所包含的页的存取权限flags参数指定这个创建的线性区本身的一些标志 staticinlineunsignedlongdo mmap structfile file unsignedlongaddr unsignedlonglen unsignedlongprot unsignedlongflag unsignedlongoffset 2020 1 31 Linux操作系统源代码分析导读 22 26 删除一个线性区间 munmap 和do munmap do munmap 函数从进程地址空间中删除一段线性空间mm参数指向了当前进程的内存描述符addr参数为线性区的起始地址len参数指明要删除的区间大小 intdo munmap structmm struct mm unsignedlongaddr size tlen 2020 1 31 Linux操作系统源代码分析导读 23 26 缺页异常 如前所述 内核只是通过mmap 等调用分配了一些线性地址空间给进程 并没有真正的把实际的物理页框分配给进程当进程试图访问这些分配给它的地址空间时 比如一段线性地址空间映射的是二进制代码 则进程被调度执行的时候会跳转到这个地址上去执行此时 并没有物理页框对应于这些线性地址 从而会引发一个缺页异常 2020 1 31 Linux操作系统源代码分析导读 24 26 缺页异常处理程序do page fault 缺页异常处理程序处理缺页异常 它可以判断出这是不是一个合法的缺页异常 如果是 则负责给这段线性地址分配一些物理页框并把磁盘中对应的文件写入这些物理页框这样进程得以正常运行 阅读相关代码trap init page fault do page faultdo page fault中 根据不同的情况分别进行处理vmalloc fault异常表及处理堆栈扩展其它用户线性区的处理 2020 1 31 Linux操作系统源代码分析导读 25 26 常规缺页相关的概念按需调页写时复制 2020 1 31 Linux操作系统源代码分析导读 26 26 堆 堆用来满足用户进程的动态内存请求其线性区间地址范围在mm struct中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业售楼中介合同范本
- 租房合同改民宿协议书
- 租房托管中介合同范本
- 演出聘请保安合同范本
- 真空玻璃协会合同范本
- 直播货品承接合同范本
- 烟酒供货协议合同范本
- 酒店合作婚庆合同范本
- 衣柜板材分包合同范本
- 辽阳化工生产合同范本
- 雨课堂在线学堂《智慧中国英语说期末复习题》考核测试答案
- 2024-2025学年江苏省苏州市多校五年级(上)期中语文试卷
- 2025年幼师考试试题及答案真题
- 企业标准化工作流程建立手册
- 【2025年】大学生安全知识竞赛试题库及答案
- 2025年文职考试教材药学真题及答案
- 程式与意蕴-中国传统绘画(人物画)课件-2025-2026学年高中美术人美版(2019)美术鉴赏
- 2025年国家公务员考试行测试题(含答案)
- 【高一上】河北省NT20联盟2025-2026学年高一10月联考语文试题含答案
- 燃气管道勘察与设计方案
- 消防安全生命至上培训课件
评论
0/150
提交评论