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

一.   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.mzph.cn/news/88561.shtml

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

相关文章

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议(Routing Information Protocol, RIP)是一种内部网关协议,它位于应用层,使用520 UDP端口。RIP基于距离矢量算法(Bellham-Ford)根据…

Ubuntu Kafka开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建kafka.service文件 [Unit] DescriptionApache Kafka Server Documentationhttp://kafka.apache.org/documentation.html Requireszookeeper.service[Service] Typesimple Environment"JAVA_HOME/usr/local/programs/j…

MSF的安装与使用教程,超详细,附安装包和密钥

MSF简介 Metasploit(MSF)是一个免费的、可下载的框架 它本身附带数百个已知软件漏洞,是一款专业级漏洞攻击工具。 当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了,仿佛一夜之间&#xff0…

MySQL进阶篇4——锁+InnoDB引擎+MySQL管理

锁 概述 保证并发访问数据库数据的一致性和有效性等。 全局锁-库锁 ​ 加锁后,整个数据库实例就处于只读状态,后续的DML语句,DDL语句,以及更新操作的事务提交语句都将会被阻塞。 典型使用场景: ​ 对全库做逻辑备…

PY32F003F18之DMA串口

PY32F003F18使用DMA串口,官方程序省FLASH,但不省内存。单片机内存够大,节省没意义,故做了修改,少用HAL库中的发送和接收,从里面抠出有用的部分,修修改改就可以了。 一、DMA串口初始化流程&…

人生第一个java项目 学生管理系统

开始编程 建类 开始主要部分 main()部分 方法部分

RocketMQ —消费进度管理

Apache RocketMQ 通过消费位点管理消费进度,本文为您介绍 Apache RocketMQ 的消费进度管理机制。 背景信息​ Apache RocketMQ 的生产者和消费者在进行消息收发时,必然会涉及以下场景,消息先生产后订阅或先订阅后生产。这两种场景下&#x…

【单调栈】496. 下一个更大元素 I

496. 下一个更大元素 I 解题思路 首先计算nums2的每一个元素的下一个比他大的元素,使用单调栈将上面的结果和nums2中的每一个元素组成映射map针对每一个Nums1的元素 查询map 记录map 的value class Solution {public int[] nextGreaterElement(int[] nums1, int[…

算法 N皇后问题-(递归回溯)

牛客网 BM59. 解题思路: 行列、斜叉不在一条直线上。 命令行为 row, 列为col, row 从0开始递归直到最后一行,列从0开始遍历,直到最后一列,中间每一步记录或清除位置状态,状态分为 m1[col] 1, m2[row-col] 1, m3[r…

R语言柱状图直方图 histogram

柱状图简介 柱状图也叫直方图,是展示连续性数值的分布状况。在x轴上将连续型数值分为一定数量的组,y轴显示对应值的频数。 R基本的柱状图 hist 我们用R自带的Orange数据来画图。 > head(Orange)Tree age circumference(圆周长) 1 1 118 …

国家开放大学的训练试题

仓储与配送管理 参考 试题 一、单项选择题(每小题2分,共20分,将正确答案选项的字母填入题目的括号内) 1.( )是保管人在接受仓储物后签发的表明一定数量的保管物已经交付仓储保管的法律文书。 A.保单 B.仓单 C.提单 D.发票 …

132.【MySQL_进阶篇】

MySQL_进阶 (一)、存储引擎1.MySQL体系结构(1).连接层(2).服务层(3).引擎层(4).存储层 2.存储引擎简介(1).查看某张表的数据引擎(2).展示此版本支持的所有存储引擎(3).创建表my_myisam,并指定MyIASM存储引擎(4).存储引擎示列 3.存储引擎 _ Innodb(1).Innodb 介绍(2).Innodb 特点…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深,太极八卦,阴阳交合,变化无穷。在程序的开发中也是这样,数字0和1也是同样的道理。就本节来说&am…

vue3 无法使用pnpm安装依赖 或 Cannot find module preinstall.js

创建.npmrc文件在根目录 shamefully-hoisttrue auto-install-peerstrue strict-peer-dependenciesfalse删除 node_modules 和 pnpm-lock.yaml 文件 重新 pnpm i 就可以啦

【Pm4py第七讲】关于visualization

本节用于介绍pm4py中的可视化函数,包括可视化bpmn、petri、性能图谱、变迁系统等。 1.函数概述 本次主要介绍Pm4py中一些常见的可视化函数,总览如下表: 函数名说明view_alignments(log, aligned_traces[, format])可视化对齐方法 view_bpmn(…

Python学习之编写学生信息管理系统

实例要求:1.学生基本信息包括学号、姓名、性别、成绩;2.将学号设置为主键值,根据学号进行相应的“增、删、查、改”;实例分析:封装“增、删、查、改”功能函数,在main函数中调用这些函数即可;1.…

华为云云耀云服务器L实例评测 | 云服务器搭建自己的gitlab代码仓库手把手教学

📋 前言 🖱 博客主页:在下马农的碎碎念🤗 欢迎关注🔎点赞👍收藏⭐️留言📝✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2023/09/26📅 最近更新时…

spring cloud gateway谓词工厂 Predicate Factory

Predicate Factory 称为谓词工厂或断言工厂 默认的工厂类都位于 org.springframework.cloud.gateway.handler.predicate 包下 根据版本不同有多有少 本文spring-cloud.version2021.0.5 spring-cloud-gateway3.1.4 官方文档:https://docs.spring.io/spring-cloud-gat…

【LeetCode热题100】--234.回文链表

234.回文链表 快慢指针: 将链表的后半部分反转(改变链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例 使用快慢指针在一次遍历中找到链表的中间位置&#xff1a…

由iframe引起的无法返回上一页的问题

问题描述 使用的框架: vue 页面里面嵌套了 iframe, 在设置iframe的src后,不知道为什么使用 router.back() 无法跳转到上一页,必须使用 router.go(-2) 才可以。但问题是有的时候用 router.go(-1) 可以,有的时候却不行。因为iframe…