如何详细解析xenomai内核中实时线程创建的完整流程?

摘要:本文介绍了linux硬实时操作系统xenomai pthread_creta()接口的底层实现原理,解释了如何在双内核间创建和调度一个xenomai任务。本文是基于源代码的分析,提供了详细的流程和注释,同时给出了结论部分,方便读者快速了解核
版权声明:本文为本文为博主原创文章,未经同意,禁止转载。如有错误,欢迎指正,博客地址:https://www.cnblogs.com/wsg1100/ 目录问题概述1 libCobalt中调用非实时POSIX接口2 阶段1 linux线程创建3 阶段2 Cobalt内核创建线程3.1 初始化cobalt_thread->threadbase3.2 用户任务shadow线程上下文创建。3.3 绑定到Cobalt 内核4 总结 问题概述 3年前,在文章【原创】xenomai内核解析--双核系统调用(一) 中我们提出了两个问题: 双核共存时,如何区分应用程序发起的系统调用是xenomai内核调用还是linux内核调用? 一个xenomai实时任务既可以调用xenomai内核服务,也可以调用linux内核服务,这是如何做到的? 本文通过分析源代码为你解答问题1,对于问题2,涉及双核间的调度,本文暂不涉及,后面的文章揭晓答案。 当时解答了问题1,本文将继续探讨双核间的调度问题,重点分析pthread_creta()接口的底层实现。我们知道,一个xenomai任务既可以在cobalt内核中运行,也可以在linux内核中运行,这就要求两个内核都有对应的调度实体来管理这个任务。那么,pthread_creta()接口是如何创建这样一个双重身份的任务的呢?让我们一起来揭开它的神秘面纱吧。 注意:本文是几年前基于源代码的分析记录,质量可能会略差,因为它是源代码分析时的流水记录,没有经过精心的整理和修改,所以可能存在一些不足之处。如果你只想看结论,可以直接跳到文章的最后部分。希望本文能对你有所启发。 下面是与本文有上下文联系的文章,看完后应该会对xenomai任务管理有整体的认识: 【原创】xenomai内核解析--双核系统调用(一) 该文章以X86处理器为例,解析了一个应用程序发起内核系统调用时,xenomai内核调用的流程。 【原创】xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务该文分析了应用程序发起内核系统调用后,是如何区分一个接口是该linux提供服务还是xenomai提供服务。 1 libCobalt中调用非实时POSIX接口 xenomai通过标准POSIX API创建的实时任务来衍生自己的实时线程,因此,xenomai线程继承了Linux任务在非关键时间模式下调用常规Linux服务的能力。 当升级到实时应用程序时,Linux任务将附加到称为实时shadow的特殊xenomai扩展。一个实时shadow允许xenomai协同内核在实时模式下运行时,配置已配对的Linux任务。 拿POSIX标准函数来说,pthread_creta()不是一个系统调用,由NPTL(Native POSIX Threads Library)实现(NPTL是Linux 线程实现的现代版,由UlrichDrepper 和Ingo Molnar 开发,以取代LinuxThreads),NPTL负责一个用户线程的用户空间栈创建、内存分配、初始化等工作,与linux内核配合完成线程的创建。每一线程映射一个单独的内核调度实体(KSE,Kernel Scheduling Entity)。内核分别对每个线程做调度处理。线程同步操作通过内核系统调用实现。 xenomai coblat作为实时任务的调度器,每个实时线程需要对应到 coblat调度实体,如果创建实时线程需要像linux那样NPTL与linux 内核深度结合,那么coblat与libcoblat实现将会变得很复杂,在这里,xenomai使用了一种方式,由NPTL方式去完成实时线程实体的创建,在普通线程的基础上附加一些属性,对应到内核实体时能被实时内核调度。所以libcoblat库中的实时线程创建函数pthread_creta最后还是需要使用 NPTL的pthread_creta函数,xenomai只是去扩展NPTL pthread_creta创建的线程,使这个线程在实时内核调度。 创建一个实时线程的时候,应用程序调用libcobalt实现的pthread_creta函数,做一些初始工作,libcobalt最后会去调用NPTL的pthread_creta来创建线程,同一个函数pthread_creta,三者之间是怎样区分的?下面一一解析 以pthread_creta函数开始解析cobalt内核线程创建流程。
阅读全文