无法从内核模块访问vm_list和mm_struct

时间:2014-04-09 06:18:31

标签: kernel-module kvm

我正在尝试从内核模块访问vm_listmm_struct,但由于某种原因,我的输出始终为null,即使我最多运行3个VM。

  • 如果重要的话,整个事情都在VM内运行,因为我不想搞乱真正的内核。
#undef __KERNEL__
#define __KERNEL__

#undef MODULE
#define MODULE


// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is needed for KERN_INFO.
#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>   // included for KERN_INFO
#include <linux/init.h>     // included for __init and __exit macros
#include <linux/kallsyms.h>
#include <linux/string.h>
#include <linux/kvm.h>
#include <linux/kvm_host.h>
#include <linux/mm_types.h>
#include <linux/slab.h>
#include <linux/async.h>

MODULE_LICENSE("GPL");

struct list_head *vms_list;
struct mm_struct *mms_struct;
raw_spinlock_t *vm_lock;


int init_module(void)
{
    struct list_head *itr;
    struct kvm* kvm;
    int i;
    printk(KERN_INFO "Hello world!\n");

    vms_list = (struct list_head*)kallsyms_lookup_name("vm_list");
    mms_struct = (struct list_head*)kallsyms_lookup_name("mm_struct");
    vm_lock =(raw_spinlock_t*)kallsyms_lookup_name("kvm_lock");
    if(!mms_struct && !vms_list){
        printk(KERN_INFO "vms_list and mms_struct are %p, %p\n", vms_list, mms_struct);
        return 0;    <--- This line gets executed every time.
    }
    printk(KERN_INFO "here 2\n");

    raw_spin_lock(vm_lock);
    list_for_each_entry(kvm, vms_list, vm_list)
    {
        printk(KERN_INFO "%p\n", kvm);
    }
    raw_spin_unlock(vm_lock);

    itr = 0;
    // printk(KERN_INFO "%p\n", itr);
    return 0;
};

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world!\n");
};

参考文献:

2 个答案:

答案 0 :(得分:0)

回答我自己的问题。

简而言之:VirtualBox(运行外部guest虚拟机)不支持嵌套虚拟化(请参阅feature request)。 我通过简单地执行cat /proc/cpuinfo | grep vmx并获得空输出来找到它。

希望有一天能帮到某人。

答案 1 :(得分:0)

尝试在Linux主机上使用qemu嵌套虚拟化。 (梦中的梦想)

      --------------------
 L2  |  VM_1 | VM_2 | ... |
      --------------------
 L1  |   guest hypervisor |
     ---------------------
 L0  |   host hypvevisor  |
      --------------------

您需要将VMX指令启用到来宾管理程序:

  • 在插入kvm模块时启用嵌套虚拟化:

    modprobe kvm_intel nested=1

  • 在L0

    中启动qemu时启用vmx cpu标志

    qemu .... -cpu qemu64,+vmx -enable-kvm

现在,当您从L1启动VM时,您应该能够看到非空的vm_list。