CE5 vs CE6

主要区别

1、 进程地址空间由原来的32M,增大到1GB

2、 进程数量由32个,增大到32768个

3、 有内核态和用户态的驱动

4、 Device/Filesys/GWES,3大exe合并到内核中,变为DLL

5、 SetKMode、SetProcPermissions函数不再提供

6、 系统调度的效率提高了

 

1.   进程地址空间:

CE5是Slot机制,每个进程归属一个Slot,运行时候映射到Slot 0。下图为CE5的地址空间分布图

CE5 vs CE6_第1张图片

CE6改为更接近桌面PC的windows结构,每个进程现在有1GB的地址空间,进程数目也增大到32K个。经微软确认测试,CE6上可以有 2600进程同时运行。进程切换也接近桌面版本OS。每次进程切换时,TLB入口被刷新、I cache和D cache被无效、刷新页表。比较起CE5,进程切换的效率会有所降低 。下图为CE6的地址空间分布图

CE5 vs CE6_第2张图片

 

如图所示,进程空间有2GB,但是1GB是进程可用的。剩下的高端地址是共享的,主要是内核使用。共享内存部分,可用向后兼容CE5进程间文件共享。原来CE5的DLL空间保留32M,现在改为允许访问0x40000000开始的512M虚拟空间。这个新的特性,导致现在CE6进程之间不能互相看见,也就是无法通过API函数来直接互相访问。进程现在必须通过内核API来从其他进程获取数据。

 

2.  驱动改变:

CE6提供内核态和用户态的驱动,内核态驱动具备更好的健壮性和安全性。OEM可以防止第三方的驱动任意获取内核资源。OEM可以把支持的周边设备驱动, 做成内核态驱动发布。另外,OEM还可以允许加载已登记的第三方内核态驱动,否则只允许第三方驱动允许在用户态。CE6用户态驱动只能VirtualCopy在注册表中存在的地址,CE5则是可以随意VirtualCopy任意地址。

 

原本是用户态的Filesys.exe, device.exe和GWES.exe,现在是在内核态中了。系统无法使用SetKMode、SetProcPermissions等函数。因此CE5版本有调用过这些函数的驱动,必须修改。

 

3.  系统调度的效率

CE5中,一个系统调度从用户态的应用进程切换到内核服务进程,例如GWES。系统调度会在引起内核的事件触发,然后由内核切换到GWES进程。当GWES完成后,再由内核切换回应用进程。CE6中,GWES已经是内核的一部分,所以不再存在进程切换的动作,这个很类似桌面OS版本。如下:

 

CE5 vs CE6_第3张图片

 

CE5 vs CE6_第4张图片

 

CE6发布版本中,微软又增加了许多新技术和特性。因此名字也由Windows CE改为Windows Embedded CE。

 

CE6相对CE5最大的改进就是内存管理方面有了很多限制,这种限制对于高手来讲是限制,对于新手来讲可以保证整个系统的稳定性。
先拿内存分配和映射必用的一个API,VirtualCopy 说事。在CE4.2/5.0里面滚打多年的兄弟应该经常用这个函数吧。这个函数方便驱动应用 程序范围任何的物理地址,包括物理内存啊,设备控制器的寄存器啊,甚至GPIO也可以在AP里面随便拉上拉下。

这个函数虽然方便,但是并不安全,你想你好不容易把一个功能完善的image给build 出来了,结果碰到了一个写AP的“高手”,把你的寄存器和共享内存中的数据修改得一塌糊涂,最后报出bug来说你驱动的你会不会晕倒!

还好从CE6.0开始我们可以安枕无忧了,因为AP再也不能调用VirtualCopy函数来直接访问物理地址了,但因此带来了一些应用上的不便。

VirtualCopy的限制来源于CE6.0之后kernel的巨大变革 ,在CE5.0之前的Windows CE操作系统中,kenrel就仅仅是kern.exe(nk.exe),这个exe其实是OAL、KITL和Kernel三个的合体,nk.exe是运行于内核 模式(kernel mode),也就具有了访问特殊地址的权限,然后除此之外的代码默认都是运行于用户模式(user mode),所以它们的驱动和AP都是等级的,都在用户模式运行,要运行在kernel模式也可以,调用一个API SetKmode()就行了。因为驱动是肯定要访问物理地址的,所以CE5.0以前的OS都是运行用户模式的程式访问物理地址的,然后又为了方便做从物理地址到虚拟地址的映射,就提供了一系列的帮助函数,virtualcopy就是最常用的函数之一。

CE6.0开始,kernel模式变得比较正规,类似于台式机上的windows系统了,驱动和ap的权限是严格区分的,大部分的驱动程序运行在kernel模式,它们可以用virtualcopy读写物理地址对应的物理设备,但用户模式的AP将从此没有直接访问物理地址的权 限,virtualcopy每次调用都会失败返回。

在这里还要注意的是,其实并不是用户模式就不能使用virtualcopy,virtualcopy只是不能在用户模式的AP中使用,但是却还可以在用户模式的驱动使用,但是在用户模式的驱动中使用也有条件,那就是必须在对应的注册表 中设置可以访问的内存地址的范围才行。

在某些场合,一些特殊功能的AP确实需要访问物理地址的,比如设置保存物理内存指定位置的全局变量,开发 读写GPIO的测试工具 等等。在这种情况下一种简单的方法是实现一个最简单的跑在kernel模式的流驱动,提供一个deviceiocontrol的接口来帮助AP申请对应于物理内存地址的虚拟内存 地址。

 

附录:

•CE 5.0
–OAL + kernel = kern.exe (nk.exe)
–OAL + kernel + KITL = kernkitl.exe
–OAL + kernel + KITL + profiler = kernkitlprof.exe
•CE 6.0
–OAL = oal.exe (nk.exe)
–Kernel = kernel.dll
–KITL = kitl.dll
–No special compilation for profiling support

你可能感兴趣的:(windows,api,exe,测试工具,profiler,compilation)