KVM一共包含了三个内核模块,kvm_intel.ko,kvm_amd.ko,kvm.ko。其中两个重要文件x86.c和vmx.c在编译后分别会生成kvm_intel.ko和kvm.ko两个内核模块,所以在两个文件当中定义的同一个结构体,在另一个文件中不能共用,因为两者处于不同内核模块。举例说明
在kvm_host.h中定义结构体数组如下:

  1. #define table_len 10000
  2. struct vm_task_table
  3. {
  4. unsigned long vm_task_cr3;
  5. pid_t vm_task_pid;
  6. char vm_task_name[];
  7. }vm_table[table_len];

现在想在x86.c和vmx.c中共用该结构体,一个向结构体数组写入值,一个读出值。定义如下:
x86.c
extern struct vm_task_table vm_table[table_len];
vmx.c
extern struct vm_task_table vm_table[table_len];

首先且不说两个文件的结构体是否是同一个的问题。在编译过程中,将会报错如下:

因为kvm_host.h中直接定义了vm_table变量,而在kvm其他文件中,只要包含了kvm_host.h文件,编译器在编译过程中都会判断出当前变量被重复定义。首先要编译不出错,vm_table变量不能在kvm_host,h中声明,修改代码为:
kvm_host.h
  1. #define table_len 10000
  2. struct vm_task_table
  3. {
  4. unsigned long vm_task_cr3;
  5. pid_t vm_task_pid;
  6. char vm_task_name[];
  7. };
x86.c
struct vm_task_table vm_table[table_len]
vmx.c
extern struct vm_task_table vm_table[table_len]
此时编译过程中将不会出错,但在make install中会有如下警告

提示kvm_intel.ko模块不能识别vm_table符号。原因是,x86.c和vmx.c文件生成不同的内核模块,两者之间信息不共享,采用extern的方法不能够引用vm_table变量。
所以,正确的方法应为:
kvm_host.h
  1. #define table_len 10000
  2. struct vm_task_table
  3. {
  4. unsigned long vm_task_cr3;
  5. pid_t vm_task_pid;
  6. char vm_task_name[];
  7. };
x86.c
struct vm_task_table vm_table[table_len];
EXPORT_SYMBOL_GPL(vm_table);
vmx.c
extern struct vm_task_table vm_table[table_len]
将vm_table符号导出到内核符号表,其他内核模块则可以进行引用。得到正确结果。

函数导出在kvm_intel.ko,kvm.ko不共享的更多相关文章

  1. 【原创+整理】简述何为调用约定,函数导出名以及extern C

    何为调用约定 调用约定指的是函数在调用时会按照不同规则,翻译成不同的汇编代码.这和参数的压栈顺序和栈的清理方式相关,也就是说不同的调用约定,这些方式会做相应改变.一般编译器是以默认的调用约定编译一份代 ...

  2. 如何将Matlab中“模糊控制设计器”的隶属度函数导出图片(figure)

    如何将Matlab中"模糊控制设计器"的隶属度函数导出图片(figure)详情参考matlab官方帮助手册:plotmf()函数https://www.mathworks.com/ ...

  3. php header函数导出excel表格

    推荐一个除了用PHPExcel导出表格之外的另外一种比较简单不需要引入类文件的表格导入方法——header()导出excel表格. 导出表格的步骤封装成了方法,以便于重复使用,代码如下: /** * ...

  4. Windows PE导出表编程4(重构导出表实现私有函数导出)

    本次是尝试调用DLL里面的私有函数. 一: 之前先探索一下,首先可以考虑用偏移量来调用,就是如果知道了某个私有函数和某个导出的公共函数的相对便宜的话,直接加载dll获取公共函数地址,然后自己手动去偏移 ...

  5. 如何调用.so动态库中的函数,如何把自己的函数导出为.so的动态库函数供别人调用

    调用.so中的函数和平常的函数没有区别,只是在编译连接时加上-lxxxx就行了.要生成.so库,则编译时用下面的语句:gcc -shared -Wl,-soname,libmyfun.so -o li ...

  6. DLL 函数导出的规则和方法

    参考博客:https://blog.csdn.net/xiaominggunchuqu/article/details/72837760

  7. KVM安装部署

    KVM安装部署 公司开始部署KVM,KVM的全称是kernel base virtual machine,对KVM虚拟化技术研究了一段时间, KVM是基于硬件的完全虚拟化,跟vmware.xen.hy ...

  8. virtio,vhost 和vhost-user

    随着qemu2.1的发布,可以看到,qemu支持了vhost-user.从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢 ...

  9. 驱动模块 .ko

    模块: 模块机制,作用搞高LINUX操作系统的扩充性. 1. 模块概念: 1.动态可加载内核模块LKM 2.内核空间运行 3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-& ...

随机推荐

  1. Java 8中 基本数据类型

    1)四种整数类型(byte.short.int.long):    byte:8 位,用于表示最小数据单位,如文件中数据,-128~127    short:16 位,很少用,-32768 ~ 327 ...

  2. Properties 的list方法 直接将内容放到文本中

    Properties 的list方法 直接将内容放到文本中

  3. BZOJ 口胡记录

    最近实在是懒的不想打代码...好像口胡也算一种训练,那就口胡把. BZOJ 2243 染色(树链剖分) 首先树链剖分,然后记录下每个区间的左右端点颜色和当前区间的颜色段.再对每个节点维护一个tag标记 ...

  4. Kingdom and its Cities - CF613D

    Meanwhile, the kingdom of K is getting ready for the marriage of the King's daughter. However, in or ...

  5. [GDOI2014]拯救莫莉斯 状压DP

    题面: 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市( 1\le x\l ...

  6. 认识MEAN开发框架[转]

    MEAN是一个Javascript平台的现代Web开发框架总称,它是MongoDB + Express +AngularJS + NodeJS 四个框架的第一个字母组合. MongoDB是一个使用JS ...

  7. Django Model 数据表

    Django Model 定义语法 版本:1.7主要来源:https://docs.djangoproject.com/en/1.7/topics/db/models/ 简单用法 from djang ...

  8. mysql的cast()函数

    先来补个知识: decimal的用法: decimal(18,4)总长18位,包括1位小数点和4为小数,也就是说18-1-4=13整数位只有13位decimal(19,1)总长19位,17位整数,1位 ...

  9. bzoj 1132 [POI2008]Tro 几何

    [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1796  Solved: 604[Submit][Status][Discu ...

  10. HDU3579 线性同余方程(模板 余数不一定互质)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...