Lab2 系统调用 2016-3-21.

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
深入理解Windows 2000 陈香兰 2006年9月.
第2章 微处理器 2.1 概述 /8086微处理器 微处理器 X86/Pentium微处理器
孟宁 电话: 主页:
第七章 异常控制流 CPU控制流的概念 进程上下文切换 异常和中断的基本概念 异常和中断的响应和处理
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第8章 现代微型计算机 x86系列微处理器 8.2 微型计算机体系结构 8.3 存储管理技术 8.4 多任务管理与I/O管理
第一章 概述.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
第7章 中断与异常.
Hadoop I/O By ShiChaojie.
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
学习前的准备工作 讲师:burning.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
操作系统实验 lab1-系统引导
S 数控机床故障诊断与维修.
第五章,抢占式调度(lab3).
嵌入式操作系统 陈香兰 Spring 2008 中国科学技术大学计算机系.
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
如何生成设备节点 广州创龙电子科技有限公司
CPU结构和功能.
第五章 中断与异常 中断的基本知识 中断描述符表的初始化 中断处理 中断的下半部处理机制 中断的应用-时钟中断.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
中 断 王 静 阜阳师范学院 计算机与信息工程学院.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
K60入门课程 02 首都师范大学物理系 王甜.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 代码跨段 本质就是修改CS段寄存器 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
信号量(Semaphore).
本节内容 内存复制指令 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
微型计算机原理与接口技术 (第2版) 赵宏伟 于秀峰 黄永平 秦贵和 北京:科学出版社 出版 吉林大学计算机科学与技术学院 制作.
iSIGHT 基本培训 使用 Excel的栅栏问题
第十章 输入输出程序设计 10.1 输入输出指令 输入输出(I/O)是指CPU与输入设备和输出设备之间进行的信息传送。CPU与外部设备之间通过输入输出接口相连接。各个设备在输入输出接口中分配了相应的端口。访问不同的设备就是访问其对应的端口。在指令系统中提供了访问输入输出端口的指令。 一、I/O端口寻址方式.
本节内容 线性地址的管理 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
HSC高速输出例程 HORNER APG.
微机原理与接口技术 ——8086微处理器 西安邮电大学 计算机学院 范琳.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第12章 中断 罗文坚 中国科大 计算机学院
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
24 or 1024? PWN Jawbone Up24 手环.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第四章 UNIX文件系统.
第十七讲 密码执行(1).
上节复习(11.7) 1、定时/计数器的基本原理? 2、定时/计数器的结构组成? 3、定时/计数器的控制关系?
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
本节内容 任务段 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
DSP技术与应用 电子与信息技术系.
Presentation transcript:

Lab2 系统调用 2016-3-21

Lab1实验提交 总人数: 134 提交人数: 98 未提交(草稿): 23 未提交: 13 3月15日前提交者加分10% 未提交(草稿)减分10% 未提交只有10%

Lab1实验提交 提交后无法更改? 要有信心 学会慎重 后悔药? 没有! 网站规定

Lab1实验问题 perl 脚本可执行权限问题 GDB调试断点 chmod +x utils/genboot.pl 右击 properties, is excutable GDB调试断点 编译选项 –ggdb file filename break function

目录 实验内容 IA-32中断机制 系统调用 加载用户程序 实现库函数

实验内容

实验内容 内核: 建立完整的系统调用机制, 实现系统 调用putc 库: 基于putc系统调用实现库函数printf(格式 化输出)

实验内容 从实模式进入保护模式 加载内核到内存某地址并跳转运行 初始化中断向量表 初始化 GDT 表 配置 TSS 段 进入用户空间前的相关配置 正式进入用户空间 调用库函数 printf

IA-32中断机制

IA-32中断机制 内核的一个主要功能就是处理硬件外设I/O 处理器速度一般比外设快很多 内核必须处理其他任务,只有当外设真正完成了准备 好了时CPU才转过来处理外设IO IO方式: 轮询、中断、DMA等 轮询方式效率不高 中断机制就是满足上述条件的一种解决办法

IA-32中断机制 中断(广义)会改变处理器执行指令的顺序,通 常与CPU芯片内部或外部硬件电路产生的电信号 相对应 中断——异步的: 由硬件随机产生,在程序执行的任何时候可能出现 异常——同步的: 在(特殊的或出错的)指令执行时由CPU控制单元产 生 Exception在i386中与trap是一个意思,但中文翻译的 时候往往翻译成异常或陷阱,其实也是一个意思

中断 中断分为: 可屏蔽中断(Maskable interrupt) 非屏蔽中断(Nonmaskable interrupt) I/O设备发出的所有中断请求(IRQ)都可以产生可屏蔽 中断。 可屏蔽中断可以处于两种状态:屏蔽的(masked)和非 屏蔽的(unmasked) 非屏蔽中断(Nonmaskable interrupt) 只有几个特定的危急事件才引起非屏蔽中断。如硬件 故障或是掉电

中断 非屏蔽中断与可屏蔽中断

中断 CPU可以将屏蔽所有的可屏蔽终端 Eflags中的IF标志: 0=关中断; 1=开中断。 内核中使用cli和sti指令分别清除和设置该标志

异常 异常分为: 处理器探测异常 编程异常 由CPU执行指令时探测到一个反常条件时产生,如溢出、 除0错等 由编程者发出的特定请求产生,通常由int类指令触发 通常叫做“软中断” 例如系统调用

异常 对于处理器探测异常,根据异常时保存在 内核堆栈中的eip的值可以进一步分为: 故障(fault):eip=引起故障的指令的地址 通常可以纠正,处理完异常时,该指令被重新执行 例如缺页异常 陷阱(trap):eip=随后要执行的指令的地址。 异常中止(abort):eip=??? 发生严重的错误。eip值无效,只有强制终止受影响 的进程

中断向量 每个中断和异常由0~255之间的一个数(8位)来 标识,Intel称其为中断向量。 非屏蔽中断的向量和异常的向量是固定的 可屏蔽中断的向量可以通过对中断控制器的编程来改变 在保护模式下, 中断向量表由 IDT(中断描述符表)代替 IDT 也是描述符表, 其中的一个描述符即门描述符 IDT 将一个中断向量与一个描述符对应

中断向量 保护模式下的中断和异常

中断描述符表 中断描述符表是一个系统表,它与每一个中断或 者异常向量相联系 CPU的idtr寄存器指向IDT表的物理基地址 每个向量在表中有相应的中断或者异常处理程序的入口 地址。 每个描述符8个字节,共256项,占用空间2KB 内核在允许中断发生前,必须适当的初始化IDT CPU的idtr寄存器指向IDT表的物理基地址 lidt指令

门描述符 中断门和陷阱门 任务门不考虑 进入陷阱门时, 系统不会进入关中断

中断和异常的处理 异常或中断的设计是为了实现从用户态到核态的 转换,同时实现对特权级代码的保护 i386采用两个机制来实现这一目标:IDT和TSS IDT(Interrupt Descriptor Table)制定了256个中断 入口,其中前32个用于异常(traps或exceptions), 后面的(中断号>31)用于异步中断(interrupts)的处 理。 用户程序在运行过程中产生异常或者中断后,需 要将产生中断的地方存储起来,以便在处理完中 断后返回,可是存在什么地方呢?这里就要用到 TSS(Task State Segment)

TSS(Task Statement Segment) 本来Intel设计TSS的初衷是想通过这个段,来实现操作 系统中多任务的切换 但使用这个切换任务,会占用很多CPU的时间,并且打 破CPU的流水。因而,Linux和Windows都没有采用 TSS用作切换任务 TSS记录着“I/O权限位图”。另外TSS中还记录着0-2 环的esp和ss寄存器。当外环(如ring3)进入内环(如ring0) 时,会自动加载TSS中内环的esp和ss。那为什么tss没 有记录ring3的esp和ss呢?这是因为,外环进入内环时, 会将这些压入堆栈。当从内环返回外环时,从堆栈中恢 复就可以了

TSS TSS 的结构 你只需要关注 ss 和 esp 当从ring 3到ring 0的过程中, 会将断点通过压栈存储到 ss0 和 esp0 指向的堆栈空 间

中断和异常的硬件处理 1. 确定与中断或者异常关联的向量i(0~255) 2. 读idtr寄存器指向的IDT表中的第i项 3. 从gdtr寄存器获得GDT的基地址,并在GDT中查找, 以读取IDT表项中的段选择符所标识的段描述符 4. 确定中断是由授权的发生源发出的。 中断:中断处理程序的特权不能低于引起中断的程序的 特权(对应GDT表项中的DPL vs CS寄存器中的CPL) 编程异常:还需比较CPL与对应IDT表项中的DPL

中断和异常的硬件处理 5. 检查是否发生了特权级的变化,一般指是否由用户 态陷入了内核态。 如果是由用户态陷入了内核态,控制单元必须开始 使用与新的特权级相关的堆栈 a,读tr寄存器,访问运行进程的tss段 b,用与新特权级相关的栈段和栈指针装载ss和esp寄存器。 这些值可以在进程的tss段中找到 c,在新的栈中保存ss和esp以前的值,这些值指明了与旧特 权级相关的栈的逻辑地址

中断和异常的硬件处理 6. 若发生的是故障,用引起异常的指令地址修改cs和 eip寄存器的值,以使得这条指令在异常处理结束 后能被再次执行 7. 在栈中保存eflags、cs和eip的内容 8. 如果异常产生一个硬件出错码,则将它保存在栈中

堆栈变化 发生中断或异常后堆栈的变化

中断和异常的硬件处理 9. 装载cs和eip寄存器,其值分别是IDT表中 第i项门描述符的段选择符和偏移量字段。 这对寄存器值给出中断或者异常处理程序的 第一条指定的逻辑地址

中断和异常的跳转

系统调用

系统调用 我们在这里用中断一词代表了多个概念, 其 中包括了系统调用 系统调用号和中断号进行区分 因此系统调用你也可以像中断处理一样实现 中断号: IDT 表中的索引 系统调用号: 函数的标识符 因此系统调用你也可以像中断处理一样实现

系统调用 你可以将所有系统调用使用 int 0x80 号中断 进行处理, 当然你需要输入一些参数: 实际的值 用户态进程地址空间的变量的地址 甚至是包含指向用户态函数的指针的数据结构的 地址 每个系统调用至少应该有一个参数, 即系统 调用号, 以确定将要调用哪个函数处理 Lab2 不要求一定以何种方式完成库函数的 实现

系统调用 一般系统调用都需要多余一个参数 普通C函数的参数传递是通过把参数值写入堆栈(用 户态堆栈或内核态堆栈)来实现的。但因为系统调 用是一种特殊函数,它由用户态进入了内核态,所 以既不能使用用户态的堆栈也不能直接使用内核态 堆栈

系统调用 我们在 do_irq.S 中将各个寄存器的值压栈 并调用中断处理函数 irq_handle(struct TrapFrame * tf) TrapFame 结构中保存了7个寄存器的值, 通 过写入寄存器的系统调用参数即可实现你需 要的参数传递

加载用户程序

加载用户程序 我们先来看一下我们现在的磁盘 Kernel App Sector 1 2 …… 201 Bootloader

加载用户程序 0x???????? Physical Memory App Stack App 0x00200000 Kernel Stack Kernel 0x00100000 Bootloader 0x00007C00 0x00000000

加载用户程序 用户程序文件格式为 ELF 加载方式可以复制内核的加载方式 加载后不要着急跳转运行, 我们要对用户空间做一定 的配置, 因为内核运行在 ring0 而用户程序则运行在 ring3

配置 GDT 表项 我们在 GDT 表中初始化了用户代码段和用 户数据段, 但是没有填充相关字段, 你需要 在加载完用户程序后将代码段基地址以及数 据段基地址根据用户程序的地址重新初始化 用户段在这里都将 DPL 置为 3, 即用户程序 应该工作在 ring3

用 IRET 进入 ring3 在 IA-32中断机制中我们介绍了 IRET 指令 具体做了哪些工作, 但是你发现这些工作都 是硬件会帮你执行的 你需要为 IRET 指令在栈中压入相关内容: 用户堆栈段寄存器 SS 用户栈顶指针 ESP 标志寄存器 EFALGS 用户代码段寄存器 CS 用户指令寄存器 EIP

内存权限 作为工作在用户态的用户程序, 并不具有权 限在视频映射的显存地址中写入任何内容 不能向其他程序的内存中修改数据 将数据段限制在自己的数据段内即可

库函数

库函数 Lab2 要求完成 lib 目录下的格式化输出 printf 函数 测试用例可以在课程网站上获取 要求输出到屏幕 同时也可以输出到串口

Lab2 终…