《软件接口技术》PPT课件.ppt
第5章 软件接口技术,本章主要内容:软件接口概述DOS系统中的接口调用方法Windows系统中的接口调用方法Linux系统中的接口调用方法,5.1 软件接口概述,操作系统是用户与计算机硬件系统之间的接口,是人与计算机之间进行交流的桥梁,因此也称操作系统为“人机接口”。操作系统为用户提供了命令接口和程序接口两种操作方式。命令接口由操作命令及作业控制语言组成,它是管理和控制运行的程序,可以通过交互式方式直接或间接控制作业的运行。程序接口是由一组系统调用命令组成的,是操作系统提供给程序设计人员的接口。用户通过在应用程序中使用系统调用命令来请求操作系统提供服务。,系统调用命令(简称系统调用)是用户应用程序与计算机的接口,它是用户在程序设计中直接调用操作系统提供的一组功能子程序,是一种特殊的过程调用,一般借助一条特殊的机器指令(如软中断INT指令)来实现。系统调用过程如下:(1)把系统调用所需的参数或参数区首地址装入指定的通用寄存器,然后设置一条调用指令;(2)将系统调用的功能编号装入指定的通用寄存器中,有的系统直接在调用指令中将功能编号给出,有的系统将功能编号作为系统调用的参数;(3)当用户程序执行到调用指令时,产生访管中断(又称软件中断),系统处理该中断,即为用户程序保留“现场”,然后提取系统调用编号,访问系统调用入口表,找到相应子程序入口地址转去执行;(4)系统调用命令执行返回,恢复“现场”,并把返回参数或参数区首地址放入指定的通用寄存器中,以供用户程序使用。与中断一样,系统调用也可以实现嵌套调用。,系统调用分为:(1)与进程有关的系统调用(2)与存储管理有关的系统调用(3)与文件管理有关的系统调用(4)与设备管理有关的系统调用(5)访问系统核心数据的系统调用(6)控制类的系统调用,5.2 接口软件及层次结构,DOS,BIOS,硬件层,应用软件,应用环境,驱动软件,硬件层,应用软件,设备管理,用户空间,内核空间,B)Windows的调用层次,A)dos系统的调用层次,图5.2 设备调用层次,5.3 DOS系统下的接口调用,DOS系统是单用户的操作系统DOS系统提供给用户的编程界面,大体有如下几种:裸机层软件开发,利用芯片或板卡(适配器)支持的寄存器或内存数据区编程。需要用户非常清楚设备的硬件细节,编程较复杂,但软件实现速度最快。BIOS级软件开发,利用BIOS基本输入输出系统所提供的一些服务功能编程。系统功能级软件开发,利用DOS系统提供的系统功能编程。,5.3.1 BIOS中断调用及实现,1BIOS级软件接口(中断调用)概述 BIOS基本输入输出系统由一批子程序组成,负责管理系统内的输入输出设备直接为DOS操作系统和应用程序提供底层设备驱动服务。大多数的驱动程序以软件中断方式调用,少数由硬件中断调用。,基本步骤为:(1)设置分功能号:按实现的操作功能的要求,给指定寄存器(通常为AH)送入分功能号。(2)置入口参数:按操作要求,给寄存器填写相应参数的内容(某些调用无参数)。(3)使用中断语句INT n:执行调用的功能,其中n为中断号。(4)分析出口参数。,1)BIOS调用的基本操作,表5.1 常用BIOS服务功能,2视频服务,INT l0HAH寄存器选择视频服务功能 待写的字符或像素值一般在AL寄存器中传递。功能调用保存BX、CX、DX及段寄存器的值。其他寄存器的内容(特别是SI、DI)不保存 X坐标(列号)在CX(图形功能)中或DL(正文功能)中传递 显示页在BH中传递,显示页从零开始计数,例如:利用BIOS视频服务的AH=0CH子功能实现写像素点。调用子程序之前,需要用DX保存行号,CX保存列号,AL保存颜色值,这是0CH子功能要求的。WRITINGPIXEL PROCNEARPUSHAX MOVAH,0CHINT10HPOPAXWRITINGPIXELENDP,3键盘服务,键盘ISR(键盘中断服务程序)INT 09H硬件中断键盘DSR(键盘设备服务程序),INT 16H软件中断BIOS键盘服务包括3个子功能:0号功能、1号功能、2号功能,4并行打印机服务,INT 17H 0号功能(给打印机传送个字符)1号功能(初始化打印机)2号功能(读打印机状态)均可通过AH返回打印机状态字节,BIOS I7H号中断指令提供了由AH寄存器指定的三种不同的操作。(1)BIOS中断17H号的功能0是打印一个字符。要打印输出的字符放在AL中,打印机号放在DX中,BIOS最多允许连接三台打印机,机号分别为0,1和2。如果只有一台打印机,那么就是0号打印机,打印机的状态信息被回送到AH寄存器。MOVAH,0;请求打印MOVAL,CHAR;写入打印字符MOVDX,0;设置0#打印口INT17H;调用BIOS,(2)17H号的功能1是初始化打印机并回送打印机状态到AH寄存器。如果把打印机开关关上然后又打开,打印机各部分就复位到初始值。此功能和打开打印机时的作用一样。在每个程序的初始化部分可以用17H号的功能1来初始化打印机。MOVAH,01;初始化打印机MOVDX,0;设置0#打印口INT17H;调用BIOS,BIOS串行通信口功能 通过INT 14H调用ROM BIOS串行通信口中断服务程序。该中断服务程序包括将串行口初始化为指定的字节结构和传输速率,检查控制器的状态,读/写字符等功能。,表 串行通信口BIOS功能(INT 14H),图 串行通信口初始化参数,【例】要求0号通信口的传输率为2400波特,字长为8位,终止位为1位,无奇偶校验。MOV AH,0;串行通信口初始化MOV AL,0A3H;0A3H=10100011BMOV DX,0;指向COM1INT 14H;调用BIOS,5.3.2 DOS功能级软件接口及调用实例,1DOS功能级软件接口调用概述主要包括:磁盘管理、内存管理、基本输入输出管理等。子功能都有一个00H57H的功能编号 INT 21H,00H0CH:字符I/O管理。包括键盘、显示器、打印机、异步通信口的管理0DH24H:文件管理。包括复位、选择磁盘,打开、关闭、删除文件,顺序读、写文件,建立文件,重命名文件,查找驱动器分配表信息,随机读、写文件,查看文件长度25H26H:非设备系统调用。包括设置中断向量,建立新程序段27H29H:文件管理。包括随机块读写、分析文件名2AH2EH:非设备系统调用。包括读取、设置日期、时间2FH38H:扩充的系统调用。包括读取DOS版本号,终止进程,读取中断矢量,读取磁盘空闲空间39H3BH:目录组。包括建立子目录,修改当前目录,删除目录项,3CH46H:扩充的文件管理。包括建立、打开、关闭文件,从文件或设备读写数据,在指定路径删除、移动文件,修改文件属性,设备I/O控制,复制文件标志47H取当前目录组。48H4BH:扩充的内存管理。包括分配内存、释放已分配的内存、分配内存块、装入或执行程序等4CH4FH:扩充的系统调用。包括终止进程、查询子程序的返回代码、查找第一个相匹配的文件、查找下一个相匹配的文件50H53H:扩充的系统调用。供DOS内部使用54H57H:扩充的系统调用。包括读取校验状态、重新命名文件、设置读取日期及时间,2基本I/O功能调用,键盘输入(1号调用)无回显的键盘输入(8号调用)控制台输入输出(6号调用)无回显的控制台输入(7号调用)打印输出(5号调用)输出字符串(9号调用)输入字符串(0AH调用)异步通信输入输出(3、4号调用)日期与时间的设置与获取(2AH、2BH、2CH、2DH调用),系统功能调用(INT 21H)的使用方法如下:,3DOS功能调用实例,;利用9号功能显示字符串 MOVAX,MYDATAMOVDS,AXDISP:MOVDX,OFFSET MESSEGEMOVAH,09HINT21H;利用10号功能接收字符到缓冲区KEY:MOVDX,OFFSET PARAMETERSMOVAH,10INT21H,5.4 Windows下的接口调用,5.4.1 Windows的体系结构,5.4.2 Windows操作系统的内核进程,1Windows 9X的内核进程系统工作在基于Intel 32位CPU的硬件平台上,运行在32全位地址空间的保护模式下。系统核心进程空间工作在CPU的最高特权级0,用户空间工作在 CPU的低特权级3。系统核心进程是由虚拟设备驱动层VXD和虚拟机管理层VMM构成的,5.4.2 Windows系统中用户态到内核态的转换过程,首先,这些API函数要将用户程序的请求转换为对内核态I/O系统服务的请求然后,设备驱动程序将结果交给I/O管理器,由I/O管理器转换CPU运行空间,将处理结果返回给Win32 API函数,最终由所请求的Win32 API将结果交给用户。,5.4.3 Windows的系统调用在Windows系统中,对于用户提出的设备使用请求,是通过调用Win32子系统中的API函数实现的。,Windows的功能调用,Windows系统中,对于用户提出的设备使用请求,是通过调用Win32子系统中的API函数实现的。Windows 9X与Windows NT中的Win32子系统并不相同,两个子系统是相互独立的 Windows NT中,Win32子环境有两类:一类位于用户态空间,用户态API而另一类位于内核态空间,内核态API,5.4.4 Windows的功能调用函数API的分类及特征,API分类窗口管理类API图形设备接口类API系统服务类APIWindows的API函数担负着为所有的应用程序提供所有的服务功能。它们的主要特征是:支持多任务采用模块化的结构支持动态装载链接,5.4.5 API应用举例 1.Windows关于文件操作的主要API接口函数,建立文件函数CreatFile 文件打开操作函数HFILE_lopen HFILE_lopen(LPCSTR lpPathName,int iReadWrite)文件建立操作函数HFILE_lcreat HFILE_lcreat(LPCSTR lpPathName,int iAttribute)移动文件的读写指针函数SetFilePoint DWORD SetFilePoint(HANDLE hFile,LONG iDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod)移动文件指针操作函数LONG_llseek LONG_llseek(HFILE hFile,LONG LOffset,int LOrigin)读文件函数ReadFile及写文件函数WriteFile,HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpsecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributrs,HADEL hTemplateFile),BOOL ReadFile(HANDLE hFile,LPVOID ipBuffer,DWORD nNumberOfByteToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped)BOOL WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumderOfBytesToWrite,LPDWORD lpNumberOfBytesWrite,LPOVERLAPPED lpOverlapped),文件读操作函数UINT_lread及文件写操作函数UINT_ lwrite UINT_lread(HFILE hFile,LPVOID lpBuffer,UINT uBytes)UINT_ lwrite(HFILE hFile,LPCSTR lpBuffer,UINT uBytes)关闭对象句柄函数CloseHandle及文件关闭操作函数HFILE_lclose BOOL CloseHandle(HANDLE hObject)HFILE_lclose(HFILE hFile)内存空间分配函数GlobalAlloc HGLOBAL GlobalAlloc(Uint uFlags,DWORD dwBytes)锁定一个全局内存对象函数GlobalLock LPVOID GlobalLock(HGLOBAL hMem),2.应用举例 下面的例子是调用Windows操作系统的文件服务功能,打开一个文件,将文件头部1000个字节后的内容读入缓冲区中的一段程序。BOOL LoadFile(char*FileName)HFILE hf;/定义文件句柄变量 long hFilesize;/文件长度 HGLOBAL hFhandle;/内存分配句柄 LPVOID hFileBuffer;/内存缓冲区指针/按文件名打开文件,若文件不存在,失败返回 if(hf=_lopen(Filename,OF_READ)=HFILE_ERROR)MessageBox(hWnd,File not found!,Error Message,MB_OK|MB_ICONEXCLAMATION);return FALSE;,/打开文件后,文件的前两个字是文件长度 _lread(hf,(LPCSTR)&hFilesize,sizeof(DWORD);/得到文件长度 hFilesize-=1000;/长度减去1000字节/请求系统分配文件大小的内存,若不能分配,失败返回 if(hFhandle=GlobalAlloc(GHND,hFilesize)=NULL)MessageBox(hWnd,Error alloc memory!,Error Message,MB_OK|MB_ICONEXCLAMATION);_lclose(hf);return FALSE;hFileBuffer=GlobalLock(hFhandle);/得到分配的内存首地址,_lseek(hf,(LONG)1000,FILE_BEGIN);/将指针从头向后移动1000B _lread(hf,(LPCSTR)hFileBuffer,hFilesize);/读文件 _lclose(hf);/读完关闭文件 returnTRUE;/返回,5.5 Linux下的接口调用,5.5.1 Linux操作系统简介1概述Linux的主要特点是:1)完全支持POSIX 1003.1(Portable Operating System Interface可移植操作系统接口)标准,任何操作系统只有符合这一标准,才有可能运行Unix程序;2)支持多用户访问和多任务编程;3)采用页式虚拟存储管理,使Linux能更有效地利用物理存储空间,页面的换入换出为用户提供了更大的存储空间;4)支持动态链接;5)支持多种文件系统;6)支持TCP/IP、SLIP和PPP,用户可以使用所有的网络服务,如网络文件系统、远程登录以及支持串行线上的 TCP/IP协议的使用等。,Linux不仅通过Shell(面向命令行)和X Window(面向图形界面)为用户提供了交互式用户界面,它同时还通过各种系统调用为应用系统和进程提供了编程接口。,2体系结构,图 5.6 Linux 操作系统的基本体系结构,3.Linux的内核结构Linux内核主要由五个子系统组成:进程调度内存管理虚拟文件系统网络接口进程间通信。,各个子系统之间的依赖关系如下:进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事情,就是将程序和数据装入内存。进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持RAMDISK设备。内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。,4.Linux 内核的一些有用特性Linux 支持大量网络协议,包括典型的 TCP/IP,以及高速网络的扩展(大于 1 Gigabit Ethernet(GbE)和 10 GbE)。Linux 也可以支持诸如流控制传输协议(SCTP),它提供了很多比 TCP 更高级的特性(是传输层协议的接替者)。Linux 还是一个动态内核,支持动态添加或删除软件组件。被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。Linux内核虚拟机(KVM)是构成主流 Linux 内核的第一个虚拟化解决方案,它是一项比较新的技术,目前正在被大量使用。KVM 所使用的方法是通过简单地加载内核模块而将 Linux 内核转换为一个系统管理程序。,5.5.2 Linux系统调用的实现及过程1系统调用的作用系统调用在Linux系统中发挥着巨大的作用,如果没有系统调用,那么用户就不能利用内核,应用程序就失去了内核的支持。在编程时用到的很多函数,如fork、open等最终都是在系统调用里实现的。如在一个程序里用到了fork和exit,它们都是glibc中的函数,如果跟踪这些函数的执行过程,可以发现在glibc的实现代码里,都是采用软中断的方式陷入到内核中再通过系统调用实现函数的功能的。,2Linux系统的一些保护机制Linux系统在CPU的保护模式下提供了四个特权级别,目前内核都只用到了其中的两个特权级别,分别为“特权级0”和“特权级3”,级别0也就是我们通常所讲的内核模式,级别3也就是我们通常所讲的用户模式。划分这两个级别主要是对系统提供保护。内核模式可以执行一些特权指令和进入用户模式,而用户模式则不能。这里特别提出的是,内核模式与用户模式分别使用自己的堆栈,当发生模式切换的时候同时要进行堆栈的切换。,3Linux系统调用机制,图5.7 系统调用过程流程,(1)系统调用的数据结构和函数(2)系统调用功能的初始化和系统调用的中断陷入(3)系统调用服务的提供和返回,5.5.3 Linux的系统调用函数和函数调用,在Linux操作系统中应用程序的接口即API包含两部分,分别是用户层的库函数(glibc)和系统调用.库函数实现用户应用程序和系统调用的接口 系统调用进一步实现了应用程序与系统的接口,进而访问计算机硬件。也可以说库函数是用户层的API,系统调用是核心层的API。,在LINUX系统下,利用系统调用完成一个简易的拷贝程序。#include#include#include#include#define PERMS 0666#define DUMMY 0#define BUFSIZE 1024 main(argc,argv)int argc;char*argv;int source fd,target fd,num;char iobuffer BUFFERSIZE;if(argc!=3)fputs(“usage:copy source target”,stdout);exit(1);,if(source fd=open(*(argv+!),O RDONLY0)if(write(target fd,iobuffer,num)!=num)fputs(“target file write error”,stdout);exit(4);close(source fd);close(target fd);exit(0);,在LINUX系统下,利用函数调用完成一个简易的拷贝程序。#include main(argc,argv)int argc;char argv;FILE in,out;char ch;if(argc!=3)printf(“you forgot to enter a filename m”);exit(0);if(in=fopen(argv1,”r”)=MULL)printf(“cannot open infile n”);exit(0);if(out=fopen(argv2,”w”)=NULL)printf(“can not open outfile n”);exit(0);while(!feof(in)fread(,小 结,在计算机系统中,设备的使用方式与操作系统的性质有着密切的关系。在单用户操作系统中,由于用户对资源的使用是独占式的,故用户对设备的使用是任意的,用户进程可以跨越操作系统的层次对设备进行直接驱动,在多任务或者多用户的操作系统中,设备资源的使用是各个用户或任务共享的,所以用户不能跨越操作系统的管理层对设备进行操作。在单用户、单任务的DOS操作系统中,系统的调用接口可在基本I/O的BIOS层及DOS操作系统层进行。本章列举了视频显示、键盘输入、文件操作以及打印机驱动等这些典型接口,通过简单程序的例子,对这些接口的功能和调用方法进行了说明。,Windows系统是被广泛使用的图形界面、多任务的操作系统。通过对Windows体系结构的介绍,系统地介绍了Windows设备驱动程序的构成原理,Windows系统的软件结构,接口的功能和层次,以及如何通过Windows系统的类或应用编程接口的调用,编写Windows应用程序的方法。由于Windows系统的复杂和功能的强大,系统接口的API函数数量极多。本章通过简单的程序例子,对应用编程接口API函数的文件和窗口操作中的部分功能调用进行了说明。其它的功能调用,请参考有关的API函数说明。Linux操作系统作为开放源码的自由软件的代表,近些年来发展迅猛,尤其是在中高端服务器上得到了广泛的应用。本章从Linux的体系结构的介绍入手,系统地介绍用户态到内核态的转换过程,详细讲解了用户应用程序与系统内核及更底层硬件的接口方法,通过简单的例子分析了用户应用程序分别通过用户态的函数调用和系统内核态系统调用与系统接口的方法。,小 结,