6.2.3 Xenomai3:创建实时线程第二弹之移花接木cobalt_thread_trampoline

点击查看《Xenomai/IPIPE源代码情景解析》
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

6.2.3 Xenomai3:创建实时线程第二弹之移花接木cobalt_thread_trampoline

在上一章节《6.2.2 Xenomai3:创建实时线程第一弹之改头换面pthread_create》中,pthread_create被改头换面为__wrap_pthread_create,走到了下图中的第292行pthread_create_ex()函数。

在这里插入图片描述
pthread_create_ex()函数很长,这里截取最重要的片段来分析:

在这里插入图片描述
第179行,start为线程的原始入口函数,即hello.c中的helloworld()函数。

第184行,__STD宏的作用是手动为函数加上__real_前缀,以此来确保函数不会被默认自动加上__wrap前缀。__real_pthread_create意味着直接调用pthread库中的pthread_create函数。这里传入的线程入口函数并不是原始入口函数,而被移花接木的改为跳板入口函数cobalt_thread_trampoline!

pthread库中的pthread_create函数定义在源码文件nptl/pthread_create.c中。在同一个pthread_create.c中,根据不同glibc的版本,利用Symbol Versioning技术,pthread_create符合会被解析成对应的版本。在当前的例子中,实际调用__pthread_create_2_1函数,其中的_2_1代表的是glic版本。具体不再展开。
在这里插入图片描述
重点是,pthread_create最终依赖 clone 系统调用来创建新线程,传入的函数是cobalt_thread_trampoline!

当 clone 系统调用被触发时,控制权从用户空间转移到内核空间。内核开始处理这个系统调用请求。
内核会为新线程创建一个新的 task_struct 数据结构。task_struct 是 Linux 内核中用于表示进程或线程的数据结构,包含状态、调度信息、资源管理等信息。
内核将新线程的 task_struct 插入到调度器的就绪队列中,以便它可以被调度运行。
子线程会调用入口函数cobalt_thread_trampoline,并将 iargs 作为参数传递给该函数。

此时,Linux中的子线程task_struct已经初始化完毕,而xenomai中对应的cobalt_thread怎么初始化呢?
在这里插入图片描述
答案就在第96行的sc_cobalt_thread_create系统调用。

下一章继续分析。

点击查看《Xenomai/IPIPE源代码情景解析》
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值