点击查看《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()

最低0.47元/天 解锁文章
1118

被折叠的 条评论
为什么被折叠?



