linux - 使用 kernel_thread 创建内核线程

标签 linux multithreading linux-kernel

作为学校作业的一部分,我正在尝试使用 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(&current->sighand->siglock);
flush_signal_handlers(current, 1);
spin_unlock_irq(&current->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);
}
...

这是我在启动时遇到的错误:

Kernel Panic

附加信息:在内核 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/

相关文章:

linux - shell脚本中的记录器

multithreading - 异步任务超时?

multithreading - 多线程 DBMS?

multithreading - 线程: how to remove static lifetime requirement [duplicate]

linux - 如何为模拟器设置 dhrystone 基准时钟速率?

linux - 使用 rmmod 时出现段错误

c++ - 从未初始化的内存中读取每次都会返回不同的答案

linux - 是否可以替换现有字符设备的字符驱动程序?

在 ubuntu 上为用 C 编写的软件创建 GUI

linux - 如何使用 svn grep 和检查代码?