中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009

Slides:



Advertisements
Similar presentations
Linux 操作系统分析 中国科学技术大学计算机系 陈香兰( 0512 - ) Autumn 2010.
Advertisements

定 格 入 格 破 格 —— 新诗仿写复习训练 仿照下列句子,再把 “ 人生 ” 比喻成 “ 大海 ”“ 天空 ” , 造两个句子。 如果说人生是一首优美的乐曲,那么痛苦则 是其中一个不可或缺的音符。 参考答案: 1 、如果说人生是一望无际的大海,那么挫折则 是其中一个骤然翻起的浪花。 2 、如果说人生是一片湛蓝的天空,那么失意则.
公文处理常见问题分析 2015 年 9 月. Page  2 目 录 公文的定义 1 公文格式和行文规则中常见问题 2 常用文种的注意事项 3 公文写作的步骤方法 4.
科技部中部科學園區管理局 - 環安組 實習成果報告 指導老師:李書安 副教授 輔導員 : 王啟嵩 技士 姓 名:張韶恩 學 校:逢甲大學 系 級:環境工程與科學學系 班 級:四年乙班.
© 2001 孟静制作 版权所有 第二章 CPU 管理和进程、线程管理 2.1 CPU 管理概述 2.2 进程管理 2.3 进程模型实例分析 :UNIX 早期版本的 CPU 管理 子系统 ( 进程模型 ) 2.4 处理机管理实例分析 (2):linux CPU 管理(进程 模型) 2.5 线程模型.
天水圍的體育設施.
党的十八届四中全会 依法治国精神解读. 党的十八届四中全会 依法治国精神解读 一、十八届四中全会概况 中国共产党第十八届中央委员会第四次全体会议,于2014年10月20日至23日在北京举行。 全会审议通过了《中共中央关于全面推进依法治国若干重大问题的决定》。
证券市场法律制度与监督管理 作者:张学亮.
“三生教育”专题 生命·生存·生活.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
我怀念的乡村记忆 陈秀华 社会工作0841.
沟通技巧 主讲:涂育俊.
小学建筑设计 中的相关设计规范.
中小学校舍建设管理 《地县教育局基建专干培训班》 克拉玛依 2015年11月 校舍建设管理与现存问题对策 1.
义乌梦娜袜业 广告策划书 组员:徐琴娜 金春晓 陈晓静 陈菁菁 毛振华 王勤 指导老师:张益丹 完成时间:2006年12月.
全国国际商务英语考试(一级) 口试操作流程 全国国际商务英语考试中心 中国国际贸易学会商务专业培训考试办公室 2016年
嵌入式图形显示.
香港普通話研習社科技創意小學 周順強老師.
第三节 渐开线圆柱齿轮精度等级及应用.
春节 The Spring Festival. 春节 The Spring Festival.
寻觅节日诗情.
第7章 行政监督.
第七章 异常控制流 CPU控制流的概念 进程上下文切换 异常和中断的基本概念 异常和中断的响应和处理
Chapter 6 時序.
浅谈吉林省建筑采暖用能现有问题及解决方案
世界看遍 终归回到纯水岸 波托菲诺08年终总结. 世界看遍 终归回到纯水岸 波托菲诺08年终总结.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第七章. 文件系统 (lab5).
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
第二章 LINUX存储管理 LINUX的分页管理机制.
Chapter 3 行程觀念 (Process Concept)
多进程编程.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
人生哲理 每一句話都充滿著智慧,值得和朋友們分享、共勉~ <每隔 6 秒,自動換頁 !!>
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第8章 記憶體管理的概念.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
第六章. 系统调度,COW Fork和IPC (lab4)
Ch9 Communicating with Hardware
第3章 認識處理元.
第五章 中断与异常 中断的基本知识 中断描述符表的初始化 中断处理 中断的下半部处理机制 中断的应用-时钟中断.
组员:吴迪&王柳杨&金虎&陈武荣&谭金柏
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
Chapter 13 MMAP與DMA.
第2章 进程管理 2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程
Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551- )
第9章 虛擬記憶體 (virtual memory)
Chapter 7 掌控記憶體.
作業系統 第三章 作業系統結構.
閱8-5 能剪輯整理資料 教育部增置國小圖書教師輔導與教育訓練計畫 圖書資訊利用教育教學綱要及教學設計小組
南宁翰林华府 ——地中海风格与现代住宅的融合.
高山草原生態系 分布於臺灣3000公尺以上高山,如中央山脈.玉山山脈.雪山山脈 分為玉山箭竹草原,高山芒草原及兩者混生林三種
Chapter 7 掌控記憶體.
嵌入式操作系统 陈香兰 Fall 2009.
第 7 章 进程间的通信.
喜雨亭記 國二甲 S 陳姿婷.
实验二:添加Linux系统调用及熟悉常见系统调用
玻璃期货基础知识研究培训 张恒 2012年7月30日.
第十二章 位运算.
厦门大学数据库实验室 2014暑期奋战70天总结 罗道文
獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五.
技專校院多元入學管道 國立臺北科技大學 教務處 涂雅筑.
Section 2-2: 4 (6), 7, 12 (14), 13, 18 (16), 21, 25, 28, 30, 36, 46, 48, 50, 54a Section 3-1: 4 (2), 5, 10, 15, 20, 29, 32 Section 4-1: 3, 7, 8,
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen@ustc.edu.cn Spring 2009 Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551-3606864) xlanchen@ustc.edu.cn Spring 2009

进程地址空间 进程地址空间和内存描述符 线性区 创建和删除线性区 创建和删除进程的地址空间 缺页处理 堆 2019/7/24 Linux操作系统源代码分析导读

内核态和用户态分配内存的不同 内核中的函数以直接了当的方式获得动态内存 给用户态进程分配内存时 内核是操作系统中优先级最高的成分。 内核信任自己 采用前面介绍的页面级内存分配和小内存分配以及非连续线性区 给用户态进程分配内存时 请求被认为是不紧迫的 用户进程不可信任 因此,当用户态进程请求动态内存时,并没有立即获得实际的物理页框,而仅仅获得对一个新的线性地址区间的使用权 这个线性地址区间会成为进程地址空间的一部分,称作线性区(memory areas) 2019/7/24 Linux操作系统源代码分析导读

进程地址空间 进程最多能访问4GB的线性地址空间 但进程在访问某个线性空间之前,必须获得该线性空间的许可 因此,一个进程的地址空间是由允许该进程访问的全部线性地址组成 内核使用线性区资源来表示线性地址空间 每个线性区由起始线性地址、长度和一些存取权限描述 2019/7/24 Linux操作系统源代码分析导读

与进程地址空间相关的描述符 mm_struct 2019/7/24 Linux操作系统源代码分析导读

线性区的开始和结束都必须4KB对齐 进程获得新线性区的一些典型情况: 刚刚创建的新进程 使用exec系统调用装载一个新的程序运行 将一个文件(或部分)映射到进程地址空间中 当用户堆栈不够用的时候,扩展堆栈对应的线性区 …… 2019/7/24 Linux操作系统源代码分析导读

与创建、删除地址空间和线性区相关的系统调用 brk( ) 改变进程堆的大小 execve( ) Loads a new executable file, thus changing the process address space _exit( ) Terminates the current process and destroys its address space fork( ) Creates a new process, and thus a new address space mmap( ) Creates a memory mapping for a file, mmap2( ) thus enlarging the process address space mremap( ) 扩大或缩小线性区 remap_file_pages( ) Creates a non-linear mapping for a file munmap( ) Destroys a memory mapping for a file, thus contracting the process address space shmat( ) Attaches a shared memory region shmdt( ) Detaches a shared memory region 2019/7/24 Linux操作系统源代码分析导读

线性区(memory area) 比如0x08048000——0x0804C000这段线性地址空间被分配给了一个进程,进程就可以访问这段地址空间 进程只能访问某个有效的memory area。进一步讲,这个area可以被标志为只读或者不可执行(nonexecutable) 如果进程试图访问一个有效的area之外的地址或者用不正确的方式访问一个有效的area,内核将通过段异常(segmentation fault)杀死这个进程 2019/7/24 Linux操作系统源代码分析导读

线性区中可以包含各种内容 可执行文件代码段的内存映射,就是.text section 数据段的内存映射,.data section zero page的内存映射用来包含未初始化的全局变量,.bss section 为库函数和链接器附加的代码、数据、bss段 文件的内存映射 共享内存的映射 匿名内存区域的映射,比如通过malloc()函数申请的内存区域 2019/7/24 Linux操作系统源代码分析导读

进程地址空间中所有有效的线性地址都确定的存在于一个area中 memory areas不重叠 进程中每个单独的area对应一个不同内存区: 堆栈、二进制代码、全局变量、文件映射等等 2019/7/24 Linux操作系统源代码分析导读

增加或删除一个线性区 2019/7/24 Linux操作系统源代码分析导读

task_struct中的地址空间描述符mm_struct 部分参考ULK3中文版354页 参见Linux2.6.26源代码 2019/7/24 Linux操作系统源代码分析导读

分配一个内存描述符(创建进程地址空间) copy_mm函数用来在fork()调用中从父进程拷贝内存描述符 其中间接使用mm_alloc_pgd来分配一个新的页表 而mm_struct数据结构本身的空间是从mm_cachep指向的slab缓存中通过allocate_mm()宏分配得到的 如果父进程在fork()创建子进程时,通过一些标志指明要和子进程共享地址空间。那么,只需要 2019/7/24 Linux操作系统源代码分析导读

释放一个内存描述符(删除进程地址空间) 在进程退出时,exit_mm()函数被调用 首先做一些清除工作,更新一些内核全局统计数据 接着调用mmput(),这个函数减mm的mm_users域 如果mm_users域变成了0,就调用mmdrop()函数来减mm_count域 在mmdrop中,如果mm_count域变成了0,就调用__mmdrop free_mm()宏调用kmem_cache_free()函数把mm_struct返还给mm_cachp指向slab缓存 2019/7/24 Linux操作系统源代码分析导读

地址空间切换 switch_mm用来进行地址空间切换,包括 清除和设置prev和next地址空间中当前CPU在CPU位图的对应位; 使用next的页目录装载CR3; 装载next的LDT。 观察switch_mm,不考虑CONFIG_SMP 2019/7/24 Linux操作系统源代码分析导读

关于内核线程的地址空间 内核线程总是使用一组最近运行的普通进程的页表 高于3G的线性地址空间的特殊性 关于task_struct中“拥有”的mm和“使用的”active_mm 高于3G的页表的一致性维护 延迟更新 2019/7/24 Linux操作系统源代码分析导读

线性区(memory areas) 每个线性区由一个vm_area_struct结构来表示 这个结构描述了一段给定的内存区间 区间中的地址都有同样的属性,比如同样的存取权限和相关的操作函数 用这个结构可以表示各种线性区,比如映射可执行的二进制代码的线形区、用作用户态堆栈的线形区等等 参见源码中的vma_area_struct 2019/7/24 Linux操作系统源代码分析导读

线性区的存取权限 vm_flags域描述有关这个线性区全部页的信息。例如,进程访问每个页的权限是什么。还有一些标志描述线性区自身,例如它应该如何增长 VM_READ, VM_WRITE, VM_EXEC VM_SHARED VM_RESERVED VM_GROWSUP 更多,参见ULK3 363页 2019/7/24 Linux操作系统源代码分析导读

线性区的链表和红黑树 通过内存描述符中的两个域mmap和mm_rb都可以访问线性区。事实上,它们都指向了同一个vm_area_struct结构,只是链接的方式不同 mmap指向的线性区链表用来遍历整个进程的地址空间 红黑树mm_rb用来定位一个给定的线性地址落在进程地址空间中的哪一个线性区中 mmap_cache用来缓存最近用过的线性区 2019/7/24 Linux操作系统源代码分析导读

处理线性区 内核进程需要对一个线性区进行处理,比如确定一个给定线性地址是否存在于一个线性地址空间中 find_vma(),查找一个线性地址所属或后继线性区 两个参数:进程内存描述符的地址mm和线性地址addr find_vma_intersection(),查找一个与给定地址区间重叠的线性区 get_unmapped_area(),查找一个空闲的地址区间 insert_vm_struct(),向内存描述符链表中插入一个线性区 2019/7/24 Linux操作系统源代码分析导读

static inline unsigned long do_mmap 创建一个线性区间 do_mmap(),创建一个线性区 根据file参数映射指定的文件中偏移量为offset,长度为len的一段内容 addr参数指明从何处开始查找一段可用的空闲线性地址区间 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) 2019/7/24 Linux操作系统源代码分析导读

删除一个线性区间 munmap()和do_munmap() do_munmap()函数从进程地址空间中删除一段线性空间 mm参数指向了当前进程的内存描述符 addr参数为线性区的起始地址 len参数指明要删除的区间大小 int do_munmap (struct mm_struct *mm, unsigned long addr, size_t len) 2019/7/24 Linux操作系统源代码分析导读

缺页异常 如前所述,内核只是通过mmap()等调用分配了一些线性地址空间给进程,并没有真正的把实际的物理页框分配给进程 当进程试图访问这些分配给它的地址空间时,比如一段线性地址空间映射的是二进制代码,则进程被调度执行的时候会跳转到这个地址上去执行 此时,并没有物理页框对应于这些线性地址,从而会引发一个缺页异常 2019/7/24 Linux操作系统源代码分析导读

缺页异常处理程序do_page_fault 缺页异常处理程序处理缺页异常。 它可以判断出这是不是一个合法的缺页异常,如果是,则负责给这段线性地址分配一些物理页框并把磁盘中对应的文件写入这些物理页框 这样进程得以正常运行。 阅读相关代码 trap_init、page_fault、do_page_fault do_page_fault中,根据不同的情况分别进行处理 vmalloc_fault 异常表及处理 堆栈扩展 其它用户线性区的处理 … 2019/7/24 Linux操作系统源代码分析导读

常规缺页相关的概念 按需调页 写时复制 2019/7/24 Linux操作系统源代码分析导读

堆 堆用来满足用户进程的动态内存请求 其线性区间地址范围在mm_struct中由start_brk和brk标识 用户请求分配/释放动态内存 malloc(size) cmalloc(n,size) realloc(ptr,size) free(addr) brk(addr)和sbrk(adr) 只有brk有相关的系统调用,其它都仅仅是C库函数,可能调用brk和mmap sys_brk 2019/7/24 Linux操作系统源代码分析导读

Project 这个作业的代码不在Linux内核中。请自己寻找 查找glibC库中关于malloc和free接口相关的定义,调研malloc中所使用的地址空间管理算法。 2019/7/24 Linux操作系统源代码分析导读

Thanks! The end.