内核线程的真正含义是:内核线程没有独立的地址空间,地址空间的mm域为空NULL,他们没有用户上下文。《linux内核设计与实现30页、250页》。


内核线程只运行于内核空间,它只能使用大于PAGE_OFFSET[3G]的地址空间:0x'FFFF000-0XFFFFFFFF。可以通过ps -ef查看内核线程

内核线程接口:1:kthread_create() :创建内核线程

                            注意:创建完线程一定要用IS_ERR(ptr)检查返回值,如果正确才能调用唤醒线程

                        2:wake_up_process():唤醒线程

                        3:kthread_run():创建并且唤醒线程,其实是封装的1和2两个函数。

                        4:kthread_stop():销毁线程,kthread_stop首先设置结束标志should_stop,然后等待线程运行完结束线程。

                            注意:销毁线程钱一定要用IS_ERR(ptr)检查ptr是否错误,因为如果创建的线程中没有循环,线程运行一次就结束了,内核线程会自动销毁,这时如果再调用kthread_stop()函数就会导致内核崩溃--oops。---》原因是内核自动销毁,其对应的task_struct结构也会变的无效,所以结构体对应的成员就不能引用。

                        5:kthread_should_stop():该函数用来返回should_stop标志,并决定是否退出。

内核线程用法:

    1:创建的内核线程中应该包含while循环,目的是让线程持续运行,while的条件应该用while(!kthread_should_stop()){循环体}。

    2:唤醒线程和销毁线程的调用前,一定要判断创建的内核线程的返回值是否是错误的,用IS_ERR()来判断,防止内核挂死。


内核线程应用:

1:在线模块用中断驱动,离线模块用内核线程驱动。

2:应用在中断下半部,例如申请内存会导致睡眠,不能在中断中调用,这时候可以创建一个内核线程,创建一个状态机,中断中需要创建内存时,设置对应的状态机,内核线程一直查询该状态机,当状态机为分配内存时,内核线程就可以完成上述要求。


内核线程总结草稿图:






总结:本文主要讲解内核线程的用法及应用,具体内部实现不在本文讨论范围。



Logo

更多推荐