我正在尝试从内核模块访问vm_list
和mm_struct
,但由于某种原因,我的输出始终为null,即使我最多运行3个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");
};
参考文献:
答案 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。