使用自定义系统调用编译Linux内核模块时出错

乔治·康斯坦斯

我将逐步引导您

首先,我在Linux内核目录中编辑3个文件

  1. LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl使用适当的格式打开并添加我正在实施的自定义调用

  2. 在此处声明它们:LINUX_DIRECTORY/include/linux/syscalls.h–使用适当的格式:

  3. 打开LINUX_DIRECTORY/Makefile并将要存储新系统调用的目录添加到该core-y行:

    core-y:= usr / my_system_call_directory /

这是我遇到问题的地方。在内部,LINUX_DIRECTORY/my_system_call_directory我添加了一个C文件,其中包含我的自定义系统调用定义及其相应的Makefile我将定义保留为空,因为在内核模块的C文件中,我声明了一个extern函数(我的自定义系统调用)并定义了一个单独的函数,该函数设置为我的extern函数:

extern long (*start_shuttle)(void); 

long my_start_shuttle(void) {

  // stuff here 

}


int init_module(void) {

  // stuff here

  start_shuttle = my_start_shuttle;

  // more stuff
}

重新编译内核后,我尝试make使用内核模块并得到一个no definition for start_shuttle错误。

这是因为我将定义保留为start_shuttle空白my_system_call_directory吗?它应该与my_start_shuttle我在内核模块中定义的代码完全匹配,还是应该添加一些特殊的东西?我事先要问一些愚蠢的问题,因为我的机器要花很长时间才能重新编译Linux,而且我不确定要更改什么。谢谢

乔治·康斯坦斯

弄清楚了。对于像我这样慢的任何人,您都必须使用包装器和存根。

所以,在这个例子中,在my_system_call_directory中,在c您新的系统调用的定义文件,你需要的东西是这样的:

#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/export.h>

// initialize the stub function to be NULL

long (*start_shuttle)(void) = NULL;

EXPORT_SYMBOL(start_shuttle);

// wrapper

asmlinkage long sys_start_shuttle(void)
{
if (start_shuttle)
    return start_shuttle();
else 
    return -ENOSYS;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用自定义标头编译Linux内核模块

来自分类Dev

如何使用Linux内核模块中的Linux系统调用

来自分类Dev

如何使用RPM加载不依赖Linux内核版本的自定义Linux内核模块

来自分类Dev

编译内核模块linux / module.h时出错:找不到这样的文件或目录

来自分类Dev

尝试编译内核模块时出错

来自分类Dev

使用新的USB串行驱动程序编译自定义内核时出错

来自分类Dev

自定义Linux内核模块以显示年份,日期和时间

来自分类Dev

将自定义库链接到Makefile中的Linux内核模块

来自分类Dev

自定义Linux内核模块以显示年份,日期和时间

来自分类Dev

使用两个源文件编译内核模块时出错

来自分类Dev

未加载自定义内核模块

来自分类Dev

在Beaglebone black / Debian上编译linux内核模块时未定义crc8

来自分类Dev

在Linux中使用Makefile编译内核模块

来自分类Dev

编译内核模块时如何使用标志

来自分类Dev

交叉编译Linux内核模块

来自分类Dev

交叉编译Linux内核模块

来自分类Dev

如何从内核模块向所有正在运行的进程广播自定义Linux信号

来自分类Dev

C-Linux-遍历进程子进程的自定义内核模块会炸毁内核日志和计算机

来自分类Dev

Linux内核模块开发编译其他内核

来自分类Dev

使用带有内核头文件的gcc编译Linux内核模块

来自分类Dev

读取系统调用表功能地址时内核模块崩溃

来自分类Dev

使用更新的编译器编译linux 2.6内核模块

来自分类Dev

编译内核模块时未定义“ __aeabi_ldivmod”

来自分类Dev

使用gdb调试Linux内核模块

来自分类Dev

使用gdb调试Linux内核模块

来自分类Dev

open()系统调用将什么传输到内核模块?

来自分类Dev

添加带有内核模块(LKM)的系统调用

来自分类Dev

配置,编译和安装自定义Linux内核

来自分类Dev

使用自定义内核时如何处理Linux内核更新?

Related 相关文章

  1. 1

    使用自定义标头编译Linux内核模块

  2. 2

    如何使用Linux内核模块中的Linux系统调用

  3. 3

    如何使用RPM加载不依赖Linux内核版本的自定义Linux内核模块

  4. 4

    编译内核模块linux / module.h时出错:找不到这样的文件或目录

  5. 5

    尝试编译内核模块时出错

  6. 6

    使用新的USB串行驱动程序编译自定义内核时出错

  7. 7

    自定义Linux内核模块以显示年份,日期和时间

  8. 8

    将自定义库链接到Makefile中的Linux内核模块

  9. 9

    自定义Linux内核模块以显示年份,日期和时间

  10. 10

    使用两个源文件编译内核模块时出错

  11. 11

    未加载自定义内核模块

  12. 12

    在Beaglebone black / Debian上编译linux内核模块时未定义crc8

  13. 13

    在Linux中使用Makefile编译内核模块

  14. 14

    编译内核模块时如何使用标志

  15. 15

    交叉编译Linux内核模块

  16. 16

    交叉编译Linux内核模块

  17. 17

    如何从内核模块向所有正在运行的进程广播自定义Linux信号

  18. 18

    C-Linux-遍历进程子进程的自定义内核模块会炸毁内核日志和计算机

  19. 19

    Linux内核模块开发编译其他内核

  20. 20

    使用带有内核头文件的gcc编译Linux内核模块

  21. 21

    读取系统调用表功能地址时内核模块崩溃

  22. 22

    使用更新的编译器编译linux 2.6内核模块

  23. 23

    编译内核模块时未定义“ __aeabi_ldivmod”

  24. 24

    使用gdb调试Linux内核模块

  25. 25

    使用gdb调试Linux内核模块

  26. 26

    open()系统调用将什么传输到内核模块?

  27. 27

    添加带有内核模块(LKM)的系统调用

  28. 28

    配置,编译和安装自定义Linux内核

  29. 29

    使用自定义内核时如何处理Linux内核更新?

热门标签

归档