对于32位操作系统的监控,使用静态的PIA数组来保存堆区守卫值的地址信息是恰当的。然而,对于64位操作系统的监控,将无法使用静态的PIA数组来保存这些数据。其原因在于64位操作系统能直接映射到内核堆区的内存大小远远超出了896 MB,因此,如果使用静态数据结构存储这些内核元数据,将可能带来较大的内存开销。另外,当内核堆区使用的内存页面分布比较稀疏时,监控程序可能需要扫描PIA中的许多无用项以后才能定位真正的内核堆区页面。为了解决以上问题,本小节基于操作系统多级页表管理内存的思想提出了将静态PIA数组扩展成多级PIA表的方法。第一级PIA表是一个简单的数组,仅占用一个内存页面。PIA表中的每一项(最后一级PIA表除外)记录着下一级表的地址和其他相关信息(如下一级PIA表中非空项的数目)。如果非空项的数目为0,则该表项不指向任何PIA表。最后一级PIA表与原始的PIA数组相同,记录着内核堆区守卫值的位置信息。
当一个内存地址为A的内存页面被移入内核堆区时,将地址A的一些位数作为索引存储到PIA表项中。如果该表项为空,则系统会首先分配一个新的第二级PIA表,然后将A的其他一些位数存放在该PIA表中,并且将表中非空项的数目置为1。64位操作系统至少需要三级页表来管理内存,因此还需要分配第三级PIA表来存储A对应的堆上缓冲区信息。通过以上方式,监控程序就可以使用深度优先算法遍历多级PIA表,从而定位出内核堆区守卫值。为了避免由多个内核程序同时访问PIA表所产生的竞争条件,我们需要采用一些硬件同步原语,例如比较并转换(Compare and Swap,CAS)原语。(www.xing528.com)
基于扩展的多级PIA表技术不仅减少了内存开销,还提高了监控程序检查内核堆区守卫值的效率。通过利用这项技术,Kruiser将可以对具有海量物理内存的64位操作系统进行安全监控。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。