作为学校作业的一部分,我正在尝试使用 Kernel_thread() 创建内核线程。我正在根据我认为已经过时的教授示例进行编码。我遇到错误,我不知道如何继续。
我在做什么:
mypid = kernel_thread(myFirstFunctionOne, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
其中 myFirstFunctionOne 定义为:
static int myFirstFunctionOne(void *unused){
struct task_struct *tsk = current;
spin_lock_irq(¤t->sighand->siglock);
flush_signal_handlers(current, 1);
spin_unlock_irq(¤t->sighand->siglock);
strcpy(tsk->comm, "My name: m_k_t_do_something_1");
set_task_state(tsk, TASK_RUNNING);
printk(KERN_NOTICE "My name: m_k_t_do_something_1 is about to be scheduled.\n");
schedule();
printk(KERN_NOTICE "My name: m_k_t_do_something_1 is now scheduled.\n");
return 0;
}
我正在调用一个刚刚创建的函数,该函数在 Kernel_init 的末尾有一行代码,create_my_first_processes()。
static int __ref kernel_init(void *unused)
{
int ret;
kernel_init_freeable();
/* need to finish all async __init code before freeing the memory */
async_synchronize_full();
free_initmem();
mark_readonly();
system_state = SYSTEM_RUNNING;
numa_default_policy();
flush_delayed_fput();
rcu_end_inkernel_boot();
create_my_first_processes();
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
if (!ret)
return 0;
pr_err("Failed to execute %s (error %d)\n",
ramdisk_execute_command, ret);
}
...
这是我在启动时遇到的错误:
附加信息:在内核 4.8.6 上运行 ubuntu
最佳答案
当然事情已经改变了......你应该使用 kthread_run() api 而不是 kernel_thread() ..
请看这个示例代码: https://github.com/slavaim/Linux-kernel-modules/blob/master/kthread/kthread.c
还要注意 _exit() 代码路径中任务结构和清理的 ref 和 de-ref。
关于linux - 使用 kernel_thread 创建内核线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392454/