OOM测试器:内存耗尽实验

探索Linux内核的内存管理机制,通过实践理解OOM(Out of Memory)killer的工作原理。

什么是OOM?

当系统内存严重不足时,Linux内核会触发OOM killer机制,选择并终止某些进程以释放内存。

内存不足 → OOM Killer被触发 终止进程释放内存

驱动功能设计

核心数据结构

结构体 描述 用途
oom_device 设备状态结构 存储分配的内存指针和统计信息
oom_ioctl_data 控制参数 传递分配大小和模式参数

代码实现示例

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/oom.h>

#define OOM_IOC_MAGIC 'K'
#define OOM_ALLOC _IOW(OOM_IOC_MAGIC, 1, size_t)

struct oom_device {
    void **allocated_ptrs;
    size_t allocated_count;
    size_t total_allocated;
};

static struct oom_device dev;

static long oom_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    size_t size = arg;
    void *ptr;
    
    switch (cmd) {
    case OOM_ALLOC:
        ptr = kmalloc(size, GFP_KERNEL);
        if (!ptr) return -ENOMEM;
        
        dev.allocated_ptrs = krealloc(dev.allocated_ptrs, 
                                    (dev.allocated_count + 1) * sizeof(void *),
                                    GFP_KERNEL);
        dev.allocated_ptrs[dev.allocated_count++] = ptr;
        dev.total_allocated += size;
        
        printk(KERN_INFO "OOM: Allocated %zu bytes, total: %zu\n",
               size, dev.total_allocated);
        break;
    default:
        return -ENOTTY;
    }
    return 0;
}

测试方法

  1. 加载驱动模块
  2. 通过用户空间程序调用ioctl
  3. 观察系统日志和内存状态
  4. 监控OOM killer的触发过程
注意:此驱动仅用于测试环境,在生产系统中使用可能导致系统不稳定。

系统架构

用户空间测试程序 OOM驱动模块 Linux内核内存管理

安全注意事项