汇编语言课件第5章软件接口技术.ppt
第5章 软件接口技术,本章的内容有:接口概述DOS和Windows下的接口调用方法COM编程技术,5.1 接口概述5.1.1 接口的功能,一般来说,由于CPU在与I/O设备进行数据交换时通常存在:速度不匹配,时序不匹配,信息格式不匹配信息类型不匹配,接口软件(驱动软件)的功能1接口初始化2分析与检查功能调用3完成相关硬件的功能调用4异常情况的处理,5.1.2 驱动软件的运行方式,1无条件同步方式2异步查询方式3中断方式,无条件同步方式可在任意时刻对硬件进行驱动,不必考虑硬件的接受能力这只有在硬件的执行速度很快,在任意时机都能响应驱动软件的驱动控制时才有可能。只在非常简单或速度非常高的系统中才可能存在。,异步查询方式 驱动程序应该对外设硬件的状态进行查询,在适当的时机进行硬件功能的驱动或结果的取回。使用异步查询方式时,外设硬件必须能根据硬件的运行情况,将状态送给驱动程序,以供驱动程序查询。由于驱动程序必须在程序中反复判断外设的硬件状态,等待硬件确定工作状态的到来,因此程序的运行效率不高。,中断方式 驱动程序分为两个部分第一部分负责对外设硬件的启动驱动,完成之后,这部分驱动程序就退出运行,CPU转而执行其他的应用程序第二部分:中断服务程序。透明地窃取应用程序的极少量执行时间。中断运行方式是效率最高的调用方式,但要求硬件必须有产生中断源的能力,并且需要占用系统的一些软、硬件中断控制资源。,5.1.3 接口缓冲区,1CPU中的通用寄存器适用于交互数据较少的情况,最快、最方便、最简单可靠的方式。2公用存储区公用存储区是由外设调用者和外设双方都可寻址的一块连续内存块,用于双方的数据交互。3堆栈堆栈是一种后进先出的数据结构。使用堆栈时,要特别注意栈中各个数据项的先后次序,以及堆栈指针的设置和恢复操作。,5.1.4 接口软件及层次结构,DOS,BIOS,硬件层,应用软件,应用环境,驱动软件,硬件层,应用软件,设备管理,用户空间,内核空间,B)Windows的调用层次,A)dos系统的调用层次,图5.2 设备调用层次,5.2 DOS系统下的接口调用,DOS系统是单用户的操作系统DOS系统提供给用户的编程界面大体有如下几种:裸机层软件开发,利用芯片或板卡(适配器)支持的寄存器或内存数据区编程。需要用户非常清楚设备的硬件细节,编程较复杂,但软件实现速度最快。BIOS级软件开发,利用BIOS基本输入输出系统所提供的一些服务功能编程。系统功能级软件开发,利用DOS系统提供的系统功能编程。,5.2.1 BIOS功能级软件接口及实现,1BIOS级软件接口概述 BIOS基本输入输出系统由一批子程序组成,负责管理系统内的输入输出设备直接为DOS操作系统和应用程序提供底层设备驱动服务。大多数的驱动程序以软件中断方式调用,少数由硬件中断调用。,表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返回打印机状态字节,5.2.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调用),3DOS功能调用实例,;利用9号功能显示字符串 MOVAX,MYDATAMOVDS,AXDISP:MOVDX,OFFSET MESSEGEMOVAH,09HINT21H;利用10号功能接收字符到缓冲区KEY:MOVDX,OFFSET PARAMETERSMOVAH,10INT21H,5.3 Windows下的接口调用,5.3.1 Windows的体系结构,5.3.2 Windows操作系统的内核进程,1Windows 9X的内核进程系统工作在基于Intel 32位CPU的硬件平台上,运行在32全位地址空间的保护模式下。系统核心进程空间工作在CPU的最高特权级0,用户空间工作在 CPU的低特权级3。系统核心进程是由虚拟设备驱动层VXD和虚拟机管理层VMM构成的,VXDVXD目的:为硬件提供多任务的支持,增强操作系统对于硬件设备的适应能力 VXD中的X是指某类设备(鼠标的虚拟设备驱动程序称为VMD,通过VMD就可直接驱动鼠标;键盘的虚拟设备驱动程序称为VKD)VMM 位于虚拟设备驱动层VXD之上 用户通过调用Win32的接口API函数,就可以通过VMM获得系统内核及设备驱动的功能服务,2Windows NT的内核进程,硬件抽象层微核层微核是一些被操作系统内核调用的微型软件模块微核的作用是为操作系统中所有低层次的通用功能提供支持,例如处理和发送中断,消息同步,存储和恢复线程环境等,每个设备驱动程序内都调用了大量的微核操作来完成自己的功能 可执行层 在可执行层内,除了有系统管理服务的分发、内存分页管理等操作系统的内核重要模块外,还包括一些操作系统的主要部件,可执行层I/O管理器对象管理器安全引用监视器进程管理器局部过程凋用内存管理器和高速缓冲管理器Win32支持部件,5.3.3 Windows NT的设备驱动调用,1设备驱动的调用过程,2设备驱动程序的接口模型,为了规范和统一设备驱动程序的外观和行为,使用驱动程序的接口模型。在该模型中,每当I/O管理器要驱动程序执行一个功能时,它就以一套特定的调用参数输入输出请求包IRP,以这个模型中的某类功能接口的入口,调用这些指定的功能。包括如下功能:,DriveEnty 驱动程序入口 Dispatch entry point 分发入口ISR(Interrupt Service Routine)中断服务程序入口DPC For ISR/Custom DPC 中断的延迟调用或定制延迟调用入口 DPC For ISR/Custom DPC 中断的延迟调用或定制延迟调用入口。Complete Request完成例程入口。CancelReinitializeStartIoUnloadIoTimerAdapterControlTime Dpc,3Windows的用户层进程,用户环境层用户程序层,模块的动态装载,4Windows的功能调用,Windows系统中,对于用户提出的设备使用请求,是通过调用Win32子系统中的API函数实现的。Windows 9X与Windows NT中的Win32子系统并不相同,两个子系统是相互独立的 Windows NT中,Win32子环境有两类:一类位于用户态空间,用户态API而另一类位于内核态空间,内核态API,5Windows的功能调用函数API的分类及特征,API分类窗口管理类API图形设备接口类API系统服务类APIWindows的API函数担负着为所有的应用程序提供所有的服务功能。它们的主要特征是:支持多任务采用模块化的结构支持动态装载链接,6API应用举例文件操作,建立文件函数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),7.API应用举例窗口操作,主程序函数:int PASCAL WinMain();主窗口的消息处理过程函数:LRESULT CALLBACK MainWndProc();文件装载函数:BOOL LoadBmpFile();注册窗口:BOOL RegisterClass();创建窗口:CreateWindow();使窗口可见:ShowWindow();窗口更新:UpdateWindow();消息接收:GetMessage()消息翻译:TranslateMessage();消息调度:DispatchMessage();,5.4 COM编程技术,COM(Component Object Model,组件对象模型)作为一个真正意义上的组件,应具备如下特征:实现了对开发语言的封装。以二进制形式发布。能够在不妨碍已有用户的情况下被升级。在网络上的位置必须能够被透明的重新分配。,5.4.1 COM对象,COM是面向对象的软件模型,在COM中,对象是某类组件的一个实例COM对象的应用者应用程序则称为客户每个COM组件对象都拥有一个以上的接口,COM对象可通过一个或多个接口与客户进行交互在COM模型中,由COM对象实现的每一个接口,都分别由一个128位的二进制全局统一标识符GUID(Globally Unique IDentifier)来标识。GUID是一个随机数,并不绝对保证唯一性,但发生标识符相重的可能性非常小。从理论上讲,如果一台机器每秒产生10 000 000个GUID,则可保证(概率意义上)3240年不重复。,5.4.2 COM接口,下面是一个GUID的例子。54BF6567-1007-11D1-B0AA-444553540000在C/C+中可以用这样的结构来描述:Typedef struct_GUID DWORD Data1;WORD Data2;WORD Data3;BYTE Data48;GUID,于是前面的GUID例子可以定义为extern C const GUID CLSID_MYSPELLCHECKER=0 x54BF6567,0 x 1007,0 x 11D1,0 x B0,0 x AA,0 x 44,0 x 45,0 x 53,0 x54,0 x00,0 x00COM库提供的API函数可产生GUID:HRESULT CoCreateGuid(GUID*pguid);如果GUID创建成功,则函数返回S_OK,并且pguid将指向所得到的GUID值。,5.4.2 COM接口,1从API到COM接口,平面型的API接口存在以下一些问题:当API函数非常多时,使用非常不方便,需要对函数进行组织。API函数需要标准化,按照统一的调用方式进行处理,以适应不同的语言编程实现,2COM接口的定义和标识,3COM接口的内存模型,COM对象往往有自己的属性数据,这些属性数据反映了对象的状态,也正是通过这些属性数据,才反映了对象与对象的不同.,4COM接口的特点,二进制特性接口的不变性继承性(扩展性)多态性运行过程中的多态性,5.4.3 IUnknown接口,COM定义的每一个接口都必须从IUnknown继承过来,其原因在于IUnknown接口提供了两个非常重要的特性:生存期控制接口查询 客户需要控制对象如果继续对对象进行操作,则它必须保证对象能一直存在于内存中;如果操作已经完成,以后也不再需要该对象了,则它必须及时地把对象释放掉,以提高资源的利用率,首先来看一下IUnknown的定义(IDL):interface IUnknown HRESULT QueryInterface(inREFIID iid,out void*ppv);ULONG AddRef(void);ULONG Release(void);QueryInterface用于查询COM对象的其他接口指针,AddRef和Release用于对引用计数进行操作,1引用计数,COM采用了“引用计数”技术来解决内存管理的问题,决定是否继续生存下去。“引用计数”是一个数值,该数值的含义为有多少个有效指针在引用该COM对象。当客户得到了一个指向该对象的接口指针时,引用计数值增1;当客户用完了该接口指针后,引用计数减1。当引用计数减到0时,COM对象就应该把自己从内存中清除掉。,2引用计数的实现,问题:在什么层次上进行引用计数呢?按照COM规范,一个COM组件可以实现多个COM对象,并且每个COM对象又可以支持多个COM接口,可以有以下三种方法:(1)组件引用计数(2)对象引用计数(3)接口引用计数,