gpt4 book ai didi

在 module_init 函数中调用schedule,它永远不会返回

转载 作者:行者123 更新时间:2023-11-30 16:13:19 25 4
gpt4 key购买 nike

我编写了一个简单的模块代码,试图理解当我们从 module_init 函数调用 Schedule() 时会发生什么。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h> //task_struct
#include <linux/delay.h>



static int __init my_driver_init(void)
{
pr_info("%s: processor id :%d before schedule\n", __func__, smp_processor_id());
set_current_state(TASK_INTERRUPTIBLE);
schedule();
pr_info("%s: processor id:%d after schedule\n", __func__, smp_processor_id());
return 0;
}

void __exit my_driver_exit(void)
{
pr_info("%s:Device Driver Remove...Done\tProcessor Id:%d\n", __func__, smp_processor_id());
}

module_init(my_driver_init);
module_exit(my_driver_exit);

MODULE_LICENSE("GPL");

当我加载模块时,它只打印 module_init 的第一个 printk 并在那里等待。上面的代码有什么错误。

最佳答案

进程可以使用 schedule() 函数自愿向调度程序指示它可以在处理器上调度其他进程。

一旦进程再次被调度回来,执行就会从进程停止的地方开始,即从调用 schedule() 函数开始执行。

set_current_state 将当前正在执行的进程的状态从 TASK_RUNNING 更改为 TASK_INTERRUPTIBLE。在这种情况下,schedule() 函数只需安排另一个进程即可。但只有当任务状态为 TASK_RUNNING 时才会发生这种情况。

当状态为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE 时调用 schedule() 函数时,会执行一个附加步骤:在调度另一个进程之前,将当前正在执行的进程移出运行队列。这样做的效果是执行进程进入休眠状态,因为它不再位于运行队列中。因此,它永远不会被调度程序调度。这就是进程休眠的方式。给定对任务结构的引用,可以通过调用唤醒进程:wake_up_process(sleeping_task);

来源:Kernel Korner - Sleeping in the Kernel作者:Kedar Sovani。

关于在 module_init 函数中调用schedule,它永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58062654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com