首页 理论教育 面向虚拟化环境的软件同步机制挑战

面向虚拟化环境的软件同步机制挑战

时间:2023-10-22 理论教育 版权反馈
【摘要】:因此,当监控程序发现内核堆区异常时,可能需要暂停整个目标操作系统,以确认是否发生真正的缓冲区溢出。

面向虚拟化环境的软件同步机制挑战

当监控程序检查内核堆上缓冲区时,其他内核程序也可能同时对这些缓冲区进行修改,因此监控程序必须采取某种同步机制,以正确定位并检查内核堆区守卫值。

5.2.1.1 基于加锁的方法

定位内核堆上缓冲区最直接的方法是按照加锁的方式遍历描述内核堆区位置信息的元数据,然后根据这些元数据信息定位并检查内核堆区守卫值。当监控程序对描述内核堆区信息的元数据进行加锁时,其他内核程序将无法对这些内核数据进行操作;当其他内核程序对这些内核元数据进行加锁时,监控程序只有等该内核数据被解锁以后才能对其进行访问,以找出内核堆区的守卫值。基于加锁的方法不但会降低操作系统运行的效率,而且还影响监控程序检测内核堆上缓冲区溢出的实时性。

检查内核堆区的另一种方法是通过截获操作系统对内核堆上缓冲区的分配与释放操作来收集堆上缓冲区守卫值的地址信息,然后将这些信息保存到动态数据结构(如哈希表)中,最后根据该数据结构中的内容监控内核堆区的完整性。这种方法虽然减少了监控程序和其他内核程序对锁进行争夺的频率,但是对其动态数据结构的更新和同步操作仍然需要加锁。(www.xing528.com)

5.2.1.2 基于不加锁的方法

如果监控程序以不加锁的方式扫描动态变化的内存,其检测结果可能会不可靠[79],其原因是这种方法容易产生误报。因此,当监控程序发现内核堆区异常时,可能需要暂停整个目标操作系统,以确认是否发生真正的缓冲区溢出。这种方法会给系统带来巨大的性能开销,不适合在实际环境中应用。

基于不加锁的另一种方法是把堆上缓冲区守卫值(canary)的地址信息存放到不加锁数据结构(lock-free data structure)中。然后,监控程序根据该数据结构中的内容检查是否发生内核堆上缓冲区溢出。虽然监控程序和其他内核进程对不加锁数据结构的更新和访问操作是以非阻塞的方式进行的,但是它们对不加锁数据结构的争夺仍然会造成较大的性能开销。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈