版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux内核源代码导读内核源代码导读 中国科学技术大学计算机系中国科学技术大学计算机系陈香兰(陈香兰(05513606864)Spring 20092022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读2/26进程地址空间进程地址空间v进程地址空间和内存描述符v线性区v创建和删除线性区v创建和删除进程的地址空间v缺页处理v堆2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读3/26内核态和用户态分配内存的不同内核态和用户态分配内存的不同v 内核中的函数以直接了当的方式获得动态内存 内核是操作系统中优先级最高的成分。 内核信任自己 采用前面介绍的页面级内
2、存分配和小内存分配以及非连续线性区v 给用户态进程分配内存时 请求被认为是不紧迫的 用户进程不可信任 因此,当用户态进程请求动态内存时,并没有立即获得实际的物理页框,而仅仅获得对一个新的线性地址区间的使用权仅仅获得对一个新的线性地址区间的使用权 这个线性地址区间会成为进程地址空间的一部分,称作线性区(memory areas)2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读4/26进程地址空间进程地址空间v进程最多能访问4GB的线性地址空间v但进程在访问某个线性空间之前,必须获得该线性空间的许可v因此,一个进程的地址空间是由允许该进程访问的全部线性地址组成v内核使用线性
3、区资源来表示线性地址空间每个线性区由起始线性地址、长度和一些存取权限描述2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读5/26与进程地址空间相关的描述符与进程地址空间相关的描述符mm_struct2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读6/26v线性区的开始和结束都必须4KB对齐v进程获得新线性区的一些典型情况:刚刚创建的新进程使用exec系统调用装载一个新的程序运行将一个文件(或部分)映射到进程地址空间中当用户堆栈不够用的时候,扩展堆栈对应的线性区2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读7/26与创建、
4、删除地址空间和线性区相关的系统调用与创建、删除地址空间和线性区相关的系统调用v brk( )改变进程堆的大小v execve( )Loads a new executable file, thus changing the process address spacev _exit( )Terminates the current process and destroys its address spacev fork( )Creates a new process, and thus a new address spacev mmap( ) Creates a memory mapping f
5、or a file, mmap2( )thus enlarging the process address spacev mremap( )扩大或缩小线性区v remap_file_pages( ) Creates a non-linear mapping for a file v munmap( )Destroys a memory mapping for a file, thus contracting the process address spacev shmat( )Attaches a shared memory regionv shmdt( )Detaches a shared
6、memory region2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读8/26线性区(线性区(memory area)v 比如0 x080480000 x0804C000这段线性地址空间被分配给了一个进程,进程就可以访问这段地址空间v 进程只能访问某个有效的memory area。进一步讲,这个area可以被标志为只读或者不可执行(nonexecutable)v 如果进程试图访问一个有效的area之外的地址或者用不正确的方式访问一个有效的area,内核将通过段异常(segmentation fault)杀死这个进程2022-2-22Linux操作系统源代码分析导读操
7、作系统源代码分析导读9/26v 线性区中可以包含各种内容 可执行文件代码段的内存映射,就是.text section 数据段的内存映射,.data section zero page的内存映射用来包含未初始化的全局变量,.bss section 为库函数和链接器附加的代码、数据、bss段 文件的内存映射 共享内存的映射 匿名内存区域的映射,比如通过malloc()函数申请的内存区域2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读10/26v进程地址空间中所有有效的线性地址都确定的存在于一个area中memory areas不重叠v进程中每个单独的area对应一个不同内存
8、区:堆栈、二进制代码、全局变量、文件映射等等2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读11/26增加或删除一个线性区增加或删除一个线性区2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读12/26vtask_struct中的地址空间描述符mm_struct部分参考部分参考ULK3中文版中文版354页页参见参见Linux2.6.26源代码源代码2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读13/26分配一个内存描述符(创建进程地址空间)分配一个内存描述符(创建进程地址空间)v copy_mm函数用来在fork()调用中
9、从父进程拷贝内存描述符 其中间接使用mm_alloc_pgd来分配一个新的页表v 而mm_struct数据结构本身的空间是从mm_cachep指向的slab缓存中通过allocate_mm()宏分配得到的v 如果父进程在fork()创建子进程时,通过一些标志指明要和子进程共享地址空间。那么,只需要2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读14/26释放一个内存描述符(删除进程地址空间)释放一个内存描述符(删除进程地址空间)v在进程退出时,exit_mm()函数被调用首先做一些清除工作,更新一些内核全局统计数据接着调用mmput(),这个函数减mm的mm_users
10、域l如果mm_users域变成了0,就调用mmdrop()函数来减mm_count域在mmdrop中,如果mm_count域变成了0,就调用_mmdroplfree_mm()宏调用kmem_cache_free()函数把mm_struct返还给mm_cachp指向slab缓存2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读15/26地址空间切换地址空间切换vswitch_mm用来进行地址空间切换,包括清除和设置prev和next地址空间中当前CPU在CPU位图的对应位;使用next的页目录装载CR3;装载next的LDT。观察观察switch_mm,不考虑,不考虑CON
11、FIG_SMP 2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读16/26关于内核线程的地址空间关于内核线程的地址空间v内核线程总是使用一组最近运行的普通进程的页表高于3G的线性地址空间的特殊性关于task_struct中“拥有拥有”的的mm和“使用的使用的”active_mm高于3G的页表的一致性维护l延迟更新2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读17/26线性区线性区(memory areas)v每个线性区由一个vm_area_struct结构来表示这个结构描述了一段给定的内存区间区间中的地址都有同样的属性,比如同样的存取权限和相关
12、的操作函数用这个结构可以表示各种线性区,比如映射可执行的二进制代码的线形区、用作用户态堆栈的线形区等等参见源码中的参见源码中的vma_area_struct2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读18/26线性区的存取权限线性区的存取权限vvm_flags域描述有关这个线性区全部页的信息。例如,进程访问每个页的权限是什么。还有一些标志描述线性区自身,例如它应该如何增长VM_READ, VM_WRITE, VM_EXECVM_SHAREDVM_RESERVEDVM_GROWSUP更多,参见更多,参见ULK3 363页页2022-2-22Linux操作系统源代码分析
13、导读操作系统源代码分析导读19/26线性区的链表和红黑树线性区的链表和红黑树v通过内存描述符中的两个域mmap和mm_rb都可以访问线性区。事实上,它们都指向了同一个vm_area_struct结构,只是链接的方式不同vmmap指向的线性区链表用来遍历整个进程的地址空间v红黑树mm_rb用来定位一个给定的线性地址落在进程地址空间中的哪一个线性区中vmmap_cache用来缓存最近用过的线性区2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读20/26处理线性区处理线性区v 内核进程需要对一个线性区进行处理,比如确定一个给定线性地址是否存在于一个线性地址空间中v find_
14、vma(),查找一个线性地址所属或后继线性区 两个参数:进程内存描述符的地址mm和线性地址addrv find_vma_intersection(),查找一个与给定地址区间重叠的线性区v get_unmapped_area(),查找一个空闲的地址区间v insert_vm_struct(),向内存描述符链表中插入一个线性区2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读21/26创建一个线性区间创建一个线性区间v do_mmap(),创建一个线性区 根据file参数映射指定的文件中偏移量为offset,长度为len的一段内容 addr参数指明从何处开始查找一段可用的空闲
15、线性地址区间 Prot参数指定这个区间所包含的页的存取权限 flags参数指定这个创建的线性区本身的一些标志static inline unsigned long do_mmap(struct file *file, unsigned long addr,unsigned long len, unsigned long prot,unsigned long flag, unsigned long offset)2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读22/26删除一个线性区间删除一个线性区间vmunmap()和do_munmap()do_munmap()函数从进
16、程地址空间中删除一段线性空间mm参数指向了当前进程的内存描述符addr参数为线性区的起始地址len参数指明要删除的区间大小int do_munmap(struct mm_struct *mm, unsigned long addr, size_t len)2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读23/26缺页异常缺页异常v如前所述,内核只是通过mmap()等调用分配了一些线性地址空间给进程,并没有真正的把实际的物理页框分配给进程v当进程试图访问这些分配给它的地址空间时,比如一段线性地址空间映射的是二进制代码,则进程被调度执行的时候会跳转到这个地址上去执行v此时,
17、并没有物理页框对应于这些线性地址,从而会引发一个缺页异常2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读24/26缺页异常处理程序缺页异常处理程序do_page_faultv 缺页异常处理程序处理缺页异常。 它可以判断出这是不是一个合法的缺页异常,如果是,则负责给这段线性地址分配一些物理页框并把磁盘中对应的文件写入这些物理页框 这样进程得以正常运行。v 阅读相关代码 trap_init、page_fault、do_page_fault do_page_fault中,根据不同的情况分别进行处理l vmalloc_faultl 异常表及处理l 堆栈扩展l 其它用户线性区的处理l 2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读25/26v常规缺页相关的概念按需调页写时复制2022-2-22Linux操作系统源代码分析导读操作系统源代码分析导读26/26堆堆v堆用来满足用户进程的动态内存请求v其线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年清洗剂行业分析报告及未来发展趋势报告
- 2025年家庭防震试题及答案
- 2026年高篮球课测试题及答案
- 2026年出版印刷行业分析报告及未来发展趋势报告
- 2026年湖北省事业单位联考《教育理论综合》试题及答案
- 2025年医师定期考核临床试题及答案
- 2026年品质文化考试试题及答案
- 2026年扫码枪行业分析报告及未来发展趋势报告
- 梧州市龙圩区(2026年)辅警招聘考试题库 (答案+解析)
- 2025年命运战歌答题库及答案
- 车间员工计件薪酬方案范本
- 天平使用步骤课件
- 高原铁路隧道供氧系统管道施工
- 2026年材料员之材料员基础知识考试题库300道附参考答案【考试直接用】
- 雨课堂学堂在线学堂云《俄罗斯文化艺术赏析(北京联合大学 )》单元测试考核答案
- 校车驾驶员安全培训课件
- 《业务三板斧:定目标、抓过程、拿结果》阅读随笔
- 江苏钢结构厂房加高施工方案
- 耕地复耕申请书范文
- 制药技术专业毕业论文
- 施甸县国土空间总体规划(2021-2035年)图集
评论
0/150
提交评论