首页 > 技术文章 > 《精通linux设备驱动程序开发》第3章内核组件 学习笔记

zygote 2020-08-21 23:34 原文

内核线程,是一种在内核空间实现后台任务的方式。

1. 创建内核线程

在内核被唤醒后,会激活一个用户模式辅助程序,并将切当的身份代码桩底给他。使用kernel_thread()可以创建内核线程:

 

ret = kernel_thread(mythread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);

 

2 .进程状态和等待队列

等待事件过程中将mythread置于睡眠状态的代码片段:

 

add_wait_queue(&myevent_waitqueue, &wait);

for (; ; ) {
/*  */
Set_current_state(TASK_INTERRUPTIBLE);
Schedule();  /* Relinquish the processor*/
/* Point A */
/* ... */
}

set_current_state(TASK_RUNNING);
Remove_wait_queue(&myevent_waitqueue, &wait);

 

进程队列用于存放需要等待事件和系统资源的线程。入列和出列的操作分别通过调用add_wait_queue()和remove_wait_queue()完成,唤醒队列中的任务通过wake_up_interruptible()完成。

内核线程可以处于如下状态:

运行状态(TASK_RUNNING),处于调度器的运行队列(run queue)中,等待CPU时间分给它;

可被打断的睡眠状态(TASK_INTERRUPTIBLE),等待一个事件的发生;

不可被打断的睡眠状态,信号发生不会导致该进程被重新放入运行队列;

停止状态(TASK_STOPPED),收到了某些信号已经停止执行;

追踪状态(TASK_TRACED),正在使用内核的ptrace支持;拦截一个进程;

僵死状态(EXIT_ZOMBIE),进程已经被终止,但是其父进程并未等待它完成;

 

推荐阅读