6.3.2 Xenomai/Linux进程/主线程描述符之间的关联

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

6.3.2 Xenomai/Linux进程/主线程描述符之间的关联

本文分析进程/主线程创建的过程及相互的关联。
在这里插入图片描述

1. Linux进程描述符struct task_struct的创建

参考《6.1.4 Xenomai3: hello world如何变成Xenomai实时进程》的分析,在Linux Shell下启动应用程序,会经历如下标准流程:

(1)Fork 函数:Shell 使用 fork() 函数,调用sys_fork系统调用来创建一个新的子线程并分配struct task_struct。此时,子进程是父进程(通常是 Shell)的一个副本,包括内存空间、文件描述符等。注意,此时struct task_struct仅仅是Shell的子线程。

(2)Exec 系列函数:在子线程中,Shell 调用 execve() 或其他 exec 系列函数之一来加载并执行指定的 ELF 文件。这一步会替换当前进程的用户空间镜像为新程序的镜像。此时,子线程将拥有自己的虚拟地址空间,可用称为一个独立的进程,它的父进程为Shell。

至此,Linux进程描述符struct task_stuct已经创建完毕。

2. Xenomai进程描述符struct cobalt_process的创建

libc_start_main 是 glibc 内部函数,负责进一步初始化运行时环境,包括调用__libc_csu_init初始化全局构造函数和静态构造函数,即执行所有带有__attribute((constructor))属性的函数以及C++中的静态对象构造函数。

Xenomai3 利用GCC的 attribute((constructor)) 特性来定义了3种优先级的构造函数。凡是有这3个宏作为前缀的函数,总是会在__libc_csu_init中被执行。
在这里插入图片描述
在__setup_ctor中,关注struct setup_descriptor cobalt_interface,它的init函数是cobalt_init。

在这里插入图片描述
cobalt_init会调用sc_coablt_bind系统调用创建struct cobalt_process。

cobalt_init
->cobalt_init_1()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值