鍍金池/ 問答/Linux/ linux中創(chuàng)建模塊,調(diào)用do_fork,插入模塊的時(shí)候,顯示失敗

linux中創(chuàng)建模塊,調(diào)用do_fork,插入模塊的時(shí)候,顯示失敗

代碼如下:

#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,出現(xiàn)下面錯(cuò)誤:

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

查看 dmesg | tail :

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

查看依賴關(guān)系:

    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

看了相關(guān)資料,是不是要要在kernelfork.c修改,添加:

EXPORT_SYMOBL(do_fork)

然后重新編譯linux內(nèi)核,但是我的是x86平臺(tái),虛擬機(jī)重新編譯運(yùn)行比較慢,我就不知道linux內(nèi)核代碼是如何調(diào)用do_fork函數(shù)的?

#include <linux/sched.h>已經(jīng)含有do_fork函數(shù)了,為什么不能調(diào)用?

回答
編輯回答
冷眸

insmod的時(shí)候,會(huì)動(dòng)態(tài)解析符號(hào)地址,do_fork這個(gè)符號(hào)時(shí)內(nèi)核沒有導(dǎo)出的,所以不會(huì)解析成功。
內(nèi)核通過EXPORT_SYMOBL導(dǎo)出的符號(hào),模塊才可以使用,可以理解為這是內(nèi)核提供給模塊的“合法”API。

fork是一個(gè)系統(tǒng)調(diào)用,是給用戶態(tài)應(yīng)用程序用的。內(nèi)核模塊開發(fā)用不到它。
如果需要在內(nèi)核態(tài)創(chuàng)建線程(進(jìn)程)執(zhí)行任務(wù),調(diào)用標(biāo)準(zhǔn)的內(nèi)核API——kthread_run就可以了。

2017年11月17日 15:11