中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010

Slides:



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

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 分布式操作系统.
天水圍的體育設施.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Linux内存管理 内存管理概述 Linux内存管理数据结构 Linux内存分配与回收 Slab分配器 Linux进程的地址空间 页表
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第二章 LINUX存储管理 LINUX的分页管理机制.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
临界区软件互斥软件实现算法.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
中国科学技术大学计算机系 陈香兰(0512- ) Sprint 2011
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
临界区软件互斥软件实现算法 主讲教师:夏莹杰
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
从zval看PHP变量
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
第9章 虛擬記憶體 (virtual memory)
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
顺序表的删除.
续签协议&修改密码操作手册 GDP项目组 2019/01/30.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
Chapter 7 掌控記憶體.
作業系統 第三章 作業系統結構.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三421) Autumn 2007
信号量(Semaphore).
本节内容 Private Memory 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 7 掌控記憶體.
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
嵌入式操作系统 陈香兰 Fall 2009.
本节内容 线性地址的管理 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第 7 章 进程间的通信.
3.1私有内存的分配.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三421) Autumn 2007
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 导出表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
Presentation transcript:

中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Autumn 2010 Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512-87161312) xlanchen@ustc.edu.cn Autumn 2010

进程地址空间

内核态和用户态分配内存的不同 内核中的函数以直接了当的方式获得动态内存 内核是操作系统中优先级最高的成分。 内核信任自己 采用我们上次课介绍的页面级内存分配和小内存分配 物理内存:highmem 物理内存: DMA 物理内存: Normal 线性空间(<3GB) 线 性 空 间 ( 3GB~4GB) 2018/11/28 Linux OS analysis

内核态和用户态分配内存的不同 给用户态进程分配内存时 请求被认为是不紧迫的 用户进程不可信任 因此,当用户态进程请求动态内存时,并没有立即获得实际的物理页框,而仅仅获得对一个新的线性地址区间的使用权 这个线性地址区间会成为进程地址空间的一部分,称作线性区(memory areas) 2018/11/28 Linux OS analysis

进程地址空间 进程最多能访问4GB的线性地址空间 但进程在访问某个线性空间之前,必须获得该线性空间的许可 因此,一个进程的地址空间是由允许该进程访问的全部线性地址组成 内核使用线性区资源来表示线性地址空间 每个线性区由起始线性地址、长度和一些存取权限描述 2018/11/28 Linux OS analysis

与进程地址空间相关的描述符 2018/11/28 Linux OS analysis

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

与创建、删除线性区相关的系统调用 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 2018/11/28 Linux OS analysis

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

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

进程地址空间中所有有效的线性地址都确定的存在于一个area中 memory areas不重叠 进程中每个单独的area对应一个不同内存区: 堆栈、二进制代码、全局变量、文件映射等等 2018/11/28 Linux OS analysis

增加或删除一个线性区 2018/11/28 Linux OS analysis

task_struct中的内存描述符 Include/linux/sched.h : task_struct 参见include/linux/mm_types.h 主要数据项的说明参见ULK3中文版354页 2018/11/28 Linux OS analysis

分配一个内存描述符 copy_mm函数用来在fork()调用中从父进程拷贝内存描述符 其中间接调用mm_alloc_pgd来分配一个新的页表 而mm_struct数据结构本身的空间是从mm_cachep指向的slab缓存中通过allocate_mm()宏分配得到的 如果父进程在fork()创建子进程时,通过一些标志指明要和子进程共享地址空间。那么,只需要 do_fork copy_process copy_mm mm_alloc_pgd kernel/fork.c:copy_mm 2018/11/28 Linux OS analysis

释放一个内存描述符 在进程退出时,exit_mm()函数被调用 首先做一些清除工作,更新一些内核全局统计数据 kernel/exit.c: exit_mm 在进程退出时,exit_mm()函数被调用 首先做一些清除工作,更新一些内核全局统计数据 接着调用mmput(),这个函数减内存描述符的mm_users域 如果mm_users域变成了0,就调用mmdrop()函数来减mm_count域 如果mm_count域变成了0,就由free_mm()宏调用kmem_cache_free()函数把mm_struct返还给mm_cachp指向slab缓存 do_exit exit_mm Kernel/fork.c 2018/11/28 Linux OS analysis

线性区(memory areas) 每个线性区由一个vm_area_struct结构来表示 这个结构描述了一段给定的内存区间 include/linux/mm_types.h 每个线性区由一个vm_area_struct结构来表示 这个结构描述了一段给定的内存区间 区间中的地址都有同样的属性,比如同样的存取权限和相关的操作函数 用这个结构可以表示各种线性区,比如映射可执行的二进制代码的线形区、用作用户态堆栈的线形区等等 2018/11/28 Linux OS analysis

线性区的存取权限 vm_flags域描述有关这个线性区全部页的信息。例如,进程访问每个页的权限是什么。还有一些标志描述线性区自身,例如它应该如何增长 VM_READ, VM_WRITE, VM_EXEC VM_SHARED VM_RESERVED VM_GROWSUP include/linux/mm.h 2018/11/28 Linux OS analysis

线性区的链表和红黑树 通过内存描述符中的两个域mmap和mm_rb都可以访问线性区。事实上,它们都指向了同一个vm_area_struct结构,只是链接的方式不同 mmap指向的线性区链表用来遍历整个进程的地址空间 红黑树mm_rb用来定位一个给定的线性地址落在进程地址空间中的哪一个线性区中 mmap_cache用来缓存最近用过的线性区 2018/11/28 Linux OS analysis

处理线性区 内核进程需要对一个线性区进行处理,比如确定一个给定线性地址是否存在于一个线性地址空间中 find_vma(),查找一个线性地址 两个参数:进程内存描述符的地址mm和线性地址addr find_vma_intersection(),查找一个与给定地址区间重叠的线性区 get_unmapped_area(),查找一个空闲的地址区间 arch_get_unmapped_area shm_get_unmapped_area insert_vm_struct(),向内存描述符链表中插入一个线性区 mm/mmap.c include/linux/mm.h mm/mmap.c mm/mmap.c 2018/11/28 Linux OS analysis

static inline unsigned long do_mmap 创建一个线性区间 mmap()和do_mmap(),创建一个线性区 根据file参数映射指定的文件中偏移量为offset,长度为len的一段内容 addr参数指明从何处开始查找一段可用的空闲线性地址区间 Prot参数指定这个区间所包含的页的存取权限 flags参数指定这个创建的线性区本身的一些标志 include/linux/mm.h static inline unsigned long do_mmap (struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flag, unsigned long offset) 2018/11/28 Linux OS analysis

删除一个线性区间 munmap()和do_munmap() do_munmap()函数从进程地址空间中删除一段线性空间 mm参数指向了当前进程的内存描述符 addr参数为线性区的起始地址 len参数指明要删除的区间大小 mm/mmap.c int do_munmap (struct mm_struct *mm, unsigned long addr, size_t len) 2018/11/28 Linux OS analysis

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

缺页异常处理程序do_page_fault 缺页异常处理程序处理缺页异常。 它可以判断出这是不是一个合法的缺页异常,如果是,则负责给这段线性地址分配一些物理页框并把磁盘中对应的文件写入这些物理页框 这样进程得以正常运行。 2018/11/28 Linux OS analysis

Thanks! The end.