第八章ⅣO操作的实现 用户空间/0软件 I/O硬件与软件的接口 内核空间I/O软件
第八章 I/O操作的实现 用户空间I/O软件 I/O硬件与软件的接口 内核空间I/O软件
O和文件操作 °主要教学目标 通过揭示高级语言程序中的/o及文件操作请求的底层实 现机制,使学生深刻理解OS在输入「输出系统中的重要 作用;深刻理解计算机中硬件和软件如何协调工作以完 成计算机功能 °主要教学内容 IO子系统的组成和层次结构 用户空间Io软件 I/O硬件与软件的接口 内核空间I/o软件
I/O和文件操作 ° 主要教学目标 – 通过揭示高级语言程序中的I/O及文件操作请求的底层实 现机制,使学生深刻理解OS在输入/输出系统中的重要 作用;深刻理解计算机中硬件和软件如何协调工作以完 成计算机功能。 ° 主要教学内容 – I/O子系统的组成和层次结构 – 用户空间I/O软件 – I/O硬件与软件的接口 – 内核空间I/O软件
O操作的实现 °分以下三个部分介绍 第一讲:用户空间Io软件 I/O子系统概述 文件的基本概念 用户空间的O函数 第二讲:IO硬件和软件的接口 -I/O设备和设备控制器 I/o端口及其编址方式 I/O控制方式 第三讲:内核空间I/O软件 与设备无关的/O软件 设备驱动程序 中断服务程序
I/O操作的实现 ° 分以下三个部分介绍 • 第一讲:用户空间I/O软件 - I/O子系统概述 - 文件的基本概念 - 用户空间的I/O函数 • 第二讲:I/O硬件和软件的接口 - I/O设备和设备控制器 - I/O端口及其编址方式 - I/O控制方式 • 第三讲:内核空间I/O软件 - 与设备无关的I/O软件 - 设备驱动程序 - 中断服务程序
复习:一个典型程序的转换处理过程 经典的“ helllo. c”源程序 helllo.c的ASC文本表示 #include #i n cu d e s t di o int maino 3510511099108117100101326011511610010511146 h >\n \n i n t m a i n()\n 1046210101051101163210997105110404110123 printf("hello, world\n")E in pr in tf("he 10323232321121141051101161024034104101108 r d v );\n} 10811144321191111141081009211034415910125 intf hello. c pre hello,i compiler hello. s assembler hello. o linkerhello processor cc1 as (cpp) (1d) source modified assen nby relocatable execu program source program object obiect progra (text) programs program (text (binary)
复习:一个典型程序的转换处理过程 #include int main() { printf("hello, world\n"); } 经典的“ hello.c ”源程序 # i n c l u d e \ n \ n i n t m a i n ( ) \ n { 104 62 10 10 105 110 116 32 109 97 105 110 40 41 10 123 \n p r i n t f ( " h e l 10 32 32 32 32 112 114 105 110 116 102 40 34 104 101 108 l o , w o r l d \ n " ) ; \ n } 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10 125 hello.c的ASCII文本表示
复习:Heo程序的数据流动过程ne/eo hello, world Red:she命令行处理 CPU unIx register file Blue:可执行文件加载 yan: hello程序执行过程 LE PC ALU system bus memory bus Chello In mal Memory Interac bridge memory“ hello world/n lo bus Expansion slots for other devices such US graphics disk as network adapters controll adapter controller mouse keyboard displa chelo Chello, worldn disk Hello可执行文件 问题:hell程序何时被装?谁来装入?被谁启动?每次是否被装到相同的地 方?Hel程序是否能直接访问硬件资源?
复习:Hello程序的数据流动过程 “hello” Hello可执行文件 Red:shell命令行处理 Blue:可执行文件加载 Cyan:hello程序执行过程 “hello” “hello,world/n ” “hello,world/n” 问题:hello程序何时被装?谁来装入?被谁启动?每次是否被装到相同的地 方?Hello程序是否能直接访问硬件资源? Unix>./hello hello, world unix>
操作系统在程序执行过程中的作用 °She进程生成子进程,子进程调用 lexecve系统调用启动加载器,以 装入 Hello程序,最后跳转到第一条指令执行 °在Hlo程序执行过程中,Hll本身不会直接访问键盘、显示器、磁 盘和主存储器等硬件资源,而是依靠OS提供的服务来间接访问。 例如,利用 printf函数最终调出内核服务程序访问硬件。 操作系统是在应用程序和硬件之间插入的一个中间软件层。 °操作系统的两个主要的作用: 硬件资源管理,以达到以下两个目的: 统筹安排和调度硬件资源,以防止硬件资源被用户程序滥用 对于广泛使用的复杂低级设备,为用户程序提供一个简单 致的使用接口 ·为用户(最终用户、用户程序)使用系统提供一个操作接口
操作系统在程序执行过程中的作用 ° Shell进程生成子进程,子进程调用execve系统调用启动加载器,以 装入Hello程序,最后跳转到第一条指令执行 ° 在Hello程序执行过程中,Hello本身不会直接访问键盘、显示器、磁 盘和主存储器等硬件资源,而是依靠OS提供的服务来间接访问。 ° 操作系统是在应用程序和硬件之间插入的一个中间软件层。 ° 操作系统的两个主要的作用: • 硬件资源管理,以达到以下两个目的: - 统筹安排和调度硬件资源,以防止硬件资源被用户程序滥用 - 对于广泛使用的复杂低级设备,为用户程序提供一个简单一 致的使用接口 • 为用户(最终用户、用户程序)使用系统提供一个操作接口 例如,利用printf()函数最终调出内核服务程序访问硬件
O子系统概述 °所有高级语言的运行时( runtime) 都提供了执行I/O功能的机制 用户程序中的10请求(用户空间 例如,C语言中提供了包含像 printf( 丫I0软件 和 scant0等这样的标准/O库函数, 运行时系统 C++语言中提供了如>(输出)这样的重载操作符。 与设备无关的0软件 °从高级语言程序中通过O函数或I/o 内核空间 操作符提出/O请求,到设备响应并完 设备驱动程序 IO软件 成/O请求,涉及到多层次o软件和 I/O硬件的协作。 中断服务程序 °I/O子系统也采用层次结构 IO硬件 从用户I/o软件切换到内核o软件的唯一 办法是“异常”机制:系统调用(自陷)
I/O子系统概述 ° 所有高级语言的运行时(runtime) 都提供了执行I/O功能的机制 例如,C语言中提供了包含像printf() 和scanf()等这样的标准I/O库函数, C++语言中提供了如 >(输出)这样的重载操作符。 ° 从高级语言程序中通过I/O函数或I/O 操作符提出I/O请求,到设备响应并完 成I/O请求,涉及到多层次I/O软件和 I/O硬件的协作。 ° I/O子系统也采用层次结构 从用户I/O软件切换到内核I/O软件的唯一 办法是“异常”机制:系统调用(自陷)
O子系统概述 各类用户的I/o请求需要通过某种方式传给oS: ●最终用户:键盘、鼠标通过操作界面传递给oS ●用户程序:通过函数(高级语言)转换为系统调用传递给oS I/o软件被组织成从高到低的四个层次,层次越低,则越接近设备 而越远离用户程序。这四个层次依次为 (1)用户层o软件(I/O函数调用系统调用) (2)与设备无关的操作系统o软件 (3)设备驱动程序 oS在/O系统 os中极其重要! (4)I/O中断处理程序 大部分o软件都属于操作系统内核态程序,最初的O请求在用 户程序中提出
I/O子系统概述 各类用户的I/O请求需要通过某种方式传给OS: 最终用户:键盘、鼠标通过操作界面传递给OS 用户程序:通过函数(高级语言)转换为系统调用传递给OS I/O软件被组织成从高到低的四个层次,层次越低,则越接近设备 而越远离用户程序。这四个层次依次为: (1) 用户层I/O软件(I/O函数调用系统调用) (2) 与设备无关的操作系统I/O软件 (3) 设备驱动程序 (4) I/O中断处理程序 大部分I/O软件都属于操作系统内核态程序,最初的I/O请求在用 户程序中提出。 OS在I/O系统 OS 中极其重要!
O子系统实例 boskey返回键盘状态的基本函数 °函数原型在bios.h中,完成直接键盘操作 ( stdio.- standard Input是oupu标准输入输出头文件) 原型表示 int bioskey( int cmd 其中cmd有3个参数:0,12 cmd=0, bioskey0返回下一个在键盘键入的值(它将等待到按下一个键)。 它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的 低8位数存放该字符的Asc码;对于特殊键(如方向键、F1~F12等等),低 8位为0,高8位字节存放该键的扫描码。 °cmd=1:当cmd是1, bioskey(査询是否按下一个键,若按下一个键则返回 非零值,否则返回0。 cmd=2:当cmd是2, bioskey0返回 Shift、ctrl、Alt、 Scrolllock、 Numlock、 CapsLock、 Insert键的状态。各键状态存放在返回值的低8位字 节中
°bioskey()返回键盘状态的基本函数 °函数原型在bios.h中,完成直接键盘操作 ( ) °原型表示:int bioskey(int cmd) °其中cmd有3个参数:0,1,2 °cmd= 0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。 它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的 低8位数存放该字符的ASCII码;对于特殊键(如方向键、F1~F12等等),低 8位为0,高8位字节存放该键的扫描码。 °cmd = 1:当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回 非零值,否则返回0。 °cmd = 2:当cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、 NumLock、CapsLock、Insert键的状态。各键状态存放在返回值的低8位字 节中。 I/O子系统实例
用户ⅣO软件 用户软件可用以下两种方式提出o请求: (1)使用高级语言提供的标准O库函数。例如,在C语言程序中可以直接使 用像 fopen、 fread、 fwrite和 fclose等文件操作函数,或 printf.、putc scan和getc等控制台Io函数。程序移植性很好! 但是,使用标准/O库函数有以下几个方面的不足 (a)标准/o库函数不能保证文件的安全性(无加/解锁机制) (b)所有o都是同步的,程序必须等待o操作完成后才能继续执行 (c)有时不适合甚至无法使用标准/o库函数实现Io功能,如,不提供读取文 件元数据的函数(元数据包括文件大小和文件创建时间等) (d)用它进行网络编程会造成易于出现缓冲区溢出等风险 (2)使用OS提供的AP函数或系统调用。如,在 Windows中直接使用像 Create File、 Readfile、 Write File、 Closehandle等文件操作AP函数,或 Read Console、 Write Console等控制台I/O的API函数。对JUniⅸ或 Linux 用户程序,则直接使用像open、read、 write、 close等系统调用封装函数
用户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功能,如,不提供读取文 件元数据的函数(元数据包括文件大小和文件创建时间等) (d) 用它进行网络编程会造成易于出现缓冲区溢出等风险 (2)使用OS提供的API函数或系统调用。如,在Windows中直接使用像 CreateFile、ReadFile、WriteFile、CloseHandle等文件操作API函数,或 ReadConsole、WriteConsole等控制台I/O的API函数。对于Unix或Linux 用户程序,则直接使用像open、read、write、close等系统调用封装函数