********************************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内就可以直接转换字符串的大小,然后返回并且结束此次系统调用。

WINCE6.0系统调用相关推荐

  1. WINCE6.0操作系统---内核(kernel)学习

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  2. WINCE6.0体系结构学习

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  3. WINCE5.0和WINCE6.0的内存与系统架构

    WINCE5.0和WINCE6.0的内存与系统架构 http://topic.csdn.net/u/20090410/14/75bba2cb-cefc-4ca5-b4f5-4165bbf16006.h ...

  4. WinCE6.0 修改开机Logo方法集锦(二)

       中秋假期已过,回来继续该博文主题.今天讲解第二种方法,将Logo图片的数据写入到Nand Flash中,在启动初始化LCD的时候,从固定的地址将数据读出并填充到显示缓存中.<?xml:na ...

  5. 跟踪分析Linux内核5.0系统调用处理过程

    跟踪分析Linux内核5.0系统调用处理过程 学号384 原创作业转载请注明出处+中国科学技术大学孟宁老师的Linux操作系统分析 https://github.com/mengning/linuxk ...

  6. WINCE6.0组件选择说明

    WINCE6.0组件选择说明 图1 RAS/PPP组件前面的√标识表示我们手动选择,TAPI2.0前面的■标识表示选组件时根据依赖关系自动选择的,PPPoE前面的□标识组件没有选择.

  7. wince6.0 编译报错:error C2220: warning treated as error - no 'object' file generated的解决办法

    内容提要:wince6.0编译报错:"error C2220: warning treated as error - no 'object' file generated" 原因是 ...

  8. WIN7 64位系统搭建WINCE6.0系统遇到的问题

    WIN7 64位系统搭建WINCE6.0系统遇到的问题 安装顺序如下: 1.先装Visual Studio2005: 2.安装Visual Studio2005 Service Pack 1: 3.安 ...

  9. WINCE6.0远程桌面显示修改

    备注:用RDP表示远程桌面 WINCE6.0自带的远程桌面在我们显示屏分辨率为240*320上有一部分内容无法显示出来,所以就需要调整界面让这些内容可见. 1.      PB6.0不支持对远程桌面资 ...

最新文章

  1. Altiumnbsp;designernbsp;学习教程
  2. 无公网ip远程访问调试-内网穿透工具
  3. springboot注释详解
  4. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (三)Nginx负载均衡配置...
  5. RegisterWindowMessage
  6. SpringBoot笔记7:使用JavaMail结合RabbitMQ发送邮件
  7. go的string正则匹配_Go正则匹配 regexp | Go
  8. 华硕老毛子(Padavan)——校园网锐捷(Ruijie)认证路由限制解决方案(锐捷(Ruijie)认证+赛尔认证)
  9. 华为网络工程师认证有哪些?值不值得考?
  10. android 解谜 游戏,Android解谜游戏《100个任务》图文攻略
  11. 单龙芯3A3000-7A1000PMON研究学习-(30)撸起袖子干-再来一杯代码11-内存初始化3-mc_init
  12. 粉丝投稿!分享自己的携程后台一面+二面+HR面,希望对大家有帮助!
  13. 一篇文章学会二进制的运算以及原码、反码、补码
  14. 系统学习金融数据挖掘 之爬虫技术基础(附源代码)(网页结构基础)
  15. 史上最全的Altium Designer 20安装教程
  16. HTML写表格记录(二)--如何在HTML中表达“>“,“<“大于号小于号,以及<b>的意思
  17. 【dp】The King‘s Ups and Downs
  18. 2022/1/22记录网页
  19. Java利用Socket进行数据读写
  20. 必备元器件知识1——电阻

热门文章

  1. 040_Unicode对照表六
  2. 006_P名称空间的属性注入
  3. 068_xhtml语法
  4. Linux shell 基础语法
  5. 根号三的用计算机怎么表示,计算器根号3怎么打
  6. http路径转file会变成反斜杠_PHP session反序列化漏洞
  7. CentOS 迎来更新换代版本 CentOS Stream 9 附下载镜像OS地址
  8. python绘制函数怎么去掉原点_python – 更改绘图的原点
  9. toybox执行linux程序,VirtualBox 的命令行用法
  10. java swing 页面布局方式_javaswing酷炫界面