WINCE6.0系统调用
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2012.04.12
类别:WINCE系统开发
********************************LoongEmbedded********************************
WINCE系统的调用处理流程如下图所示:
图1
1.coredll.dll的功能
WINCE系统的应用程序不能直接与WINCE操作系统或硬件打交道,在应用程序访问WINCE提供的服务的时候,就是先通过coredll.dll来进行的。
coredll的主要功能是负责应用程序与WINCE的通信以及完成WINCE的系统调用,它同时出现在用户模式和内核模式中(分别为coredll.dll和kcoredll.dll),coredll提供核心OS服务,使应用程序能访问WINCE6.0之下的计算资源,如文件系统、内存、设备、进程和线程等。应用程序也通过这些服务管理和监视其所要完成任务所需要的资源,通过它,应用程序之间还可以共享程序代码和其他数据信息。
2.kernel.dll
WINCE6.0操作系统内(kernel)在代码中的表现形式是kernel.dll(也就是kern.dll), WINCE5.0中内核的表现形式为NK.exe,而WINCE6.0中的NK.exe中仅仅包含一些OAL代码和保持兼容性的程序了。
内核提供任何WINCE6.0设备的基本OS功能,这些基本功能包括进程、线程和内存管理,另外内核也提供一些文件管理功能、线程调度、实时性能、装载器(loader)、系统调用、电源管理和OS提供的多种多样的服务。内核服务(service)使应用程序可以使用这些核心(core)功能。
3.nk.exe
NK.exe(就是oal.exe)是OAL层的进程,在OAL层启动的过程中加载kernel.dll,OAL是一个位于WINCE内核(kernel.dll)和目标硬件平台之间的代码层,它便于OS和目标设备的通信,而且包含了中断、定时器和一般IO控制码(IOCTLs)等的处理。
4.系统调用处理过程
系统调用是操作系统向应用程序提供的服务,一般以函数的形式提供(系统API函数),也就是说,当应用程序调用系统提供的API函数时,这就发生一次系统调用。
系统调用是一个属于另一个进程的功能,当发生系统调用的时候,coredll会通知kernel,然后kernel调用恰当的服务进程来处理此系统调用。每次系统调用会产生一个能够被kernel捕获到的异常:
⑴当一个进程产生一个系统调用,它直接调用coredll.dll中的一个包装(wrappper)函数(每次不同的系统调用对应调用不同的包装函数),这个包装函数为内核准备好函数的参数,接着产生一个软件异常,此异常可以是一个未定义地址异常或是一个CPU trap,这时,内核捕获到此软件异常后,CPU的执行权由应用程序转为kernel了。
⑵kernel接着处理此异常并且确定正确的目标进程来发送此函数调用请求给哪个exe文件,或是kernel本身就能拿实现这个函数调用请求。实现此函数的目标进程使用与调用进程最初的线程中相同的进程堆和注册表值来执行此函数。因为此函数调用存在于另一个进程,所以目标进程必须能够被证实存在于系统中,这样才能确保成功执行这次系统调用。
⑶在系统调用的时候,相同用户模式的线程运行在各自的优先级中,并且能够从调用进程迁移到实现此系统调用的进程中和从中返回。当一个线程迁移到另一个进程,它的访问权限被改变来匹配当前在运行的进程的访问权限。
4.1跨越kandi.exe、kernel.dll和gwes.dll的系统调用
图2
比如应用程序kandi.exe调用CreateWindow()的来创建一个窗口,就转化为调用coredll.dll中对应的包装函数CreateWindowExW(),然后coredll.dll产生一个软件异常,接着kernel.dll处理这个异常,并且kernel.dll会根据当前的函数调用请求来选择合适的进程来处理,这里CreateWindowExw()函数是在gwes.dll中实现的,所以kernel.dll就加载gwes.dll来执行此函数调用,这样gwes.dll就开始创建窗口,当窗口创建结束后依次返回,这样此次系统调用就结束了。
4.2跨越kandi.exe和coredll.dll的系统调用
图3
应用程序kandi.exe调用CreateProcess()函数来创建一个进程,就转化为调用coredll.dll中对应的包装函数xxx_CreateProcessW(),然后coredll.dll产生一个软件异常,接着kernel.dll处理这个异常,但因为xxx_CreateProcessW函数是在kernel.dll中实现,所以无须切换到其他服务进程中,只在kernel.dll中就可以完成进程的创建,然后返回并且结束此次系统调用。
4.3仅限kandi.exe中就可实现的系统调用
图4
应用程序kandi.exe调用CharLowerBuff()函数来转换字符串的大小,就转化为调用coredll.dll中对应的包装函数xxx_CreateProcessW(),但因为CharLowerBuffW函数是在coredll.dll中实现的,所以coredll.dll就不会产生软件异常,也无须进行服务进程的切换,而是在coredll.dll内就可以直接转换字符串的大小,然后返回并且结束此次系统调用。