孟宁 电话: 主页:http://staff.ustc.edu.cn/~mengning

Slides:



Advertisements
Similar presentations
高校教师、高级项目经理 任铄 QQ : 第一章 操作系统引论 1.1 操作系统的目标和作用 1.2 操作系统的发展过程 1.3 操作系统的基本特性 1.4 操作系统的主要功能 1.5 OS 结构设计.
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Process Scheduling based on Linux3.2 孟宁 电话: 孟宁 V5 : 主页:
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
2017年3月5日 单片机原理与应用 背景知识调查.
2014年度企业所得税业务培训 蚌埠市地方税务局所得税科.
计算机体系结构 应用程序 软件 操作系统 编译器 固件 指令集 输入输出 CPU 硬件 内存 (I/O) 集成电路 元件,逻辑门.
实用操作系统概念 张惠娟 副教授 1.
企业所得税年度纳税申报表(2014年版)培训 国家税务总局公告2014年第63号
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
计算机基础知识 丁家营镇九年制学校 徐中先.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
第六章 运行时存储空间的组织和管理 术语 本章内容 讨论一个活动记录中的数据布局 程序执行过程中,所有活动记录的组织方式 过程的活动
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
SPI驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
中国科学技术大学计算机系 陈香兰(0512- ) Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0512- ) 助教:孟宁 Fall 2009
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
嵌入式操作系统 陈香兰 Spring 2008 中国科学技术大学计算机系.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
第 3 章、組合語言 作者:陳鍾誠 旗標出版社.
进程概念.
分裂对象模型 C++ otcl.
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
主讲:陈香兰 助教:贾永泉、毛熠璐 (西区电三421) Autumn 2007
本节内容 代码跨段 本质就是修改CS段寄存器 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
iSIGHT 基本培训 使用 Excel的栅栏问题
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 通用寄存器 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
Lab2 系统调用
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

操作系统原理相关基础知识 Basic knowledge of Operating Systems Principles based on X86/Linux 孟宁 电话:0512-68839302 腾讯微博:@mengning997 新浪微博:@孟宁V E-mail:mengning@ustc.edu.cn 主页:http://staff.ustc.edu.cn/~mengning 地址:苏州工业园区独墅湖高等教育区仁爱路166号明德楼A302室 2012年2月

Agenda 操作系统的基本概念 典型的Linux操作系统的结构 最简单也是最复杂的操作 堆栈 用户态 vs 内核态 虚拟内存

操作系统的基本概念 任何计算机系统都包含一个基本的程序集合,称为操作系统。 操作系统的目的 内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网络部分) 其他程序(例如函数库、shell程序、系统程序等等) 操作系统的目的 与硬件交互,管理所有的硬件资源 为用户程序(应用程序)提供一个良好的执行环境

典型的Linux操作系统的结构 用户应用程序 Shell,lib System call Kernel implementation 对硬件资源的管理

最简单也是最复杂的操作 在控制台下输入ls命令 Shell程序分析输入参数,确定这是ls命令 为什么我们敲击键盘就会在终端上显示? 中断的概念,终端控制台设备驱动的概念 Shell程序分析输入参数,确定这是ls命令 终端解释程序 什么是shell? 保护模式和实模式,内存保护,内核态用户态相关问题 什么是系统调用? 调用系统调用fork生成一个shell本身的拷贝 软中断、异常的概念。陷阱门,系统门 系统调用是怎么实现的? 进程的描述,进程的创建。COW技术 fork是什么? 为什么要调用fork? 调用exec系统调用将ls的可执行文件装入内存 内存管理模块,进程的地址空间,分页机制,文件系统 堆栈的维护,寄存器的保存与恢复 从系统调用返回 如何做到正确的返回? 进程的调度,运行队列等待队列的维护 Shell和ls都得以执行

堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 C语言编译器对堆栈的使用有一套的规则 函数调用框架 传递参数 保存返回地址 提供局部变量空间 等等 C语言编译器对堆栈的使用有一套的规则 了解堆栈存在的目的和编译器对堆栈使用的规则是理解操作系统一些关键性代码的基础

堆栈寄存器和堆栈操作 堆栈相关的寄存器 堆栈操作 ebp在C语言中用作记录当前函数调用基址 esp,堆栈指针(stack pointer) ebp,基址指针(base pointer) 堆栈操作 push 栈顶地址减少4个字节(32位) pop 栈顶地址增加4个字节 ebp在C语言中用作记录当前函数调用基址 低地址 esp esp ebp 高地址

利用堆栈实现函数调用和返回 其他关键寄存器 cs : eip:总是指向下一条的指令地址 顺序执行:总是指向地址连续的下一条指令 call:将当前cs : eip的值压入栈顶,cs : eip指向被调用函数的入口地址 ret:从栈顶弹出原来保存在这里的cs : eip的值,放入cs : eip中 发生中断时?

函数的堆栈框架 //建立被调用者函数的堆栈框架 pushl %ebp movl %esp, %ebp // 调用者 //拆除被调用者函数的堆栈框架 movl %ebp,%esp popl %ebp ret // 调用者 … call target //被调用者函数体 //do sth. … call指令: 1)将下一条指令的地址A保存在栈顶 2)设置eip指向被调用程序代码开始处 将地址A恢复到eip中

函数堆栈框架的形成 call xxx 进入xxx 退出xxx 执行call之前 执行call时,cs : eip原来的值 指向call下一条指令,该值被 保存到栈顶,然后cs : eip的值 指向xxx的入口地址 进入xxx 第一条指令: pushl %ebp 第二条指令: movl %esp, %ebp 函数体中的常规操作,可能会压栈、出栈 退出xxx movl %ebp,%esp popl %ebp ret esp ebp 低地址 esp ebp esp cs : eip esp ebp 高地址

一段小程序 源文件:test.c 这是一个很简单的C程序 main函数中调用了函数p1和p2 首先使用gcc –g 生成test.c的可执行文件test 然后使用objdump –S获得test的反汇编文件

观察p2的堆栈框架 从test的反汇编文件中找到p2的反汇编代码 int p2(int x,int y) { push %ebp mov %esp,%ebp return x+y; mov 0xc(%ebp),%eax add 0x8(%ebp),%eax } pop %ebp ret 建立框架 低地址 ebp esp ebp esp 调用者 堆栈 框架 x 拆除框架 y ebp 高地址

如何传递参数给p2的 esp 被调用者 堆栈 框架 ebp ebp 低地址 cs:eip esp x的值 esp y的值 esp 调用者 … z=p2(x,y); pushl 0xfffffff8(%ebp) pushl 0xfffffff4(%ebp) call 804839b <p2> add $0x8,%esp mov %eax,0xfffffffc(%ebp) printf("%d=%d+%d\n",z,x,y); pushl 0xfffffffc(%ebp) push $0x8048510 call 80482b0 <printf@plt> 被调用者 堆栈 框架 ebp ebp 低地址 cs:eip esp x的值 esp y的值 esp 调用者 堆栈 框架 ebp 高地址 p2的返回值是如何返回给main的?

观察main中的局部变量 int main(void) { push %ebp mov %esp,%ebp sub $0x18,%esp … char c='a'; movb $0x61,0xfffffff3(%ebp) int x,y,z; x=1; movl $0x1,0xfffffff4(%ebp) y=2; movl $0x2,0xfffffff8(%ebp) 低地址 esp c=‘a’ x=1 y=2 ebp esp ebp esp 调用者 ebp 高地址

观察程序运行时堆栈的变化 eip eip esp p1的堆栈 p2堆栈 eip eip eip eip eip c eip esp x,y main … p1(c) p2(x,y) eip eip eip eip main c eip esp x,y eip main堆栈 eip eip eip eip 堆栈 程序的代码段

三级函数调用程序 在这个小程序中,main函数中调用了函数p2,而在p2的执行过程中又调用了函数p1

观察程序运行时堆栈的变化 eip esp p1堆栈 eip eip eip eip eip c esp eip p2堆栈 eip eip … p1(c) eip eip eip p2 eip c esp eip p2堆栈 eip eip main … p2(x,y) eip x,y esp eip eip main main堆栈 eip 堆栈 程序的代码段

什么是用户态和内核态? 一般现代CPU都有几种不同的指令执行级别 而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动 举例: intel x86 CPU有四种不同的执行级别0-3,Linux只使用了其中的0级和3级分别来表示内核态和用户态

如何区分用户态和内核态? cs寄存器的最低两位表明了当前代码的特权级 CPU每条指令的读取都是通过cs:eip这两个寄存器: 其中cs是代码段选择寄存器,eip是偏移量寄存器。 上述判断由硬件完成 一般来说在Linux中,地址空间是一个显著的标志:0xc0000000以上的地址空间只能在内核态下访问,0x00000000-0xbfffffff的地址空间在两种状态下都可以访问 注意:这里所说的地址空间是逻辑地址而不是物理地址

用户态 vs 内核态 寄存器上下文 中断/int指令会在堆栈上保存一些寄存器的值 从用户态切换到内核态时 必须保存用户态的寄存器上下文 要保存哪些? 保存在哪里? 中断/int指令会在堆栈上保存一些寄存器的值 如:用户态栈顶地址、当时的状态字、当时的cs:eip的值

保护现场和恢复现场

虚拟内存 物理内存有限,是一种稀缺资源 局部性原理 空间局部性 时间局部性 按需调页 页框 利用磁盘上的交换空间

进程的虚拟地址空间 独立的地址空间(32位,4GB),每个进程一个 在Linux中,3G以上是内核空间,3G以下是用户空间 页面大小:4KB 页目录、页表 若对应的内容在内存中,则对应的二级页表项记录相应的物理页框信息 否则根据需要进行装载或者出错处理 进程调度后,执行一个新的被调度的进程之前,要先进行页表切换

Linux中的内核空间 每个进程3G以上的空间用作内核空间 从用户地址空间进入内核地址空间不经过页表切换 而是通过中断/异常/系统调用入口(也只能如此)

站在CPU执行指令的角度 CPU idle wait keyborad queue 进程x 系统调用处理 eip esp cs ds等等 进程管理 Wakeup progress esp 中断处理 idtr eip 内核其他模块 esp intr 0xc0000000 8259 some action c=gets() … esp keyboard main 进程x

从内存的角度来看 0xffffffff 0xe0000000 0x20000000 (512M) 0xc0000000 (3G) 在Linux中,物理内存 总是被映射在3G以上 的空间中, 若物理内存过大,需 使用其他的映射技术 0x20000000 (512M) 0xc0000000 (3G) 用户代码或数据 0x00400000 内核代码 内核静态数据 0x00000000 0x00000000 物理内存 虚拟空间

Homework C语言中堆栈的作用是什么?请使用一个实例说明C语言中堆栈的某一个作用。 为什么要有内核态与用户态的区别?请结合32位x86说明在Linux中,用户态与内核态有哪些区别?在什么情况下,系统会进入内核态执行?

“有两种生成一个软件设计方案的途径:一个是把它做得如此简单,以致于明显不会有漏洞存在。另一个是把它做的如此复杂,以致于不会有明显的漏洞存在。”——Tony Hoare 谢谢大家! 参考资料: 《深入理解Linux内核》第三版