背景技术
计算机在社会生活中起着越来越重要的作用,这与计算机软件日新月异的发展密不可分。计算机软件大致可以分为两类:系统软件和应用软件。目前的计算机中,系统软件为应用软件提供一个统一的平台;应用软件则在系统软件的基础上实现用户所需要的功能。而操作系统则是最基本的系统软件。另外,目前PC机都是采用冯.诺曼体系,代码和数据的逻辑地址空间是线性的。
现有的计算机系统中,操作系统为上层应用提供接口使其调用系统函数。这种函数调用的模式使得执行一个应用程序时,要通过接口去调用操作系统中的函数来完成功能,这样不仅实现起来比较复杂,而且,程序运行采用线性地址空间在安全方面也有隐患。
图1示出了现有的计算机系统。如图所示,现有的计算机系统可以划分为以下三层:硬件层10、系统程序层20、和应用程序层30。硬件层10包括:中央处理器如CPU等;存储器如RAM、硬盘驱动器等;总线;输入设备如键盘、鼠标等;输出设备如CRT显示器等。系统程序层20包括:操作系统22和其他系统软件,其中,操作系统22是在硬件层10的基础上加载的一层软件,其用于管理整个系统,并为应用程序30提供接口,应用程序30通过该接口来调用操作系统22,从而使操作系统22调用相应的硬件10以实现用户所需要的功能;以及其他系统软件是在操作系统的上一层,其中包括编译器24、编辑器26、命令解释器28、以及类似的独立于应用程序的程序,但这些程序运行在用户态,可以被用户修改。系统程序层的上面是应用程序层30,其包括各种应用软件,这些应用软件由用户编写,在系统程序层的基础上实现用户所需要的功能。
在现有的计算机系统中,应用程序30同操作系统22通信并请求服务,是通过系统调用进行的。应用程序30可以调用对应的库过程。比如,在这一过程中把系统调用参数放到指定位置,如寄存器,然后发出TRAP指令给操作系统22。在TRAP之后,操作系统22取得控制,它考察参数是否有效,如果是,完成所请求的工作。当工作完成后,在一寄存器中给出状态代码,通知成功还是失败,然后执行一条RETURN FROM TRAP的指令,把控制权返回给库过程。然后库过程按通常方式返回到调用方,把状态码作为函数值返回。可以看到,这个系统调用的过程很复杂而且效率不高。
图2示出了现有的计算机系统的程序的代码和数据在内存中的逻辑地址空间。如图所示,在现有的计算机系统中,程序的代码和数据在内存中的逻辑地址空间是线性的。假如一个嵌入式的网关采用现有的系统实现方法,即程序的代码和数据在内存采用线性地址空间,则该系统有可能受到来自网络的蠕虫,如Code Red,Blaster,Slammer等缓冲区溢出攻击,这是由于C/C++编程语言对数据完整性保护不够造成的。
如果有一个恶意程序向内存中的数据存储区域内写入很长的数据,超出了数据存储区域的边界,写入了代码存储区域。写入代码存储区域中的数据内如果含有可以执行的恶意代码,攻击者可以通过改变返回地址或者函数指针,让程序跳转到安排好的地址空间,这些恶意的代码就会被执行了。
现有的计算机系统包含有计算机调度机制,众所周知,计算机调度机制包括硬件中断调度机制、时间片轮转调度机制、优先级调度机制。
硬件段调度机制是指根据系统规定好的硬件中断的级别来决定哪个进程执行,中断级别高的优先执行。
时间片轮转调度是指每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并且分配给另一个进程。如果进程在时间片结束之前阻塞或者结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表。当进程用完它的时间片后,它被移到队列的末尾。
优先级调度是指每个进程被赋予一个优先级,优先级最高的就绪进程被率先执行。为了防止高优先级进程无休止运行下去,调度程序可以在每个特定时刻降低当前进程的优先级。如果这个动作导致其优先级低于次高优先级,则将进行进程切换。
现有的处理器例如
处理器发展了一种保护模式技术,该保护模式技术具有硬件段机制、代码段寄存器、以及数据段寄存器。
硬件段机制是指保护模式下存储器寻址方式为段基址加段内偏移。用描述符来描述段的位置、大小和使用情况。关于
处理器的硬件段机制、代码段寄存器、以及数据段寄存器,具体可以参考Intel公司的“ia-32 intel(r)architecture software developer′smanual’’的“volume 3:system programming guide”。
具体实施方式
下面将以实施例的方式对本发明加以描述,应该注意的是,本发明的这些实施例并不用于限制依据于权利要求的本发明,并且并非在实施例中所描述的所有特征的组合都是本发明的解决方案所必须的。
首先来看图3,示出了根据本发明的计算机开发装置或开发方法所开发的计算机系统100的结构。该计算机系统100包括多个可独立实现一定功能的模块,并且不同的模块运行在CPU不同的级别上,利用硬件机制来保护内存中的代码和数据。这些模块包括:网口数据包过滤模块110、串口数据包过滤模块120、数据签名模块130、或完成其他功能的模块140等。各模块既不对外提供接口,也不调用其他模块的函数。每个模块被称作一个“S-F系统(self-functioning system,自运行系统)”。下面将详细地说明该系统的实现过程。
该计算机系统100由不同功能的功能模块构成,所以系统的实现过程,实际上就是各个功能模块的实现过程。系统的实现过程比现有的计算机系统更加充分的利用Intel现有的硬件安全机制。
首先把实现一定功能的程序源代码编译为目标文件(可以使用现有的编译器)。然后把一个或者多个目标文件的代码和数据分别提取出来,整合成代码段和数据段,并且把代码段中需要重定位的地方重定位。然后填写全局描述符表,中断描述符表和任务段,每个代码段占用一个全局描述符表项,每个数据段占用一个全局描述符表项。表项中包括段基址,段内偏移地址,以及代码运行在CPU哪个级别等信息。
如果要建立多个S-F系统则重复上述操作。然后把一个或多个S-F系统连同全局描述符表,中断描述符表、和任务段封装成磁盘映像文件并烧写入嵌入式或者控制用的计算机的硬盘中。每个S-F系统可以完成特定的功能。
多个S-F系统可以同时运行在计算机系统100中,各个S-F系统的调度可以使用现有的调度机制。比如,通过硬件中断以及中断级别的不同实现调度;或者使用时间片轮转调度:每个S-F系统分配一个时间段,如果在该时间段结束时该S-F系统还在运行,则CPU将被剥夺并分配给另外一个S-F系统;或者使用优先级调度:每个S-F系统被赋予一个优先级,优先级最高的就绪S-F系统被率先执行。为了防止高优先级S-F系统无休止地运行下去,可以在每个特定时刻(比如每一个时钟中断)降低当前运行的S-F系统的优先级。如果这个动作导致其优先级低于次高优先级,则将进行运行系统的切换。另外,硬件的中断优先执行,并且按照中断的级别来决定执行的先后次序。
接下来参照图4到图8,描述了本发明的第一实施例。
图4示出了根据本发明的第一实施例的计算机系统开发平台200(用于开发计算机系统的装置)的结构,图5示出了根据本发明的第一实施例的计算机系统开发平台200的开发计算机系统的流程。参照图4,根据本发明的第一实施例,本发明向开发计算机系统的用户,特别是向开发嵌入式或者控制用的计算机系统(例如交换机或者网络防火墙)的用户提供了一种计算机系统开发平台200,该平台包括以下部分:
编译器210:可以利用现有的编译器210,把程序源代码编译为计算机可读的二进制目标文件。
链接器220:把目标文件的数据和代码分别提取出来并且整合为数据段和代码段;把代码段重定位并且按照需求分别填写全局描述符表,中断描述符表和任务段。把各代码段和数据段以及全局描述符表、中断描述符表和任务段封装为磁盘映像文件。
烧写器232:操作IDE控制器,把数据段和代码段数据段、代码段以及全局描述符表,中断描述符表和任务段构成的磁盘映像文件写入所开发的计算机系统的硬盘。
参照图5,根据本发明的第一实施例,本发明向开发计算机系统的用户,特别是向开发嵌入式或者控制用的计算机系统(例如交换机或者网络防火墙)的用户提供了一种开发计算机系统的方法,该方法包括以下步骤:
首先利用现有的编译器210,把程序源代码编译为计算机可读的二进制目标文件。
然后,利用链接器220,把目标文件的数据和代码分别提取出来并且整合为数据段和代码段;把代码段重定位并且按照需求分别填写全局描述符表,中断描述符表和任务段。把各代码段和数据段以及全局描述符表、中断描述符表和任务段封装为磁盘映像文件。
最后,利用烧写器230操作IDE控制器,把数据段和代码段数据段、代码段以及全局描述符表,中断描述符表和任务段构成的磁盘映像文件写入磁盘。
接下来参照图6、图7和图8,对该实施例的开发平台的操作流程进行描述。
图6示出了一个可供调用的目标文件库222;图7示出了根据本发明的第一实施例的代码和数据储存结构;图8示出了根据本发明的第一实施例的链接方法。
如图6所示的目标文件库222储存于用户的PC机中。该目标文件库222由很多实现不同功能的目标文件构成。这些目标文件,都是由C/C++程序开发出来,并且通过现有的C语言编译器编译后形成的。这些程序各实现不同的功能,比如中断处理、串口驱动、网卡驱动等等。该目标文件库222为链接器220提供访问接口。
用户在PC机上开发出C/C++应用程序,并且使用现有的C语言编译器编译后成为目标文件。
用户使用PC机上的链接器220,选择需要在目标文件库222中调用哪些功能的文件。
链接器220到目标文件库222中查找被用户选中的功能文件。
用户对目标文件(包括应用程序的目标文件和目标文件库222中的文件)以及要建立的S-F系统的属性进行配置。配置的参数有:如果用户要创建多个S-F系统,则哪些目标文件是组合成一个S-F系统的;每个S-F系统的代码是否可读,每个S-F系统的数据是否可写;每个S-F系统运行在CPU的哪个级别。
链接器220逐个提取被用户选中的目标文件库222中目标文件以及应用程序编译出来的目标文件中的代码和数据。如图7所示,把属于同一个S-F系统的目标文件的代码整合到一个代码段,把属于同一个S-F系统的目标文件的数据整合到一个数据段。
在各个目标文件的符号(包括变量和函数)表中查找全局变量和全局函数,并且建一个全局的符号表,把各个目标文件中的全局变量和全局函数的信息写入全局符号表中。
把代码里需要重定位的地方重定位。重定位时,相应的查找目标文件内的符号表以及全局符号表。
按照用户填写的参数填充全局描述符表,中断描述符表和任务段。每个代码段占用一个全局描述符表项,每个数据段占用一个全局描述符表项。表项中包括段基址,段内偏移地址,以及代码运行在CPU哪个级别等信息。如果被链接的目标文件中有中断模块,则要在中断描述符表中填写含有中断的代码存放在全局描述符表中的位置。如果被链接的模块中有任务存在,则要相应的填写任务状态段任务段。
这样,如图8所示,链接器220就把多个目标文件链接成为一个或多个可以实现特定功能的S-F系统。然后把一个或多个S-F系统以及全局描述符表、中断描述符表和任务段封装为磁盘映像文件。
用户在PC机上使用烧写器(IDE-Writer)230,控制IDE控制器(IDE Controller),把这个磁盘映像文件(包含一个或多个S-F系统以及全局描述符表、中断描述符表和任务段)写入嵌入式或者控制用的计算机中。
这个S-F系统就可以在嵌入式或者控制用的计算机中完成特定的功能。
接下来参照图9至图13,描述了本发明的第二实施例,本发明的第二实施例是一个需要应用串口输入和输出数据的系统。
图9示出了根据本发明的第二实施例的计算机系统开发平台300的结构;图10示出了根据本发明的第二实施例的.imd文件格式;图11示出了根据本发明的第二实施例的数据块格式;图12示出了根据本发明的第二实施例的磁盘映像文件格式;图13示出了根据本发明的第二实施例的流程图。
参照图9,根据本发明的第二实施例,对于图4所示的第一实施例的计算机开发平台200增加了加载器240,其中,加载器240包括存储在嵌入式或者控制用计算机的磁盘中的加载器,用于把写入磁盘的映像文件加载到内存中执行。
在IA—32架构的计算机上运行开发平台(S10)。
用户编写出两个.cpp源程序:一个程序对串口初始化并且实现对串口输入的数据进行转换;另外一个是中断程序,对不同类型的硬件中断进行相应的处理(S20)。
使用现有的VC++编译器,分别对这两个程序进行编译,得到两个计算机可以识别的目标文件(S30)。
下面链接器对目标文件做处理(S40):
把属于一个C系统的目标文件存放入内存中(S402)。在本例中,两个目标文件属于一个C系统,所以就把这两个目标文件都放入内存。
把两个目标文件的代码提取出来,整合成一个代码段;把两个目标文件的数据提取出来,整合成一个数据段;根据新的代码段中重定位符号的位置,相应修改重定位表中的需要重定位的符号的偏移;把符号表中的全局标量提取出来,建立全局符号表(S404)。
根据重定位表和符号表以及全局符号表,把代码段中需要重定位的地方重定位(S406)。
填写GDT(Global Descriptor Table,全局描述符表)、IDT(Interrupt Descriptor Table,中段描述符表)和TSS(Task StateSegment,任务状态段)(S408)。在填写GDT时,每个代码段占用一个表项,每个数据段占用一个表项。代码段和数据段在内存中占用独立的空间,寻址方式为段基址加段内偏移,而且最大的段内偏移就是该段的长度(如果有其他目标文件构成另外一个C系统,则重复以上过程)。
把所有的数据段、代码段以及GDT、IDT、TSS封装成如图10所示的.imd文件(S410)。其中,每一个数据块遵循如图11所示的格式。
在.imd文件中加入加载信息(LOADER),成为如图12所示的磁盘映像文件(S412)。该磁盘映像文件中包含了写入器可以识别的加载信息和图10所示的.imd文件的数据块。
MBR(LBA=0)存放的是Loader的加载信息,负责将存于LBA1~LBA4扇区上的Loader程序以及存于LBA5的镜像头数据加载进RAM。
LBA1~LBA4扇区的Loader负责将用户数据(代码、数据等,存于起始扇区为LBA=6的连续扇区中)搬运到指定的RAM空间。其中,将每个数据块中的有效载荷搬运至的目标地址位于数据块的头信息中。
LBA5上存储的镜像头包含了数据块大小、起始扇区号等Loader参数;
MBR(LBA0)~LBA5是完整的6个扇区,即512×6个字节。
数据块1~N封装了要运行的应用程序代码、数据、GDT、IDT等。其中,数据块1对齐LBA=6的扇区的首地址,其余的数据块长度为32字节的整数倍,在IDE上的存放位置对齐扇区的32地址边界【即,扇区首地址、32、64、96、128、160、192......】。要求数据块连续存放。取扇区的32字节边界的原因是:数据块的头信息为32字节,必须保证头信息不被扇区分开。
使用烧写器把磁盘映像文件写入磁盘(S50)。
根据本发明的计算机系统开发装置或开发方法所开发的计算机系统与现有的计算机系统相比,在以下安全性方面有改进:防止缓冲区溢出攻击方面、以及使用硬件机制保证数据安全方面。以下将对此予以详细说明。
首先,每个目标文件的代码和数据分别提取出来,并整合为代码段和数据段,并且设定代码段和数据段在内存中分别独立的占用两段空间,并且这两段内存空间是不连续的,代码和数据的寻址分别通过各自的段基址加上段内偏移来实现。在全局描述符表填写代码段和数据段在内存中的段基地址,中断代码的信息写入中断描述符表中。全局描述符和中断描述符表的信息只有运行在CPU0级的程序可以读取。这样,非0级的程序就不会得知代码段和数据段在内存中的位置。另外,把代码和数据分别整合为代码段和数据段有利于对代码和数据进行分别控制,代码段是否可读,数据段是否可写都是可以被用户设定的。如果有应用程序对系统进行缓冲区溢出攻击,这样的系统实现方法可以很大程度上防止有恶意代码执行。
其次,可以在全局描述符表中根据需求设置每个S-F系统运行在CPU的哪个级别,利用硬件的保护机制来使S-F系统受到保护。比如包含用户密码等信息的程序就可以运行在0级上。
最后,系统开始执行之后,在嵌入式或者控制用的计算机上不能再执行其他的程序。也就是说,在使用该系统设计方法的计算机上运行程序,只能是把程序的目标文件按照上述步骤生成S-F系统,才能在计算机上运行。所以该系统方法很适合使用在需要安全性保证很高的嵌入式网关或者网络路由器等计算机中。
根据本发明的计算机系统开发装置或方法通过利用已有的程序语言和编译环境,通过提供自己的加载器、链接器和写入器,使用户能够快速地开发自己的专用系统,而不需要操作系统的支持。
根据本发明的计算机系统开发装置或方法所开发的计算机系统,其特点和优越性在于以下方面:
系统构成简单,只由一些可以分别独立完成某些功能的S-F模块组成。系统中只存在为了完成某些功能所需要的模块,简单的系统构成有利于系统运行效率的提高。
系统实现简单。只需要把源代码通过编译器(可以使用现有的)编译成目标文件,然后链接成磁盘映像文件,然后烧写如磁盘中即可。
系统的可定制性很强,用户可以选择需要的功能模块。这样的模块化以及可定制的系统设计很适合应用在嵌入式或者控制用的计算机系统中。
S-F系统的代码段和数据段在内存中使用段基址加上段内偏移来寻址,并且存放的位置不对应用程序公开,有利于防止一部分缓冲区溢出攻击。
充分利用Intel的硬件保护机制,设置S-F系统运行在CUP的哪个级别,利用硬件机制保护S-F系统安全。
不同于现有的计算机系统在内存32位地址空间寻址,该系统在内存中采用段基址加上段内偏移来寻址,这使得系统有更高的安全性,使其更适合应用在网络中的嵌入式设备中,比如交换机或者网络防火墙等,这是因为网络节点设备非常容易受到攻击。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。