现在的位置: 首页 > 综合 > 正文

共享的内核空间

2013年08月06日 ⁄ 综合 ⁄ 共 667字 ⁄ 字号 评论关闭

共享的内核空间

    回到前面的问题。读者已经知道,每个进程的内存空间是相互隔离的(虽然地址的数值看起来都是0~N的一个线性空间)。但是大多数进程都要调用操作系统提供的功能,才能成为一个完整的应用程序。因此,进程的空间实际上被分成了两部分。一部分供进程独立使用,称为用户空间;另一部分容纳操作系统的内核,称为内核空间,或称为系统空间(System space)。具体到可以容纳4GB内存空间的32位Windows系统上,低2GB是用户空间,高2GB是内核空间。
    用户空间是各个进程隔离的,但是内核空间是共享的。也就是说,每个进程看见的高2GB空间范围内的数据,都应该是一样的。这是非常重要的一个观念。
    假设有一个找到操作系统漏洞的应用程序员,能成功地修改高2GB范围内的代码,比如,让硬盘的驱动总是返回失败。那么,其他所有的进程都无法读取硬盘了,这是毫无疑问的。当然一个安全的操作系统是要禁止这种事情发生的。
    内核空间是受到硬件保护的,比如x86架构下R0层(Ring 0)的代码才可以访问内核空间。普通应用程序编译出来之后都运行在R3层,R3层的代码要调用R0层的功能时,一般通过操作系统提供的一个入口(该入口中调用sysenter指令)来实现。这样应用程序既可以调用操作系统内核中提供的功能,又不至于得到随意修改内核的权力。
    因此读者应该理解:本书所编写的内核模块,并非是和普通应用程序一样作为一个进程执行,而是运行在内核空间,成为操作系统的一个模块,最终被所有需要该模块提供功能的应用程序(也可能被操作系统本身)调用。

抱歉!评论已关闭.