关于wince核心的一点认识(未验证)

      在wince5.0下,有一些服务是靠进程来实现的,比如filesys.exe device.exe gwes.exe,当我们需要提供服务的时候是怎么做到的呢?

 

      在说明这个问题之前先说一下DLL和EXE,它们结构很相近,都有输出和输入函数表,不同的是DLL没有堆栈信息,需要依附于EXE。我们知道DLL就是一些函数的集合,供别人使用,没有大循环,但是EXE,也就是最后变成一个进程,它至少有一个线程在大循环,但是没有关系啊,除了这个或多个大循环,它也可以包含许多服务的函数,尽管这些函数不在大循环里(其实线程不也是一个函数么?不过带个死循环罢了)

 

      当我们在用户进程调用一个API函数,首先进入CoreDLL.DLL,如果不能提供服务则自陷进入系统模式,这个自陷好像不是软件中断,而是靠取指错误,具体是访问一个不允许的地址,进入异常(特权模式),在异常处理中检测是真异常还是系统调用,如果是调用,则根据系统调用号,在一个固定地址开始查表,得到函数的真正地址(file.exe device.exe gwes.exe中的函数)由此得到了服务。

 

      困惑产生于file.exe device.exe gwes.exe的EXE属性,其实EXE不过比DLL多了线程函数和堆栈罢了,除此之外都是函数和数据的集合。只要得到地址就可以使用它们中函数的服务。wince利用这种方法避免在进程之间来回切换造成系统开销,不过在使用filesys.exe等服务的时候还是要把地址映射到slot0的吧。至于为什么它们搞成单独的进程,应该是它们有时候也需要单独作为进程来执行吧,所以它们有2个作用:1。自己要主动做事 2。提供系统函数服务  这个好像在wince6.0里分开了。

 

      还有一个普遍的问题,不同“函数集合”编译后地址不同,加载后地址也不同,那么如何找到它们?答案是:重定位和固定地址的表,虽然我不知道他们随机的地址,但是把它们随机的地址放到一个固定地址表的固定位置,那么我去这里找就能找到,每个“函数集合”都有输入输出表,加载的时候扫描他们,填到表里不就行了?这个是不是就是动态链接?

 

 

      关于“函数集合”这个概念,我是这样给出解释的,计算机能够执行,不过就是在某处取指令,然后某处取数据,按照指令运算,然后把结果放到某处,所以只要有函数地址,有堆栈和RAM,就能执行,至于这些函数按照什么形式存放(.exe或.dll等等)其实无所谓,举个例子,我们把DLL加载到EXE中,也就是进程空间,不是一样可以执行么,它和大循环一点关系没有,和大循环之外的函数地位不是一样的么?只要得到地址就能执行。不要被大循环迷惑了。大循环不也是一个函数么?不过执行时间更长罢了!

你可能感兴趣的:(api,dll,exe,WinCE)