Linux内核启动流程-第二阶段rest_init函数

news2024/11/28 4:43:30

一.   Linux内核启动

上一篇文章简单了解了  Linux内核启动第二阶段,涉及的 start_kernel函数。start_kernel 函数最后调用了 rest_init 函数,接下来简单看一下 rest_init 函数。

本文续上一篇文章的学习,地址如下:

Linux内核启动流程-第二阶段start_kernel 函数_凌肖战的博客-CSDN博客

二.   Linux内核启动流程第二阶段

1.  rest_init 函数

rest_init 函数定义在文件 init/main.c 中,函数内容如下:

383 static noinline void __init_refok rest_init(void)
384 {
385 int pid;
386
387 rcu_scheduler_starting();
388 smpboot_thread_init();
389 /*
390 * We need to spawn init first so that it obtains pid 1, however
391 * the init task will end up wanting to create kthreads, which, 
392 * if we schedule it before we create kthreadd, will OOPS.
393 */
394 kernel_thread(kernel_init, NULL, CLONE_FS);
395 numa_default_policy();
396 pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
397 rcu_read_lock();
398 kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
399 rcu_read_unlock();
400 complete(&kthreadd_done);
401
402 /*
403 * The boot idle thread must execute schedule()
404 * at least once to get things moving:
405 */
406 init_idle_bootup_task(current);
407 schedule_preempt_disabled();
408 /* Call into cpu_idle with preempt disabled */
409 cpu_startup_entry(CPUHP_ONLINE);
410 }

387 行,调用函数 rcu_scheduler_starting ,启动 RCU 锁调度器。
394 行,调用函数 kernel_thread 创建 kernel_init 进程,也就是大名鼎鼎的 init 内核进程。
init 进程的 PID 1 init 进程一开始是内核进程 ( 也就是运行在内核态 ) ,后面 init 进程会在根
文件系统中查找名为“ init ”这个程序,这个“ init ”程序处于用户态,通过运行这个“ init ”程
序, init 进程就会实现从内核态到用户态的转变。
396 行,调用函数 kernel_thread 创建 kthreadd 内核进程,此内核进程的 PID 2 kthreadd进程负责所有内核进程的调度和管理。
409 行,最后调用函数 cpu_startup_entry 来进入 idle 进程, cpu_startup_entry 会调用cpu_idle_loop cpu_idle_loop 是个 while 循环,也就是 idle 进程代码。 idle 进程的 PID 0 idle
进程叫做空闲进程。
idle 空闲进程 ,当 CPU 没有事情做的时候就在 idle 空闲进程里面“瞎逛游”,反正就是给 CPU 找点事做。当其他进程要工作的时候就会抢占 idle 进程,从而夺取 CPU 使用权。其实大 家应该可看到 idle 进程并没有使用 kernel_thread 或者 fork 函数来创建,因为它是有主进程演 变而来的。

开发板上电后,输入“ps -A” 命令 就可以打印出当前系统中的所有进程,其中就能看到 init 进程和 kthreadd 进程,如下图所示:

可以看出, init 进程的 PID 1 kthreadd 进程的 PID 2 。之所以上图 中没有显示 PID 0 idle 进程,那是因为 idle 进程是内核进程。

我们接下来重点看一下 init 进程,kernel_init 就是 init 进程的进程函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

W5500+树莓派RP2040入门教程之MQTT篇(十二)

目录 1 前言 2 什么是MQTT协议? 2.1 特点 2.2 应用 2.3 身份 2.4 消息质量等级 2.5 遗嘱消息 3 硬件介绍 4 硬件接线 5 代码编写 6 移植说明 7 最终现象 8 总结 9 项目链接 1 前言 随着物联网技术的快速发展,MQTT(Message Queuing Telemetry …

微分算子法求解常系数线性微分方程特解

1.微分算子法求解常系数线性微分方程特解 参考资料:全网讲解最清楚的微分算子法! 1.1 微分算子法的思路 1.2 f ( x ) e α x f(x)e^{\alpha x} f(x)eαx 型 1.3 f ( x ) sin ⁡ β x f(x)\sin\beta x f(x)sinβx 或 f ( x ) cos ⁡ β x f(x)\co…

oracle VM virtualbox 自动挂载共享目录

目标: 1 安装增强插件 2 设置共享目录 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a3ef43aa3a934e4691bad53874f6b427.png 3 修改fstab sudo chmod 777 /etc/fstab vi /etc/fstab 增加一行: pc /mnt/pc vboxsf defaults 0 0 例子&#xff1a…

tensor维度变换

作用函数不变大小改变shapeview / reshape删减与增加维度squeeze / unsqueeze维度扩展expand / repeat矩阵转置,单次和多次交换操作t / transpose / permute 1、 view reshape view与reshape效果一致,且可以通用。直接以view为例: a torc…

CH08_搬迁特性

搬迁函数(Move Function) 曾用名:搬迁函数(Move Method) class Account{get overdraftCharge(){...}... }class AccountType{get overdraftCharge(){...}... }动机 模块化是优秀软件设计的核心所在,好的模…

C语言自定义类型讲解:结构体,枚举,联合(2)

🐵本篇文章将会对位段、枚举和联合的相关知识进行讲解 1. 位段📚 1.1 什么是位段 位段的声明和结构体类似,但是有两点不同: 1.位段的成员必须是int,unsigned int,signed int (C99之后也可以是其他成员&am…

Redis 线程模式

Redis 是单线程吗? Redis 单线程指的是 [接收客户端请求 -> 解析请求 -> 进行数据读写操作 -> 发送数据给客户端] 这个过程是由一个线程 (主线程) 来完成的,这也是常说的 Redis 是单线程的原因。 但是 ,Redis 程序不是单线程的&am…

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题,对于 Nginx 而言,也是如此。 比如,你出于无聊写了一个小网站,部署到 tomcat 之后可以正常访问 但是后来,你的这个小网站因为内容很诱人逐步的火了,用户越来越多&a…

C#开发的OpenRA游戏之雷达地图

C#开发的OpenRA游戏之雷达地图 从前面的游戏里,就可以看到在上面按钮下面留有一个区域,这个区域的作用,就是用来显示一个雷达地图,如下图所示: 从雷达地图来看,可以清楚地看到全局的动态,自己的兵力分布,还有自己的建筑分布,矿产分布等等。 在这里就来对这个雷达地图…

Python编程:使用PIL进行JPEG图像压缩的简易教程

摘要: 本文介绍了如何使用Python编程语言和wxPython图形用户界面库进行JPEG图像的压缩。通过添加滑块控件,我们可以调整压缩质量,并将压缩后的照片另存为原来的名称加上后缀"压缩质量数字"的新文件。 C:\pythoncode\new\image2small.py 完整…

AI编程助手 Amazon CodeWhisperer 全面解析与实践

目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…

程序启动-大数据平台搭建

1、启动zookeeper集群 /home/cluster/zookeeper.sh start /home/cluster/zookeeper.sh stop 2、启动hadoop和yarn集群 /home/cluster/hadoop-3.3.6/sbin/start-dfs.sh /home/cluster/hadoop-3.3.6/sbin/start-yarn.sh /home/cluster/hadoop-3.3.6/sbin/stop-dfs.sh /home/clust…

以太坊代币标准ERC20、ERC165、ERC721

两个概念 ERC(Ethereum Request for Comment) 以太坊意见征集稿EIP(Ethereum Improvement Proposals)以太坊改进提案 ERC和EIP用于使得以太坊更加完善;在ERC中提出了很多标准,用的最多的标准就是它的Token标准; 有哪些标准详细见https://eips.ethereum…

预制菜行业数据分析(京东数据挖掘)

最近一段时间,关于预制菜进校园事件的讨论热度高涨。而这两天,核酸大王“张核子”转行开预制菜公司卖方便米饭的消息又被传出,直接让预制菜市场饱受关注。 “预制菜是近两年的风口”,这个结论鲸参谋早在以往的内容中专门讨论过&a…

Java 18的未来:新特性和编程实践

文章目录 引言新特性预览1. 基于值的类的进一步改进2. 模式匹配的增强3. 新的垃圾回收器4. 扩展的模块系统5. 更强大的异步编程 编程实践示例1:基于值的类示例2:模式匹配的增强示例3:新的垃圾回收器 结论 🎉欢迎来到Java学习路线专…

python机器学习融合模型:Stacking与Blending(附代码)

1 堆叠法Stacking 一套弱系统能变成一个强系统吗? 当你处在一个复杂的分类问题面前时,金融市场通常会出现这种情况,在搜索解决方案时可能会出现不同的方法。 虽然这些方法可以估计分类,但有时候它们都不比其他分类好。在这种情况…

[WUSTCTF2020]颜值成绩查询 布尔注入二分法

这道题很简单 就是sql注入 我们来学习一下如何写盲注脚本 ?stunum1 ?stunum123 正确回显 100 错误 显示 not 。。。 这里很显然就是盲注了 我们来写个语句查询 if(ascii(substr(database(),1,1))>1,1,0)发现回显了 我们可以开始编写脚本跑了 import requests impor…

DeepMind 利用无监督学习开发 AlphaMissense,预测 7100 万种基因突变

类基因组共有 31.6 亿个碱基对,无时无刻不在经历复制、转录和翻译,也随时有着出错突变的风险。 错义突变是基因突变中的一种常见形式,然而人类目前只观察到了其中的一小部分,能够解读的更是只有 0.1%。 准确预测错义突变的作用&am…

Windows10/11显示文件扩展名 修改文件后缀名教程

前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的,下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹,在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…

剪映软件专业版的操作与使用,电脑版与手机版APP同步讲解

一、教程描述 什么是剪映?抖音官方推出的一款视频编辑工具,用于短视频的剪辑制作和在线发布,主要在手机端使用,同时支持PC端,操作简单易上手,功能也十分强大,使用过剪映的用户,都将…