linux中创建模块,调用do_fork,插入模块的时候,显示失败

发布于 2022-09-07 12:18:16 字数 1489 浏览 33 评论 0

代码如下:

#include <linux/init.h>
#include <linux/module.h>
#include <asm/pgalloc.h>
#include <asm/pgtable.h>
#include <linux/thread_info.h>
#include <linux/slab.h>
#include <linux/sched.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Sun");

static int __init myModule_init(void)
{

    struct pt_regs *regs;
    
    long id=do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, NULL, NULL);
    
    printk(KERN_ALERT"myModule init----fork_id:%d.\r\n",id);

        return 0;
}

static void __exit myModule_exit(void)
{
    printk(KERN_ALERT"myModule exit.\r\n");
}

module_init(myModule_init);
module_exit(myModule_exit);

然后编译成功后,insmod page.ko,出现下面错误:

insmod: ERROR: could not insert module page.ko: Unknown symbol in module

查看 dmesg | tail :

[108843.437019] page: Unknown symbol do_fork (err 0)

查看依赖关系:

    modinfo page.ko 
filename:       /home/sun/kernel_code/page.ko
author:         colorfulshark@hotmail.com
license:        GPL
rhelversion:    7.4
srcversion:     3913DBD14892947BDDCE568
depends:        
vermagic:       3.10.0-693.el7.x86_64 SMP mod_unload modversions

看了相关资料,是不是要要在kernelfork.c修改,添加:

EXPORT_SYMOBL(do_fork)

然后重新编译linux内核,但是我的是x86平台,虚拟机重新编译运行比较慢,我就不知道linux内核代码是如何调用do_fork函数的?

#include <linux/sched.h>已经含有do_fork函数了,为什么不能调用?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏见 2022-09-14 12:18:16

insmod的时候,会动态解析符号地址,do_fork这个符号时内核没有导出的,所以不会解析成功。
内核通过EXPORT_SYMOBL导出的符号,模块才可以使用,可以理解为这是内核提供给模块的“合法”API。

fork是一个系统调用,是给用户态应用程序用的。内核模块开发用不到它。
如果需要在内核态创建线程(进程)执行任务,调用标准的内核API——kthread_run就可以了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文