欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    ICS计算机基础教学课件第八章输入输出操作的实现.pptx

    • 资源ID:96460755       资源大小:2.05MB        全文页数:76页
    • 资源格式: PPTX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ICS计算机基础教学课件第八章输入输出操作的实现.pptx

    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软件-与设备无关的I/O软件-设备驱动程序-中断服务程序复习:一个典型程序的转换处理过程复习:一个典型程序的转换处理过程#includeintmain()printf(hello,worldn);经典的“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 123n p r i n t f(h e l10 32 32 32 32 112 114 105 110 116 102 40 34 104 101 108l o ,w o r l d n );n 108 111 44 32 119 111 114 108 100 92 110 34 41 59 10 125hello.c的的ASCII文本表示文本表示复习:复习:Hello程序的数据流动过程程序的数据流动过程“hello”Hello可执行文件Red:shell命令行处理Blue:可执行文件加载Cyan:hello程序执行过程“hello”“hello,world/n”“hello,world/n”问题:hello程序何时被装?谁来装入?被谁启动?每次是否被装到相同的地方?Hello程序是否能直接访问硬件资源?Unix./hellohello,worldunix操作系统在程序执行过程中的作用操作系统在程序执行过程中的作用Shell进程生成子进程,子进程调用execve系统调用启动加载器,以装入Hello程序,最后跳转到第一条指令执行在Hello程序执行过程中,Hello本身不会直接访问键盘、显示器、磁盘和主存储器等硬件资源,而是依靠OS提供的服务来间接访问。操作系统是在应用程序和硬件之间插入的一个中间软件层。操作系统的两个主要的作用:硬件资源管理,以达到以下两个目的:-统筹安排和调度硬件资源,以防止硬件资源被用户程序滥用-对于广泛使用的复杂低级设备,为用户程序提供一个简单一致的使用接口为用户(最终用户、用户程序)使用系统提供一个操作接口例如,利用例如,利用printf()函数最终调出内核服务程序访问硬件。函数最终调出内核服务程序访问硬件。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软件的唯一办法是“异常”机制:系统调用(自陷)I/O子系统概述子系统概述 各类用户的I/O请求需要通过某种方式传给OS:最终用户:键盘、鼠标通过操作界面传递给OS 用户程序:通过函数(高级语言)转换为系统调用传递给OSI/O软件被组织成从高到低的四个层次,层次越低,则越接近设备而越远离用户程序。这四个层次依次为:(1)用户层I/O软件(I/O函数调用系统调用)(2)与设备无关的操作系统I/O软件(3)设备驱动程序(4)I/O中断处理程序大部分I/O软件都属于操作系统内核态程序,最初的I/O请求在用户程序中提出。OS在I/O系统中极其重要!OS用户用户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等系统调用封装函数。用户用户I/O软件软件用户进程请求读磁盘文件操作用户进程使用标准C库函数fread,或WindowsAPI函数ReadFile,或Unix/Linux的系统调用函数read等要求读一个磁盘文件块。用户程序中涉及I/O操作的函数最终会被转换为一组与具体机器架构相关的指令序列,这里我们将其称为I/O请求指令序列。例如,若用户程序在IA-32架构上执行,则I/O函数被转换为IA-32的指令序列。每个指令系统中一定有一类陷阱指令(有些机器也称为软中断指令或系统调用指令),主要功能是为操作系统提供灵活的系统调用机制。在I/O请求指令序列中,具体I/O请求被转换为一条陷阱指令,在陷阱指令前面则是相应的系统调用参数的设置指令。系统系统I/O软件软件OS在I/O子系统中的重要性由I/O系统以下三个特性决定:(1)共享性。I/O系统被多个程序共享,须由OS对I/O资源统一调度管理,以保证用户程序只能访问自己有权访问的那部分I/O设备,并使系统的吞吐率达到最佳。(2)复杂性。I/O设备控制细节复杂,需OS提供专门的驱动程序进行控制,这样可对用户程序屏蔽设备控制的细节。(3)异步性。不同设备之间速度相差较大,因而,I/O设备与主机之间的信息交换使用异步的中断I/O方式,中断导致从用户态向内核态转移,因此必须由OS提供中断服务程序来处理。那么,如何从用户程序对应的用户进程进入到操作系统内核执行呢?系统调用!系统调用和系统调用和APIOS提供一组系统调用为用户进程的I/O请求进行具体的I/O操作。应用编程接口(API)与系统调用两者在概念上不完全相同,它们都是系统提供给用户程序使用的编程接口,但前者指的是功能更广泛、抽象程度更高的函数,后者仅指通过软中断(自陷)指令向内核态发出特定服务请求的函数。系统调用封装函数是API函数中的一种。API函数最终通过调用系统调用实现I/O。一个API可能调用多个系统调用,不同API可能会调用同一个系统调用。但是,并不是所有API都需要调用系统调用。从编程者来看,API和系统调用之间没有什么差别。从内核设计者来看,API和系统调用差别很大。API在用户态执行,系统调用封装函数也在用户态执行,但具体服务例程在内核态执行。系统调用及其参数传递系统调用及其参数传递在用户态,当进程调用一个系统调用时,CPU切换到内核态,并开始执行一个被称为系统调用处理程序的内核函数例如,IA-32中,可以通过两种方式调用Linux的系统调用执行软中断指令int80执行指令sysenter(老的x86不支持该指令)内核实现了许多系统调用,因此,用一个系统调用号(存放在EAX中)来标识不同的系统调用除了调用号以外,系统调用还需要其他参数,不同系统调用所需参数的个数和含义不同,输入参数通过通用寄存器传递,若参数个数超出寄存器个数,则将需传递参数块所在内存区首址放在寄存器中传递(除调用号以外,最多6个参数)传递参数的寄存器顺序: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标准库函数printf()去执行;printf()通过一系列函数调用,最终会调用函数write();调用write()时,便会通过一系列步骤在内核空间中找到write对应的系统调用服务例程sys_write来执行。main()printf();用户程序 printf()xxxx();system_call()xxxx();系统调用封装函数系统调用处理程序用户空间、运行在用户态内核空间、运行在内核态write()int$0 x80I/O标准库函数sys_write()系统调用服务例程在system_call中如何知道要转到sys_write执行呢?根据系统调用号!Linux系统下的系统下的write()封装函数封装函数 1write:2pushl%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)应用层的应用层的ReadRead函数在函数在LinuxLinux内核中的单向内核中的单向2020次以上的调用!次以上的调用!用户空间中的用户空间中的I/O函数函数用户程序可通过调用特定的I/O函数的方式提出I/O请求。在UNIX/Linux系统中,可以是C标准I/O库函数或系统调用的封装函数,前者如文件I/O函数fopen()、fread()、fwrite()和fclose()或控制台I/O函数printf()、putc()、scanf()和getc()等;后者如open()、read()、write()和close()等。标准I/O库函数比系统调用封装函数抽象层次高,后者属于系统级I/O函数。与系统提供的API函数一样,前者是基于后者实现的。用户空间中的用户空间中的I/O函数函数文件的基本概念文件的基本概念所有I/O操作通过读写文件实现,所有外设,包括网络、终端设备,都被看成文件。所有物理设备抽象成逻辑上统一的“文件”使得用户程序访问物理设备与访问真正的磁盘文件完全一致。例如,fprintf/fwrite(主要是磁盘文件)和printf(stdout)都通过统一的write函数陷入内核,差别则由内核处理!UNIX系统中,文件就是一个字节序列。通常,将键盘和显示器构成的设备称为终端(terminal),对应标准输入、和标准(错误)输出文件;像磁盘、光盘等外存上的文件则是普通文件。根据文件的可读性,文件被分成ASCII文件和二进制文件两类。ASCII文件也称文本文件,可由多个正文行组成,每行以换行符n结束,每个字符占一个字节。标准输入和标准(错误)输出文件是ASCII文件。普通文件可能是文本文件或二进制文件。问题:.c、.cpp、.o、.txt、.exe文件各是什么类型文件?哪里遇过“文件”?intfprintf(FILE*fp,char*format,argument)printf在哪显示信息?stdout文件!即终端显示器TTYStream!字节流文件的创建和打开文件的创建和打开读写文件前,用户程序须告知将对文件进行何种操作:读、写、添加还是可读可写,通过打开或创建一个文件来实现。已存在的文件:可直接打开不存在的文件:则先创建1.创建文件:intcreat(char*name,mode_tperms);u创建新文件时,应指定文件名和访问权限,系统返回一个非负整数,它被称为文件描述符fd(filedescriptor)。u文件描述符用于标识被创建的文件,在以后对文件的读写等操作时用文件描述符代表文件。2.打开文件:intopen(char*name,intflags,mode_tperms);u标准输入(fd=0)、标准输出(fd=1)和标准错误(fd=2)三种文件自动打开,其他文件须用creat或open函数显式创建或打开后才能读写u参数perms用于指定文件的访问权限,通常在open函数中该参数总是0,除非以创建方式打开,此时,参数flags中应带有O_CREAT标志。u参数flags:O_RDONLY,O_WRONLY|O_APPEND,O_RDWR等例:fd=open(“test.txt”,O_RDONLY,0);文件的读文件的读/写写3.读文件:size_tread(intfd,void*buf,size_tn);u将fd中当前位置k开始的n个字节读到buf中,读后当前位置为k+n。若文件长度为m,当k+nm时,则读取字节数为m-kbase(fp)-ptr(fp)-cnt未读部分已读部分已读入并出缓冲文件中未缓存文件当前指针输入流缓冲fp文件对应的字节流fp文件在哪里?磁盘上或键盘输入用FILE结构描述相对于fp首的位移输入带缓冲带缓冲I/O的实现的实现向文件fp中写数据时,FILE中定义的缓冲区为输出流缓冲先按需不断地向缓存写1个(如putc)或n个(如fwrite)字节,遇到换行符n或缓存被写满1024(缓冲大小BUFSIZ=1024)个字节,则将缓存内容一次写入文件fp中 未写部分 已写部分输出流缓冲(fp)-base(fp)-ptr(fp)-cnt未写部分已写部分已写入fp并出缓冲文件当前指针输出流缓冲fp文件对应的字节流输出stdout和和stderr的差别的差别猜一下在Linux中以下程序输出什么?#includeintmain()fprintf(stdout,“hello);fprintf(stderr,“world!);return0;输出结果为:world!hello#includeintmain()fprintf(stdout,“hello);fprintf(stderr,“world!n);return0;输出结果为:world!hello#includeintmain()fprintf(stdout,“hellon);fprintf(stderr,“world!);return0;输出结果为:helloworld!stdout和stderr都用于标准输出,但是,stderr为_WRITE|_UNBUFstdout为_WRITE有缓冲:遇到换行符n或缓冲满(BUFSIZE=1024)才写文件!stdout 和和 stderr 的差别的差别例子(可执行文件为hello)#includevoidmain()fprintf(stdout,fromstdoutn);fprintf(stderr,fromstderrn);二者都默认指向标准输出,即显示器;也都可重定位到普通文件中!./helloout.txt:stdout送out.txt,stderr送屏幕./hello2err.txt:stdout送屏幕,stderr送err.txt./helloout.txt2err.txt:stdout送out.txt,stderr送err.txt./hellocombine.txt2&1:stdout和stderr都送combine.txt./hellocombine.txt2combine.txt:stdout和stderr都送combine.txt执行结果如下:stdio.h中更多的定义中更多的定义在stdio.h中,还定义了feof()、ferror()、fileno()、getc()、putc()、getchar()、putchar()等标准I/O函数。系统级I/O函数对文件的标识是文件描述符,C标准I/O库函数中对文件的标识是指向FILE结构的指针,FILE中定义了1024字节的流缓冲区。使用流缓冲区可使文件内容缓存在用户缓冲区中,而不是每次都直接读/写文件,从而减少执行系统调用次数。int_fillbuf(FILE*);/*第一次调用getc(),需用_fillbuf()填充缓冲区*/int_flushbuf(int,FILE*);/*遇换行或写缓冲区满,调用其将缓冲内容写文件*/#definefeof(p)(p)-flag&_EOF)!=0)#defineferror(p)(p)-flag&_ERR)!=0)#definefileno(p)(p)-fd)#definegetc(p)(-(p)-cnt=0?(unsigned char)*(p)-ptr+:_fillbuf(p)#defineputc(x,p)(-(p)-cnt=0?*(p)-ptr+=(x):_flushbuf(x),p)#definegetchar()getc(stdin)#defineputchar(x)putc(x),stdout)输入缓冲内容未读完。cnt为未读字符数,初值为0,调用_fillbuf()后值flag&(_READ|_EOF|_ERR)!=_READ)return EOF;bufsize=(fp-flag&_UNBUF)?1:BUFSIZ;if(fp-base=NULL)/*刚开始,还没有申请缓冲*/if(fp-base=(char*)malloc(bufsize)=NULL)return EOF;/*缓冲没有申请到*/fp-ptr=fp-base;fp-cnt=read(fp-fd,fp-ptr,bufsize);/*cntcnt 0)/*cntcnt=-1)fp-flag|=_EOF;else fp-flag|=_ERR;fp-cnt=0;return EOF;return(unsigned char)*fp-ptr+;stderr没有缓冲即bufsize=1调用系统调用封装函数进行读文件操作,一次将输入缓冲读满cnt减1返回缓冲区当前字节,并ptr加1int _flushbuf(int x,FILE*fp)unsigned nc;int bufsize;if(fp _iob+OPEN_MAX)return EOF;if(fp-flag&(_WRITE|_ERR)!=_WRITE)return EOF;bufsize=(fp-flag&_UNBUF)?1:BUFSIZ;if(fp-base=NULL)/*刚开始,还没有申请缓冲*/if(fp-base=(char*)malloc(bufsize)=NULL)fp-flag|=_ERR;return EOF;else /*已存在缓冲,且遇到换行符或缓冲已满*/nc=fp-ptr-fp-base;if(write(fp-fd,fp-base,nc)!=nc)fp-flag|=_ERR;return EOF;fp-ptr=fp-base;*fp-ptr+=x;fp-cnt=bufsize-1;return x;_flushbuf()函数的实现函数的实现举例:文件复制功能的实现举例:文件复制功能的实现/*方式一:getc/putc版本*/voidfilecopy(FILE*infp,FILE*outfp)intc;while(c=getc(infp)!=EOF)putc(c,outfp);/*方式二:read/write版本*/voidfilecopy(int*infp,int*outfp)charc;while(read(infp,&c,1)!=0)write(outfp,&c,1);哪种方式更好?方式一更好!Why?因其系统调用次数少!对于方式二,若文件长度为n,则需执行2n次系统调用;对于方式一,若文件长度为n,则执行系统调用的次数约为n/512。还有其他的实现方式吗?使用fread()和fwrite()使用fgetc()和fputc()使用WindowsAPI函数CopyFile()为何要尽量减少系统调用次数?系统调用的开销有多大?实现一个功能有多种方式,但开销和性能不同,需要权衡!相当大!SKIPLinux系统下的系统下的write()封装函数封装函数 1write:2pushl%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)回顾:软中断指令回顾:软中断指令int$0 x80的执行过程的执行过程 它是陷阱类(编程异常)事件,因此它与异常响应过程一样。1)将IDTi(i=128)中段选择符(0 x60)所指GDT中的内核代码段描述符取出,其DPL=0,此时CPL=3(因为int$0 x80指令在用户进程中执行),因而CPLDPL且IDTi的DPL=CPL,故未发生13号异常。2)读TR寄存器,以访问TSS,从TSS中将内核栈的段寄存器内容和栈指针装入SS和ESP;3)依次将执行完指令int$0 x80时的SS、ESP、EFLAGS、CS、EIP的内容(即断点和程序状态)保存到内核栈中,即当前SSESP所指之处;4)将IDTi(i=128)中段选择符(0 x60)装入CS,偏移地址装入EIP。这里,CS:EIP即是系统调用处理程序system_call(所有系统调用的入口程序)第一条指令的逻辑地址。执行int$0 x80需一连串的一致性和安全性检查,因而速度较慢。从PentiumII开始,Intel引入了指令sysenter和sysexit,分别用于从用户态到内核态、从用户态到内核态的快速切换。BACKI/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总线(桥)-设备控制器-电缆-外设如何把用户I/O请求转换为对设备的控制命令并完成设备I/O任务,需要I/O软件与I/O硬件之间的协调工作如:printf(hello,worldn);主机-I/O总线(桥)-设备控制器(带连接器)-电缆-外设连接外部设备的连接器连接外部设备的连接器主机-I/O总线(桥)-设备控制器(带连接器)-电缆-外设外部设备的通用模型外部设备的通用模型通过电缆与设备控制器(I/O接口)进行数据、状态和控制信息的传送控制逻辑根据控制信息控制设备的操作,并检测设备状态缓冲器用于保存交换的数据信息变换器用于在电信号形式(内部数据)和其他形式的设备数据之间进行转换控制逻辑缓冲器变换器控制状态数据设备控制器(连接器)电缆设备数据环境所有设备都可抽象成该通用模型!设备所用电缆中有三种信号线:控制信号、状态信号、数据信号设备控制器的结构设备控制器的结构设备控制器的一般结构:设备控制器的一般结构:不同不同I/O模块在复杂性和控制外设的数量上相差很大模块在复杂性和控制外设的数量上相差很大通过发送命令字到I/O控制寄存器来向设备发送命令通过从状态寄存器读取状态字来获取外设或I/O控制器的状态信息通过向I/O控制器发送或读取数据来和外设进行数据交换将I/O控制器中CPU能够访问的各类寄存器称为I/O端口对外设的访问通过向I/O端口发命令、读状态、读/写数据来进行设备控制器又称I/O控制器简称I/O模块或I/O接口显卡的外部连接特征显卡的外部连接特征VGA连接器连接到显示器连接到I/O总线(主机侧)将I/O控制器中CPU能够访问的各类寄存器称为I/O端口对外设的访问通过向I/O端口发命令、读状态、读/写数据来进行I/O端口的寻址方式端口的寻址方式 (1)统一编址方式(内存映射方式)与主存空间统一编址,主存单元和I/O端口在同一个地址空间中。(将I/O端口映射到某个主存区域,故也称“存储器映射方式”)例如,RISC机器、Motorola公司的处理器等采用该方案VRAM(显示存储器)通常也和主存统一编址(2)独立编址方式(特殊I/O指令方式)单独编号,不和主存单元一起编,使成为一个独立的I/O地址空间(因为需专门I/O指令,故也称为“特殊I/O指令方式”)例如,Intel公司和Zilog公司的处理器就是独立编址方式l 对I/O端口读写就是向I/O设备送出命令或从设备读状态或读/写数据l一个I/O控制器可能会占有多个端口地址lI/O端口必须编号后,CPU才能访问它lI/O设备的寻址方式就是I/O端口的编号方式教室和办公室可以连号(统一编址),也可单独编号(独立编址)驱动程序与驱动程序与I/O指令指令控制外设进行输入/输出的底层I/O软件是驱动程序驱动程序设计者应了解设备控制器及设备的工作原理,包括:设备控制器中有哪些用户可访问的寄存器、控制/状态寄存器中每一位的含义、设备控制器与外设之间的通信协议等,而关于外设的机械特性,程序员则无需了解。驱动程序通过访问I/O端口控制外设进行I/O:将控制命令送到控制寄存器来启动外设工作;读取状态寄存器了解外设和设备控制器的状态;访问数据缓冲寄存器进行数据的输入和输出。对I/O端口的访问操作由I/O指令完成,它们是一种特权指令IA-32中的I/O指令:in、ins、out和outsin和ins用于将I/O端口的内容取到CPU内的通用寄存器中;out和outs用于将通用寄存器内容输出到I/O端口。如INAL,DX:DX中存放I/O端口地址,将I/O端口中的内容取到AL中三种基本三种基本I/O方式方式程序直接控制方式(最简单的I/O方式)无条件传送:对简单外设定时(同步)进行数据传送条件传送:CPU主动查询,也称程序查询或轮询(Polling)方式I/OInterrupt(中断I/O方式):几乎所有系统都支持中断I/O方式若一个I/O设备需要CPU干预,它就通过中断请求通知CPUCPU中止当前程序的执行,调出OS(中断处理程序)来执行处理结束后,再返回到被中止的程序继续执行DirectMemoryAccess(DMA方式):磁盘等高速外设所用的方式磁盘等高速外设成批地直接和主存进行数据交换需要专门的DMA控制器控制总线,完成数据传送数据传送过程无需CPU参与以以hello程序为例说明程序为例说明#includeintmain()printf(hello,worldn);假定以下用户程序对应的进程为pmain()printf();用户程序 printf()xxxx();system_call()xxxx();系统调用封装函数系统调用处理程序用户空间、运行在用户态内核空间、运行在内核态write()int$0 x80I/O标准库函数sys_write()系统调用服务例程可见:字符串输出最终是由内核中的sys_write系统调用服务例程实现sys_write可用三种I/O方式实现:程序查询、中断和DMA程序查询(程序查询(Polling)方式)方式I/O设备(包括设备控制器)将自己的状态放到状态寄存器中打印缺纸、打印机忙、未就绪等都是状态OS阶段性地查询状态寄存器中的特定状态,以决定下一步动作如:未“就绪”时,则一直“等待”例如:sys_write进行字符串打印的程序段大致过程如下:copy_string_to_kernel(strbuf,kernelbuf,n);/将字符串复制到内核缓冲区for(i=0;i2#1#1#对2#开放(不屏蔽)2#对3#开放(不屏蔽)轮询方式和中断方式的比较轮询方式和中断方式的比较举例:假定某机控制一台设备输出一批数据。数据由主机输出到接口的数据缓冲器OBR,需要1s。再由OBR输出到设备,需要1ms。设一条指令的执行时间为1s(包括隐指令)。试计算采用程序传送方式和中断传送方式的数据传输速度和对主机的占用率。对主机占用率:在进行I/O操作过程中,处理器有多少时间花费在输入/出操作上。数据传送速度(吞吐量、I/O带宽):单位时间内传送的数据量。假定每个数据的传送都要重新启动!即是字符型设备问题:CPU如何把数据送到OBR,I/O接口如何把OBR中的数据送到设备?CPU执行I/O指令来将数据送OBR;而I/O接口则是自动把数据送到设备。轮询方式和中断方式的比较轮询方式和中断方式的比较(1)程序直接控制传送方式若查询程序有10条,第5条为启动设备的指令,则:数据传输率为:1/(1000+5)s,约为每秒995个数据。主机占用率=100%(2)中断传送方式若中断服务程序有30条,在第20条启动设备,则:数据传输率为:1/(1000+1+20)s,约为每秒979个数据。主机占用率为:(1+30)/(1000+1+20)=3%外设外设CPU5s1ms轮询方式轮询方式为什么中断服务程序比查询程序长?因为中断服务程序有额外开销,如:保存现场、保存旧屏蔽字、设置新屏蔽字、开中断、查询中断源等外设外设CPU1ms中断方式中断方式DMA方式的基本要点方式的基本要点DMA方式的基本思想在高速外设和主存间直接传送数据由专门硬件(即:DMA控制器)控制总线进行传输DMA方式适用场合高速设备(如:磁盘、光盘等)成批数据交换,且数据间间隔时间短,一旦启动,数据连续读写采用“请求-响应”方式每当高速设备准备好数据就进行一次“DMA请求”,DMA控制器接受到DMA请求后,申请总线使用权DMA控制器的总线使用优先级比CPU高,为什么?与中断控制方式结合使用在DMA控制器控制总线进行数据传送时,CPU执行其他程序DMA传送结束时,要通过“DMA结束中断”告知CPU读一个磁盘扇区读一个磁盘扇区 -第一步第一步MainmemoryALURegister fileCPU chipDisk controllerGraphicsadapterUSBcontrollermousekeyboardMonitorDiskI/O busBus interfaceCPU对DMA控制器初始化:将传送方向(读)、传送数据个数、磁盘逻辑块号、主存起始地址等参数送到DMA控制器发送”启动DMA传送“命令DMA控制器传送数据个数被送到计数器中读一个磁盘扇区读一个磁盘扇区第二步第二步MainmemoryALURegister fileCPU chipDisk controllerGraphicsadapterUSBcontrollerMouse KeyboardMonitorDiskI/O busBus interface磁盘控制器读相应的扇区,并由DMA控制器控制总线把数据从磁盘控制器送主存,此时,CPU执行其他进程DMA控制器每传送一个数据,则计数器减1读一个磁盘扇区读一个磁盘扇区第三步第三步MainmemoryALURegister fileCPU chipDisk controllerGraphicsadapterUSBcontrollerMouse KeyboardMonitorDiskI/O busBus interface当DMA传送结束(计数为0),DMA控制器向CPU发出“DMA结束中断请求”,要求CPU进行相应的后处理。DMA控制器DMA方式下方式下CPU的工作的工作copy_string_to_kernel(strbuf,kernelbuf,n);/将字符串复制到内核缓冲区initialize_DMA();/初始化DMA控制器(准备传送参数)*DMA_control_port=START;/发送“启动DMA传送”命令scheduler();/阻塞用户进程P,调度其他进程执行acknowledge_interrupt();/中断回答(清除中断请求)unblock_user();/用户进程P解除阻塞,进入就绪队列return_from_interrupt();/中断返回例子:采用DMA方式进行字符串输出sys_write进行字符串输出的程序段:”DMA结束“中断服务程序:CPU仅在DMA控制器初始化和处理“DMA结束中断“时介入,在DMA传送过程中不参与,因而CPU用于I/O的开销非常小。DMA控制器接受到“启动”命令后,控制总线进行DMA传送。通常用”周期挪用法“:设备每准备好一个数据,挪用一次”存储周期“,使用一次总线事务进行数据传送,计数器减1。计数器为0时,发送DMA结束中断请求例:中断、例:中断、DMA方式下方式下CPU的开销的开销 设处理器按500MHz的速度执行,硬盘控制器中有一个16B的数据缓存器,磁盘传输速率为4MB/Sec,在磁盘传输数据过程中,要求没有任何数据被错过,并假定CPU访存和DMA访存没有冲突。(1)若用中断方式,每次传送的开销(包括用于中断响应和处理的时间)是500个时钟周期。如果硬盘仅用5%的时间进行传送,那么处理器用在硬盘I/O操作上所花的时间百分比(主机占用率)为多少?(2)若用DMA方式,处理器用1000个时钟进行DMA传送初始化,在DMA完成后的中断处理需要500个时钟。如果每次DMA传送8000B的数据块,那么当硬盘进行传送的时间占100%(即:硬盘一直进行读写,并传输数据)时,处理器用在硬盘I/O操作上的时间百分比(主机占用率)为多少?想象一下:假定大仓库门口有一个箱子,可放16个零件。要将大仓库中的一批零件运到小仓库中,可以有几种方法?中断方式:每装满一个箱子就喊车床上的技工来运到车间,再从车间运到小仓库DMA方式:车床技工停下来告诉搬运工说,一次要8000个零件放到小仓库固定的地方,然后回到车床工作;搬运工开始分两组工作,一组从大仓库搬货到箱子中,另一组将箱子直接运到小仓库指定地方,搬完8000个后,搬运工告知技

    注意事项

    本文(ICS计算机基础教学课件第八章输入输出操作的实现.pptx)为本站会员(蓝****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开