计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现

上传人:f****u 文档编号:129607033 上传时间:2020-04-23 格式:PPT 页数:88 大小:2.89MB
返回 下载 相关 举报
计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现_第1页
第1页 / 共88页
计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现_第2页
第2页 / 共88页
计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现_第3页
第3页 / 共88页
计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现_第4页
第4页 / 共88页
计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现》由会员分享,可在线阅读,更多相关《计算机系统基础全套配套课件袁春风 讨论题 第八章输入输出操作的实现(88页珍藏版)》请在金锄头文库上搜索。

1、I O操作的实现用户空间I O软件I O硬件与软件的接口内核空间I O软件 I O和文件操作 主要教学目标通过揭示高级语言程序中的I O及文件操作请求的底层实现机制 使学生深刻理解OS在输入 输出系统中的重要作用 深刻理解计算机中硬件和软件如何协调工作以完成计算机功能 主要教学内容I O子系统的组成和层次结构用户空间I O软件I O硬件与软件的接口内核空间I O软件 I O操作的实现 分以下三个部分介绍第一讲 用户空间I O软件I O子系统概述文件的基本概念用户空间的I O函数第二讲 I O硬件和软件的接口I O设备和设备控制器I O端口及其编址方式I O控制方式第三讲 内核空间I O软件与设

2、备无关的I O软件设备驱动程序中断服务程序 复习 一个典型程序的转换处理过程 includeintmain printf hello world n 经典的 hello c 源程序 include n nintmain n 1046210101051101163210997105110404110123 nprintf hel10323232321121141051101161024034104101108lo world n n 10811144321191111141081009211034415910125 hello c的ASCII文本表示 复习 Hello程序的数据流动过程 Hell

3、o可执行文件 Red shell命令行处理Blue 可执行文件加载Cyan hello程序执行过程 hello hello world n hello world n 问题 hello程序何时被装入 谁来装入 被谁启动 每次是否被装到相同的地方 hello程序是否能直接访问硬件资源 Unix hellohello worldunix 操作系统在程序执行过程中的作用 shell进程生成子进程并调用execve系统调用启动加载器 以装入hello程序 最后跳转到hello的第一条指令执行在hello程序执行过程中 hello本身不会直接访问键盘 显示器 磁盘和主存储器等硬件资源 而是依靠OS提供的

4、服务来间接访问 操作系统是在应用程序和硬件之间插入的一个中间软件层 操作系统的两个主要的作用 资源管理 以达到以下两个目的 统筹安排和调度资源 以防止资源被用户程序滥用对于广泛使用的复杂低级设备 为用户程序提供一个简单一致的使用接口为用户 最终用户 用户程序 使用系统提供一个操作接口 例如 利用printf 函数最终调出内核服务程序访问硬件 I O子系统概述 所有高级语言的运行时 runtime 都提供了执行I O功能的机制例如 C语言中提供了包含像printf 和scanf 等这样的标准I O库函数 C 语言中提供了如 输出 这样的重载操作符 从高级语言程序中通过I O函数或I O操作符提出

5、I O请求 到设备响应并完成I O请求 涉及到多层次I O软件和I O硬件的协作 I O子系统也采用层次结构 从用户I O软件切换到内核I O软件的唯一办法是 异常 机制 系统调用 自陷 I O子系统概述 各类用户的I O请求需要通过某种方式传给OS 最终用户 键盘 鼠标通过操作界面传递给OS 用户程序 通过函数 高级语言 转换为系统调用传递给OSI O软件被组织成从高到低的四个层次 层次越低 则越接近设备而越远离用户程序 这四个层次依次为 1 用户层I O软件 I O函数调用系统调用 2 与设备无关的操作系统I O软件 3 设备驱动程序 4 I O中断处理程序大部分I O软件都属于操作系统内

6、核态程序 最初的I O请求在用户程序中提出 OS在I O系统中极其重要 用户I O软件 用户软件可用以下两种方式提出I O请求 1 使用高级语言提供的标准I O库函数 例如 在C语言程序中可以直接使用像fopen fread fwrite和fclose等文件操作函数 或printf putc scanf和getc等控制台I O函数 程序移植性很好 但是 使用标准I O库函数有以下几个方面的不足 a 标准I O库函数不能保证文件的安全性 无加 解锁机制 b 所有I O都是同步的 程序必须等待I O操作完成后才能继续执行 串行 c 有些I O功能不适合甚至无法使用标准I O库函数实现 如 不提供读

7、取文件元数据的函数 元数据包括文件大小和文件创建时间等 d 用它进行网络编程会造成易于出现缓冲区溢出等风险 2 使用OS提供的API函数或系统调用 例如 在Windows中直接使用像CreateFile ReadFile WriteFile CloseHandle等文件操作API函数 或ReadConsole WriteConsole等控制台I O的API函数 对于Unix或Linux用户程序 则直接使用像open read write close等系统调用封装函数 用户I O软件 用户进程请求读磁盘文件操作用户进程使用标准C库函数fread 或WindowsAPI函数ReadFile 或Un

8、ix Linux的系统调用函数read等要求读一个磁盘文件块 用户程序中涉及I O操作的函数最终会被转换为一组与具体机器架构相关的指令序列 这里我们将其称为I O请求指令序列 例如 若用户程序在IA 32架构上执行 则I O函数被转换为IA 32的指令序列 每个指令系统中一定有一类陷阱指令 有些机器也称为软中断指令或系统调用指令 主要功能是为操作系统提供灵活的系统调用机制 在I O请求指令序列中 具体I O请求被转换为一条陷阱指令 在陷阱指令前面则是相应的系统调用参数的设置指令 回顾 IA 32 Linux的系统调用 通常 系统调用被封装成用户程序能直接调用的函数 如exit read 和op

9、en 这些是标准C库中系统调用对应的封装函数 Linux中系统调用所用参数通过寄存器传递 传递参数的寄存器顺序依次为 EAX 调用号 EBX ECX EDX ESI EDI和EBP 除调用号以外 最多6个参数 封装函数对应的机器级代码有一个统一的结构 总是若干条传送指令后跟一条陷阱指令 传送指令用来传递系统调用的参数 陷阱指令 如int 0 x80 用来陷入内核进行处理 例如 若用户程序调用系统调用write 1 hello world n 14 将字符串 hello world n 中14个字符显示在标准输出设备文件stdout上 则其封装函数对应机器级代码 用汇编指令表示 如下 movl

10、4 eax 调用号为4 送EAXmovl 1 ebx 标准输出设备stdout的文件描述符为1 送EBXmovl string ecx 字符串 hello world n 首址送ECXmovl 14 edx 字符串的长度为14 送EDXint 0 x80 系统调用 系统I O软件 OS在I O子系统中的重要性由I O系统以下三个特性决定 1 共享性 I O系统被多个程序共享 须由OS对I O资源统一调度管理 以保证用户程序只能访问自己有权访问的那部分I O设备 并使系统的吞吐率达到最佳 2 复杂性 I O设备控制细节复杂 需OS提供专门的驱动程序进行控制 这样可对用户程序屏蔽设备控制的细节 3

11、 异步性 不同设备之间速度相差较大 因而 I O设备与主机之间的信息交换使用异步的中断I O方式 中断导致从用户态向内核态转移 因此必须由OS提供中断服务程序来处理 那么 如何从用户程序对应的用户进程进入到操作系统内核执行呢 系统调用 如 INT 0 x80 系统调用和API OS提供一组系统调用 为用户进程的I O请求进行具体的I O操作 应用编程接口 API 与系统调用两者在概念上不完全相同 它们都是系统提供给用户程序使用的编程接口 但前者指的是功能更广泛 抽象程度更高的函数 后者仅指通过软中断 自陷 指令向内核态发出特定服务请求的函数 系统调用封装函数是API函数中的一种 API函数最终

12、通过调用系统调用实现I O 一个API可能调用多个系统调用 不同API可能会调用同一个系统调用 但是 并不是所有API都需要调用系统调用 从编程者来看 API和系统调用之间没有什么差别 从内核设计者来看 API和系统调用差别很大 API在用户态执行 系统调用封装函数也在用户态执行 但具体服务例程在内核态执行 SKIP 回顾 IA 32 Linux的系统调用 系统调用 陷阱 是特殊异常事件 是OS为用户程序提供服务的手段 Linux提供了几百种系统调用 主要分为以下几类 进程控制 文件操作 文件系统操作 系统控制 内存管理 网络管理 用户管理 进程通信等系统调用号是系统调用跳转表索引值 跳转表给

13、出系统调用服务例程首址 系统调用及其参数传递 在用户态 当进程调用一个系统调用时 CPU切换到内核态 并开始执行一个被称为系统调用处理程序的内核函数例如 IA 32中 可以通过两种方式调用Linux的系统调用执行软中断指令int 0 x80执行指令sysenter 老的x86不支持该指令 内核实现了许多系统调用 因此 用一个系统调用号 存放在EAX中 来标识不同的系统调用除了调用号以外 系统调用还需要其他参数 不同系统调用所需参数的个数和含义不同 输入参数通过通用寄存器传递 若参数个数超出寄存器个数 则将需传递参数块所在内存区首址放在寄存器中传递 除调用号以外 最多6个参数 传递参数的寄存器顺

14、序 EAX 系统调用号 EBX ECX EDX ESI EDI和EBP返回参数为整数值 正数或0表示成功 负数表示出错码 用户程序 C函数和内核 用户程序总是通过某种I O函数或I O操作符请求I O操作 例如 读一个磁盘文件记录时 可调用C标准I O库函数fread 也可直接调用系统调用封装函数read 来提出I O请求 不管是C库函数 API函数还是系统调用封装函数 最终都通过操作系统内核提供的系统调用来实现I O printf 函数的调用过程如下 回顾 Linux系统中printf 函数的执行过程 某函数调用了printf 执行到调用printf 语句时 便会转到C语言I O标准库函数p

15、rintf 去执行 printf 通过一系列函数调用 最终会调用函数write 调用write 时 便会通过一系列步骤在内核空间中找到write对应的系统调用服务例程sys write来执行 main printf 用户程序 printf xxxx system call xxxx 系统调用封装函数 系统调用处理程序 用户空间 运行在用户态 内核空间 运行在内核态 write int 0 x80 I O标准库函数 sys write 系统调用服务例程 在system call中如何知道要转到sys write执行呢 根据系统调用号 Linux系统下的write 封装函数 1write 2pus

16、hl ebx 将EBX入栈 EBX为被调用者保存寄存器 3movl 4 eax 将系统调用号4送EAX4movl8 esp ebx 将文件描述符fd送EBX5movl12 esp ecx 将所写字符串首址buf送ECX6movl16 esp edx 将所写字符个数n送EDX7int 0 x80 进入系统调用处理程序system call执行8cmpl 125 eax 检查返回值9jbe L1 若无错误 则跳转至 L1 按无符号数比 10negl eax 将返回值取负送EAX11movl eax error 将EAX的值送error12movl 1 eax 将write函数返回值置 113 L1 14popl ebx15ret 用法 ssize twrite intfd constvoid buf size tn size t和ssize t分别是unsignedint和int 因为返回值可能是 1 内核执行write的结果在EAX中返回 正确时为所写字符数 最高位为0 出错时为错误码的负数 最高位为1 在Linux内核中单向调用20次以上 read sys read Int0 x80触

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号