0号线程swapper

【Linux内核|进程管理】0号线程swapper简介

12 人赞同了该文章
目录
收起
0. 说明
1. 总览
2. 汇编阶段的初始化
3. init_task结构体
4. bootcpu 0号线程的工作
4.1. start_kernel
4.2. 其他cpu的0号线程创建
4.3. 创建1号和2号线程
4.4. schedule_preempt_disabled
4.5. cpu_startup_entry
4.6. do_idle

0. 说明

文章目录汇总:文章目录汇总 - 知乎 (zhihu.com)

内核版本:linux-6.1

个人仓库:

1. 总览

这里以ARM64为例。

在内核的起始阶段,还没有进程和线程的概念,在开启MMU之后,__primary_switched的第一步就是将init_task的地址写到sp_el0,这个时候就可以用get_current()或者curent获取到0号线程的task_struct了。在0号线程的上下文,完成调度器的相关初始化之后,创建1号和2号线程,然后开启调度器,init_task自此进入idle状态。

这里看几个概念:

  • 0号线程:对应init_task结构体,名字为swapper,在多处理器中,名称为swapper/<id>,负责内核的一些基础的初始化工作。
  • 1号线程:由0号线程创建,最初的函数为kernel_init,运行在内核态,kernel_init完成一些初始化工作后,通过kernel_execve进入用户态。具体的名字由用户态程序决定。
  • 2号线程:由0号线程创建,回调函数kthreadd,名字也是kthreadd,所有内核线程的创建都通过2号线程完成。也就是说,所有内核线程的父线程,都是kthreadd。

在kernel_init中,smp_init会为每个处理器核心创建一个的swapper线程,其task_struct结构体,并将其绑定到对应的处理器上。 在kernel_init调用的一些初始化函数中,有些会通过kthread或kworker的接口来创建内核线程,这些都内核线程的创建都由kthreadd接管。 在kernel_init最后,通过kernel_execve进入用户态,用户态的init程序,如busybox或systemd等,再通过fork或者clone等系统调用创建新的进程或者线程。

关于0号线程,在init_task中,设置的名字为swapper,在sched_init时,才会通过init_idle将其设置为swapper/<id>,而这个id时bootcpu的id,大多数情况下,bootcpu的id是0,图中展示的就是这种情况。

2. 汇编阶段的初

posted on   zxddesk  阅读(128)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示