Linux内核源代码导读 中国科学技术大学计算机系 陈香兰(0551- )

Slides:



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

定 格 入 格 破 格 —— 新诗仿写复习训练 仿照下列句子,再把 “ 人生 ” 比喻成 “ 大海 ”“ 天空 ” , 造两个句子。 如果说人生是一首优美的乐曲,那么痛苦则 是其中一个不可或缺的音符。 参考答案: 1 、如果说人生是一望无际的大海,那么挫折则 是其中一个骤然翻起的浪花。 2 、如果说人生是一片湛蓝的天空,那么失意则.
《微型计算机技术 及应用》 ( 第 4 版) —— 戴梅萼 史嘉权. 目标 深刻理解 牢固掌握 灵活应用.
© 2001 孟静制作 版权所有 第二章 CPU 管理和进程、线程管理 2.1 CPU 管理概述 2.2 进程管理 2.3 进程模型实例分析 :UNIX 早期版本的 CPU 管理 子系统 ( 进程模型 ) 2.4 处理机管理实例分析 (2):linux CPU 管理(进程 模型) 2.5 线程模型.
进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(
第 13 章 基于 proc 的 Linux 进程控制块 信息读取 山东科技大学操作系统教研组. 理解 proc 伪文件系统的基本概念和功能,掌握常见操作命令。 了解 Linux 进程控制块 task_strcut ,并理解其重要成员变量的含义。 理解基于 seq_file 机制的 proc 伪文件操作机制.
高等动物的 个体发育 作者:游隆信 松阳一中 二零零二年三月 被子植物子房的结构 及双受精过程 胚珠的结构 花粉管 精 子 卵细胞 极 核 子房壁 珠 被 珠 孔.
投資 & 購屋置產 報告 ( 課程 : 個人理財規劃 ) 授課老師 : 許秀鶴 授課老師 : 許秀鶴 報告學生 : 報告學生 : 許文耀 學號 : 許文耀 學號 : 張慧珍 學號 : 張慧珍 學號 : Next 個人簡介.
有教無類 因材施教 適性揚才 多元進路 優質銜接
語文教學 教學理念 竹大附小 陳枝田 將地方圖案插入此投影片 選取〔插入〕功能表 〔圖片〕指令 選取〔從檔案〕指令 選取你的標幟圖片檔案
第三章及第四章資產負債表的重點整理 取材自1.課本 2.鄭丁旺中會第九版 3.營業員題庫重點.
第 20 章 檢視系統資訊.
第九课 第二框 建设社会主义精神文明.
二月春风似剪刀, 这些变化得瞧瞧 主讲老师:王海 2016年1月27日20:00 YY频道:
让我们撑起一把青春伞.
让 我 们 撑 起 一 把 青 春伞.
目錄 服務地點 南寮 世光教養院 飛鳳山 長安養老院 尖石國小 內灣 大華停車場 上智國小 二重國中 班級 領隊教師 參與人數 (人次)
開南大學 資訊管理學系 學分學程相關說明.
“三生教育”专题 生命·生存·生活.
新建本科院校 应用型人才培养若干问题探析 张德江.
什么是工业? 采取自然物质资源,制造生产资料 、生活资料,或对农产品、半成品进行加工的生产事业。
報告人 方萱玉 100上學期教學組業務報告.
第十章 UNIX系统内核结构 10.1 UNIX系统概述 10.2 进程的描述和控制 10.3 进程的同步与通信 10.4 存储器管理
龙芯多媒体电脑教室培训 龙梦极域电子教室 江苏龙芯梦兰科技股份有限公司.
門神 在傳統觀念中,門是居住環境中與外界相通的出入口,具有重要的屏障作用。門神顧名思義就是護宅守門的神仙,每逢過年,上至天子百官下至普通百姓,家家戶戶必在門上張貼門神,以保一家平安。 門神種類主要有宅第大門上將軍武門神、內室門戶上祈福文門神,還有童子門神、仙子門神等,形象豐富多樣,皇家貴戚還往往在畫上瀝粉貼金,十分吉祥喜慶。
兒童及少年保護宣導 和興國小校長 吳柚 中華民國 100 年 8 月 31日 2008張淑慧.
裘錦秋中學(屯門) 圖書館課 第二課 從閱讀中學習 – 閱讀的好處.
Next 三個士兵,拖著腳步,走在陌生鄉下的路上。他們剛打完仗從戰場走路回家。他們很累,肚子又餓。實際上,他們已經兩天沒有吃東西了。
美学概论 主讲教师 孙建章 沈阳电大文法系.
香港普通話研習社科技創意小學 周順強老師.
北角官立上午小學 小班教學在北官.
寻觅节日诗情.
消 息 制作教师:程焕新 湖北省黄冈高级技工学校.
教學PPT 李美娟製作 歡迎全校老師、同學自行copy
12年國教前哨站 談適性輔導及免試入學 12年國教前哨站 談適性輔導及免試入學 主講人:龍門國中王意蘭 校長 輔導主任 潘姿伶.
第六节 管道仪表流程图的绘制 (一)图样的内容 (二)PID的图面布置 (三)PID的绘制要点 (四)读图举例 (五)绘制步骤
Chapter 6 時序.
股市不傳之秘 甘氏矩陣圖/價格推算 簡介、基礎學習步驟 1、學習觀念 2、基礎看圖法 A.大數推算 B.基礎角度線推算.
走向自立人生 自己的事情自己干 一、自立人生少年始. 走向自立人生 自己的事情自己干 一、自立人生少年始.
3.实行基层民主自治的意义   ①实行基层民主自治,以保证人民群众 依法直接行使民主权利,管理基层公共事务 和公益事业,是人民当家作主最有效的途径。   ②是社会主义民主最为广泛而深刻的实践,也是发展社会主义民主的基础性工作。
認識同志伴侶 劉安真 弘光科技大學通識教育中心助理教授.
祖 父 母 節.
第4章 需求分析 教学目的:了解需求分析的任务和步骤、评审标准和过 程,掌握基本技术,理解需求规格说明书的 作用与组成。
第8章低功耗设计问题 功耗问题是近几年来人们在嵌入式系统的设计中普遍关注的难点和热点,它严重地制约着嵌入式系统的应用与发展。
嵌入式操作系统 陈香兰 Fall 2009.
C H A P T E R 11 体系结构对操作系统的支持.
中国科学技术大学计算机系 陈香兰(0512- ) spring 2011
第十五章 Linked List, Stack and Queue
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2009
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
Process management(程序管理)
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
中国科学技术大学计算机系 陈香兰(0512- ) Sprint 2011
中国科学技术大学计算机系 陈香兰(0512- ) 助教:孟宁 Fall 2009
第五章 中断与异常 中断的基本知识 中断描述符表的初始化 中断处理 中断的下半部处理机制 中断的应用-时钟中断.
資料結構 第4章 堆疊.
第2章 进程管理 2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程
Linux Debugging ls,ps,top,etc. printk() /proc i386提供的调试机制(断点,信号,单步执行)
資料結構與C++程式設計進階 實作練習 講師:林業峻 CSIE, NTU 6/ 24, 2010.
用牛顿环测量透镜的曲率半径 华中农业大学应用物理系 物理实验教学中心
主題四: 教育發展與大學學群 報告人: 張明敏老師.
第一章:導論(方法、標準及工作設計) 第二章:解決問題的工具 工作研究課程介紹 RT)及工作場所分析指南以選定計畫。
University of New Mexico
Computer Science & Information Management
厦门大学数据库实验室 2014暑期奋战70天总结 罗道文
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
03/03/2019 豐盛生命的呼召 楊知予長老.
县级支中心 乡镇基层服务点的建设 朱 庆 华.
Presentation transcript:

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

进程(任务管理)

主要内容 进程描述符 进程切换 进程的创建和删除 2019/4/8 Linux内核源代码导读

进程的概念 进程是执行程序的一个实例 进程和程序的区别 几个进程可以并发的执行一个程序 一个进程可以顺序的执行几个程序 2019/4/8 Linux内核源代码导读

进程描述符 为了管理进程,内核必须对每个进程进行清晰的描述。 进程描述符提供了内核所需了解的进程信息 源码include/linux/sched.h定义 struct task_struct 数据结构很庞大 2019/4/8 Linux内核源代码导读

stack 2019/4/8 Linux内核源代码导读

Linux2.6进程的状态 简单过一下,与状态相关的一些宏 1)组合状态 2)状态判断 3)状态设置 2019/4/8

进程状态转换图 EXIT_ZOMBIE或者 EXIT_DEAD 或者 TASK_DEAD 2019/4/8 Linux内核源代码导读

标识一个进程 使用进程描述符地址 使用PID (Process ID,PID) 进程和进程描述符之间有非常严格的一一对应关系,使得用32位进程描述符地址标识进程非常方便 使用PID (Process ID,PID) 每个进程的PID都存放在进程描述符的pid域中 2019/4/8 Linux内核源代码导读

进程和进程的内核堆栈 Linux为每个进程分配一个8KB大小的内存区域,用于存放该进程两个不同的数据结构: Thread_info 进程处于内核态时使用 不同于用户态堆栈 内核控制路径所用的堆栈 很少,因此对栈和描述符 来说,8KB足够了 Thread_info 2019/4/8 Linux内核源代码导读

Thread_union C语言允许用如下的一个union结构来方便的表示这样的一个混合体 2019/4/8 Linux内核源代码导读

Thread_info的分配/回收/访问 进程描述符的分配/回收/访问 Thread_info的分配/回收/访问 alloc_thread_info free_thread_info 2019/4/8 Linux内核源代码导读

2019/4/8 Linux内核源代码导读

从当前内核堆栈获得当前thread_info 根据thread_info描述符和内核态堆栈之间的配对,内核可以很容易的从esp寄存器的值获得当前在CPU上运行的进程的描述符指针 因为这个内存区是8KB=213大小,内核必须做的就是让esp有13位的有效位,以获得thread_info的基地址 2019/4/8 Linux内核源代码导读

current宏进程描述符 2019/4/8 Linux内核源代码导读

把per_cpu__current_task, 取出返回 需要找到该参数的赋值之处!! 2019/4/8 Linux内核源代码导读

考虑对应的x86_write_percpu的使用情况 在__switch_to中被调用 2019/4/8 Linux内核源代码导读

Current宏的使用 Current宏可以看成当前进程的进程描述符指针,在内核中直接使用 比如current->pid返回在CPU上正在执行的进程的PID 2019/4/8 Linux内核源代码导读

进程的PID 进程的pid字段 Pid最大值 2019/4/8 Linux内核源代码导读

Pid的管理和分配 创建一个进程时, Pid名字空间 do_forkcopy_processalloc_pid Struct pid的cache 2019/4/8 Linux内核源代码导读

Pid位图 Pid数据结构 对pid名字空间: 2.6内核为PID专门引入了一个数据结构,Why? 独立的进程;进程组;sessions 考虑进程的删除和创建 2019/4/8 Linux内核源代码导读

最初的pid名字空间 在start_kernel中,调用pidmap_init进行合理的初始化 在kernel_init中,被修改为init进程 2019/4/8 Linux内核源代码导读

分配第一个位图页 初始化struct pid的cache 2019/4/8 Linux内核源代码导读

2.6内核为PID专门引入了一个数据结构 Why? 独立的进程;进程组;sessions 使用pid数字的注意之处 考虑进程的删除和创建 2019/4/8 Linux内核源代码导读

阅读alloc_pid、 alloc_pidmap函数 2019/4/8 Linux内核源代码导读

进程链表 为了对给定类型的进程(比如所有在可运行状态下的进程)进行有效的搜索,内核维护了几个进程链表 所有进程链表 在进程描述符中: 2019/4/8 Linux内核源代码导读

进程链表中的插入和删除 使用常规list数据结构操作 2019/4/8 Linux内核源代码导读

list_add list_add_tail list_del list_move list_empty list_for_each list_for_each_prev list_for_each_safe list_for_each_entry … 2019/4/8 Linux内核源代码导读

例如,在do_fork调用的copy_process中 for_each_process宏扫描整个进程链表 RCU read copy update 2019/4/8 Linux内核源代码导读

const struct sched_class,调度类 TASK_RUNNING状态的进程组织 对可运行队列的一些操作函数 底层:常规的list数据结构操作 入列出列等操作: dequeue_task enqueue_task const struct sched_class,调度类 rt_sched_class fair_sched_class idle_sched_class 每个cpu有一个运行队列 关于调度的描述, 参见sched_coding.txt和 sched-design-CFS.txt 2019/4/8 Linux内核源代码导读

运行队列数据结构 2019/4/8 Linux内核源代码导读

struct cfs_rq 红黑树 2019/4/8 Linux内核源代码导读 ……

struct rt_rq 基于优先级的运行队列 …… 2019/4/8 Linux内核源代码导读

2019/4/8 Linux内核源代码导读

2019/4/8 Linux内核源代码导读

调度类 阅读调度类sched_class的定义源码 找到主要与运行队列有关的 Idle相关:idle_sched_class Fair相关 enqueue_task、dequeue_task Idle相关:idle_sched_class no enqueue/yield_task for idle tasks dequeue_task_idle Fair相关 enqueue_task_fair dequeue_task_fair Rt相关 enqueue_task_rt dequeue_task_rt 2019/4/8 Linux内核源代码导读

Idle类特殊 2019/4/8 Linux内核源代码导读

Fair类 进而查看 1)enqueue_entity 2)__enqueue_entity (红黑树) 3)sched_entity结构 4) struct rq 5)struct cfs_rq Completely Fair Scheduler 完全公平调度 2019/4/8 Linux内核源代码导读

Rt类 进而查看: 1)enqueue_rt_entity 2)__enqueue_rt_entity 每个cpu有一个队列 3)sched_rt_entity 4)struct rq 5)struct rt_rq 6) struct rt_prio_array 2019/4/8 Linux内核源代码导读 优先级队列

激活一个任务 activate_task 相对的:deactivate_task 2019/4/8 Linux内核源代码导读

pidhash表及链接表 在一些情况下,内核必须能从进程的PID得出对应的进程描述符指针。例如kill系统调用 初始化:pidhash_init Task_struct中: 2019/4/8 Linux内核源代码导读

pidhash表及链接表 2019/4/8 Linux内核源代码导读

进程之间的亲属关系 程序创建的进程具有父子关系,在编程时往往需要引用这样的父子关系。进程描述符中有几个域用来表示这样的关系 2019/4/8 Linux内核源代码导读

等待队列 当要把除了TASK_RUNNING状态之外的进程组织在一起时,linux使用了等待队列 TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程再分成很多类,每一类对应一个特定的事件。在这种情况下,进程状态提供的信息满足不了快速检索,因此,内核引进了另外的进程链表,叫做等待队列 等待队列在内核中有很多用途,尤其是对中断处理、进程同步和定时用处很大 2019/4/8 Linux内核源代码导读

等待队列使得进程可以在事件上的条件等待,并且当等待的条件为真时,由内核唤醒它们 等待队列由循环链表实现 阅读相关的宏 2019/4/8 Linux内核源代码导读

在等待队列上内核实现了一些操作函数 add_wait_queue add_wait_queue_exclusive remove_wait_queue 2019/4/8 Linux内核源代码导读

进程等待 等待一个特定事件的进程能调用下面几个函数中的任一个 进程等待由需要等待的进程自己进行(调用) sleep_on sleep_on_timeout interruptible_sleep_on interruptible_sleep_on_timeout 进程等待由需要等待的进程自己进行(调用) 2019/4/8 Linux内核源代码导读

sleep_on 相当于 阅读实际的sleep_on代码 2019/4/8 Linux内核源代码导读

此外,还可能按照如下方式进行sleep 2019/4/8 Linux内核源代码导读

例如事件等待wait_event__wait_event 等待,直到事件发生(有效,或…) 2019/4/8 Linux内核源代码导读

进程的唤醒 利用wake_up或者wake_up_interruptible等一系列的宏,都让插入等待队列中的进程进入TASK_RUNNING状态 2019/4/8 Linux内核源代码导读

__wake_up __wake_up_common 间接 default_wake_function try_to_wake_up activate_task 2019/4/8 Linux内核源代码导读

进程切换(process switching) 为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换,任务切换,上下文切换 2019/4/8 Linux内核源代码导读

进程上下文 包含了进程执行需要的所有信息 用户地址空间 包括程序代码,数据,用户堆栈等 控制信息 进程描述符,内核堆栈等 硬件上下文 2019/4/8 Linux内核源代码导读

尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。 硬件上下文 尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。 因此,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。这样才能正确的恢复一个进程的执行 硬件上下文: 进程恢复执行前必须装入寄存器的一组数据 包括通用寄存器的值以及一些系统寄存器 通用寄存器 系统寄存器 2019/4/8 Linux内核源代码导读

在linux中 一个进程的上下文主要保存在thread_info, task_struct的thread_struct中,其他信息放在内核态堆栈中 2019/4/8 Linux内核源代码导读

thread_info 2019/4/8 Linux内核源代码导读

Thread_struct …… 2019/4/8 Linux内核源代码导读

Pt_regs 2019/4/8 Linux内核源代码导读

上下文切换 switch_to宏执行进程切换,schedule()函数通过调用context_switch,间接调用这个宏一调度一个新的进程在CPU上运行 switch_to利用了prev和next两个参数: prev:指向当前进程 next:指向被调度的进程 2019/4/8 Linux内核源代码导读

进程切换的关键语句 堆栈的切换 从此,内核对next的内核态堆栈操作,因此,这条指令执行从prev到next真正的上下文切换,因为thread_info和内核态堆栈紧密联系在一起,改变内核态堆栈就意味改变当前thread_info 2019/4/8 Linux内核源代码导读

什么时候next进程真正开始执行呢? 2019/4/8 Linux内核源代码导读

?哪里切换了进程的地址空间 2019/4/8 Linux内核源代码导读