由此,可以给出映射模块使用的算法。映射模块加载接口本体模型以及接口映射本体模型,解析模型中的每一个元素,分别生成本体图状模型(第1、2 行)。根据代码中定位到的系统调用,从本体映射模型中找到其与对应系统调用序列之间的映射类型(第3 行)。最后根据映射类型从接口映射本体模型中获取与之对应的系统调用序列中的每一个系统调用,并根据所获取的系统调用的名称从接口模型中获取系统调用的详细信息,恢复函数型构。
图22 给出的是算法的运行效果图,图中以灰色标注的是代码中使用的Windows API,在每一个Windows API后,都给出了在Linux操作系统之上与之实现相同功能的函数序列,函数序列中的每一个函数都给出了完整的函数型构,并且函数按调用顺序排列。由于也加载了Linux系统调用的本体模型,因此编辑器同样也对其中出现的每一个Linux系统调用进行了着色标注。
(www.xing528.com)
图22 系统调用映射算法运行效果图
这种实现的缺点在于,若同一个系统调用在代码中多次出现,则会对它进行多次重复的映射,导致效率低下。另外这种方法仍然需要程序员补充大量的代码,因为这里仅仅给出的是对应系统调用序列的函数型构,并没有给出对应的具体实现。即便是最简单的一对一的直接映射,若要将所有可能出现的情况都考虑到的话,也不是简单替换就能做到的。
仍以函数GetCurrentDirectory为例,Linux中函数getcwd 能实现与之相同的功能。但是二者还是略有差别,函数getcwd 会将当前工作目录的绝对路径复制到参数buf所指的内存空间,但是若绝对路径的字符长度超过参数size的大小,则会返回NULL,因此在修改代码时应当考虑内存空间不够大的情况。另外,操作系统支持的编码格式不同,在Windows中,API同时支持UNICODE和ANSI两种编码格式,但是Linux中,要实现对UNICODE的支持,在对字符进行处理时,需要用函数mbstowcs来替换函数strlen。最后还有必要考虑Windows中路径的格式与Linux中路径格式之间的细微差别。因此函数GetCurrentDirectory在Linux上的一个比较完整的实现应该如下所示。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。