在Linux内核中实现仿Windows系统调用机制的方法

文档序号:6341289阅读:337来源:国知局
专利名称:在Linux内核中实现仿Windows系统调用机制的方法
技术领域
本发明涉及计算机操作系统领域,尤其是一种在Linux内核中实现仿Windows系 统调用机制的方法。
背景技术
操作系统相当于计算机的灵魂,任何计算机都离不开操作系统,同时也都受操作 系统的限制,所有的应用软件都是基于某种特定操作系统的,都只能在这种特定的操作系 统上运行,搬到别的操作系统上就不能运行。操作系统的核心称为“内核”,内核为应用软 件提供特定的运行环境、并提供基本的操作能力,应用软件对这些基本操作能力的调用称 为“系统调用”。尽管不同操作系统所提供的基本操作能力在总体上颇为相似,但每个操作 系统内核所提供的系统调用及其集合却又都是独特的,不能混用。所以,凡是应用软件都 是基于特定操作系统内核的,或者说都是与特定操作系统内核绑定的,Windows应用只能在 Windows内核上运行,而Linux应用也只能在Linux内核上运行。如果能让Windows应用软件直接在Linux操作系统即Linux内核上运行,那么用 户就有可能摆脱对Windows操作系统的依赖、而改用Linux操作系统,这显然是很有意义 的。然而要实现这个目标就必须解决让Linux内核支持Windows系统调用的问题。解决这个问题的总的思路是首先在Linux内核中实现Windows系统调用的机制; 然后逐个将Windows的系统调用嫁接到与之对应的Linux系统调用上,再加以必要的修改, 如果没有对应的Linux系统调用就在Linux内核中加以实现。所谓“系统调用的机制”,是 指 应用软件在用户态怎样发起系统调用; 程序流程怎样进入内核、即进入系统态; 内核中与具体系统调用无关、为所有系统调用所共有的操作和活动; 程序流程怎样进入具体的系统调用、即内核中用来实现具体系统调用的功能的 函数; 怎样返回到用户态。可见,在Linux内核中实现Windows系统调用的机制,是要实现上述目标的第一个 必要条件。而本发明所述的方法,其目的就在于解决系统调用机制的问题。而本发明的内容和特点就是提供一种在Linux内核中实现Windows系统调用机 制的方法,使得让Linux内核支持Windows系统调用成为可能。

发明内容
在Linux中,系统调用是通过一条int指令启动的,这是一条“软件中断”指令,这 是对中断机制的一种模拟,CPU执行这条指令时就好像发生了一次中断一样。为此,在int 指令中必须带上一个“中断向量”、或者说“中断号”,在Linux中这个中断向量是0x80。在 Windows中也是一样,但中断向量是0x2e。每当CPU执行int指令时,其运行状态就从“用
3户态”跳转到“系统态”,这就是所谓进入了内核。进入内核之后,CPU从用户态堆栈中读取 “系统调用号”及有关参数,系统调用号用来表明具体的系统调用。但是,同样的系统调用号 在不同操作系统中的意义是不同的,不能混淆。要在Linux内核中增加一种系统调用机制,方法是很多的。例如,可以在Linux 的中断机制中增添一种系统调用,比方说“wind0WS_Call”,再在那里展开成系统调用机制。 又例如,在/proc下面可以增添一个特殊的文件系统节点“Wind0WS_call”,再在其驱动程 序中展开成系统调用机制机制。当然,这样一来启动系统调用的方式就与Windows中不同 了,但是按理说这样问题也不大,只是效率略为降低了一点,因为应用程序按理说都不会直 接启动系统调用,而是按Windows API的规定转辗调用动态连接库Ntdll.dll,在这个DLL 内部才发起系统调用。但是,有可能违反这个规定的 恰恰是微软自己。据网上的讨论,微软 有可能隐藏着几个系统调用不向第三方开放,而自己的某些应用软件却可以不经过Ntdll. dll,在应用软件的代码中直接通过“int 0x2e”指令加以调用。由于微软的软件都是不开 源的“黑盒子”,此说既无法证实也无法否定。所以,为最大程度地维持兼容性,最好还是像 Windows 一样,实现基于“int 0x2e”指令的Windows系统调用机制。Linux是开源软件,其内核的程序代码都是公开的,可以按需要加以修改、增删、和 剪贴。Windows内核的程序代码则不公开,但是多年来已有很多人致力于Windows内核的研 究,并创建了一个开源项目ReactOS,目的是要开发一个开源的“仿Windows”。虽然这个开 源的仿Windows内核从总体上说还不完整、还不成熟,但是这里面也有基于“int 0x2e”指 令的仿Windows系统调用机制,其代码是可以剪贴的。经研究,这些用来实现Windows系统 调用机制的代码还是比较成熟的。但是,将ReactOS中用来实现Windows系统调用机制的代码简单地剪贴到Linux 内核中是不行的,因为0x2e这个中断向量在Linux内核中可能被分配用于外部(硬件)中 断,这样就可能发生冲突。这个问题不解决,就无法在Linux内核中实现基于“int 0x2e” 指令的仿Windows系统调用机制。本发明采用的方法是IdfSLinux内核的代码,保留从0x20_0x2f范围中的中断向量,使Linux内核不 会将中断向量0x2e分配用于外部中断。2、将ReactOS中所实现仿Windows系统调用机制的代码移植到Linux内核中,如 有需要再加以必要的修改。这里第2条所说的将ReactOS中所实现仿Windows系统调用机制的代码剪贴到 Linux内核的代码中,实际上实现时也可以不是直接剪贴到Linux内核的代码中,而是单独 做成一个可动态安装的模块(Module)、即.so模块,在运行时动态加以安装。为Linux内核 开发动态安装模块的步骤和方法可参考“Linux Device Drivers”一书。本发明有益的效果是本发明提供了一种方法,使得可以在Linux内核中实现基 于“intOX2e”指令的仿Windows系统调用机制,解决了使Linux内核支持Windows应用的 首要条件。


附图1是Linux操作系统的结构示意图。
附图2是Windows操作系统的结构示意图。附图3是按本发明所述方法在Linux内核中实现基于“ int 0x2e ”指令的仿 Windows系统结构机制后的结构示意图。附图4是系统调用跳转表示意图。
具体实施例方式下面结合附图和实施例对本发明作进一步说明附图1是Linux操作系统的结构示意图。图中的Linux应用(软件)运行于Linux 内核之上,每当需要调用某个Linux系统调用时就通过“int 0x80”指令进入内核,具体的 系统调用号和参数则通过堆栈传递。内核中则有个系统调用机制,处理一些与具体系统调 用无关、为所有系统调用所共有的操作和活动,然后根据系统调用号调用具体的内核函数。 从用来实现具体系统调用的内核函数返回之后,又由系统调用机制中的代码助理一些(通 过iret指令)返回用户态的准备。附图2是Windows操作系统的结构示意图。Windows应用软件按规定不直接与 内核打交道,而是按照一个称为“Win32API”的界面的规定调用一群“系统DLL”所提供的 "API函数”,然后在具体API函数的内部转辗调用至Ntdll.dll中的某个函数,再由那个函 数通过“int 0x2e”指令启动对内核的系统调用。但是这并不排除应用软件直接通过“int 0x2e”指令启动系统调用的可能。在Windows内核之中,则同样也有个系统调用机制,在结 构上与Linux内核类同,流程也大体相仿,但又有显著的差别。开源软件ReactOS是个仿 Windows内核,其系统调用机制在功能上和结构上都与Windows的系统调用机制相同,但是 具体的程序代码不同。附图3是在Linux内核中实现仿Windows系统调用机制以后的示意图。在这个内 核上既可运行Linux应用,也可运行Windows内核,各自通过“int 0x80”和“int 0x2e”指 令进行系统调用。在Linux内核中,经过仿Windows系统调用机制的处理以后所调用的函 数、即用来实现具体Windows系统调用的函数,实际上都是通过一个“适配层”嫁接到相应 的Linux内核函数,但是具体的Windows系统调用怎样实现、怎样嫁接到什么Linux内核函 数不属于本发明所述方法的范畴,本发明只提供怎样在Linux内核中实现基于“int 0x2e" 指令的仿Windows系统调用机制的方法。附图4说明内核中怎样根据具体的系统调用号跳转到具体的内核函数。图中的系 统调用跳转表是个指针数组,这个数组以系统调用号、或者经过某种运算或变换后的系统 调用号为下标。这样,根据系统调用号就可从系统调用跳转表中获取一个指针,这就是相应 内核函数的入口地址。本方法的具体实施涉及对Linux内核源代码的修改,和对ReactOS部分源代码的 移植,这二者都是开源软件,其源代码可从有关网站获取。下面分两个方面说明本方法的一个实施例。注意同一个方法可以有多种不同的实 施,这里所提供的只是其中之一。1、修改Linux内核的源代码,保留0x20-0x2f范围中的中断向量不被分配用于外 部中断在Linux内核源代码中,有个文件arch\x86\include\asm\irq_vectors. h,里面有 一些常数的定义需要加以改变。首先是FIRST_EXTERNAL_VECTOR,这个常数规定了内核可供内核自由分配的中断向量的起点,原来这个起点是0x20 #define FIRST_EXTERNAL_VECTOR 0x20现在,由于要将中断向量0x2e保留用于Windows系统调用,就把这个起点往后推, 推到0x2e以后,例如推到0x30 #define FIRST_EXTERNAL_VECTOR 0x30其实,不改变这个常数也是可以的,但是那样就要修改实施动态分配中断向量的 代码,使其跳过0x2e,那还不如改变这个常数的定义来得简单。虽然这样一来可供动态分配 的中断向量减少了 16个,但实际上不会使中断向量不够分配。另一方面,虽然Windows系 统调用使用的中断向量是0x2e,但在一些老的Windows版本中也有可能会用到这个范围内 的其它中断向量,所以还不如把这个范围内的中断向量都保留下来为好。可供动态分配的中断向量的起点变了,其个数也就跟着变了,更确切地说就是减 少了 16个。同一文件中的另一常数NR_IRQS表明可供动态分配的中断向量个数,原来定义 为
权利要求
1. 一种在Linux内核中实现仿Windows系统调用机制的方法,其特征在于 1. 1)修改Linux内核的代码,保留从0x20-0x2f范围中的中断向量,使Linux内核不会 将中断向量OUe分配用于外部中断;1.2)将ReactOS中所实现仿Windows系统调用机制的代码移植到Linux内核中,根据 需要再加以必要的修改。
2.根据权利要求1所述的在Linux内核中实现仿Windows系统调用机制的方法,其特 征在于将移植到Linux内核的仿Windows系统调用机制实现成可动态安装的模块。
全文摘要
本发明涉及一种在Linux内核中实现仿Windows系统调用机制的方法,1)修改Linux内核的代码,保留从0x20-0x2f范围中的中断向量,使Linux内核不会将中断向量0x2e分配用于外部中断;2)将ReactOS中所实现仿Windows系统调用机制的代码移植到Linux内核中,根据需要再加以必要的修改。本发明有益的效果是本发明提供了一种方法,使得可以在Linux内核中实现基于“int 0x2e”指令的仿Windows系统调用机制,解决了使Linux内核支持Windows应用的首要条件。
文档编号G06F9/45GK102073532SQ201010622299
公开日2011年5月25日 申请日期2010年12月29日 优先权日2010年12月29日
发明者周立炜, 毛德操, 费海林 申请人:浙大网新科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1