Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)

2024-06-04 13:08

本文主要是介绍Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    前面粗略分析start_kernel函数,此函数中基本上是对内存管理和各子系统的数据结构初始化。在内核初始化函数start_kernel执行到最后,就是调用 rest_init函数,这个函数的主要使命就是创建并启动内核线程init。这个函数虽然意思为剩下的初始化,但是这个“剩下”的可是内容颇多,下面详细分析如下:

  1. /*
  2.  * 我们必须确定在一个非__init函数或
  3.  * 其他根线程(root thread)和初始化线程(init thread)间的竞态。
  4.  * (这种竞态可能导致start_kernel在根线程运作到cpu_idle前被free_initmem“收割”。)
  5.  *
  6.  *
  7.  *  gcc-3.4 偶尔会将这个函数作为内联函数, 所以使用了noinline.
  8.  */

  9. static __initdata DECLARE_COMPLETION(kthreadd_done);

  10. 点击(此处)折叠或打开

    1. 定义一个complete变量来告诉init线程:kthreads线程已经创建完成。
    2. 从前似乎不是用complete锁,而是用大内核锁。
  11. static noinline void __init_refok rest_init(void)
  12. {
  13.     int pid;

  14.     rcu_scheduler_starting();

    点击(此处)折叠或打开

    1. 内核RCU锁机制调度启动,因为下面就要用到

  15.     /*
  16.      * 我们必须先创建init内核线程,这样它就可以获得pid为1。
  17.      * 尽管如此init线程将会挂起来等待创建kthreads线程。
  18.      * 如果我们在创建kthreadd线程前调度它,就将会出现OOPS。
  19.      */
  20.     kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

    点击(此处)折叠或打开

    1. 创建kernel_init内核线程,内核的1号进程!!!!!

  21.     numa_default_policy();

    点击(此处)折叠或打开

    1. 设定NUMA系统的内存访问策略为默认

  22.     pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
  23. 点击(此处)折叠或打开

    1. 创建kthreadd内核线程,它的作用是管理和调度其它内核线程。
    2. 它循环运行一个叫做kthreadd的函数,该函数的作用是运行kthread_create_list全局链表中维护的内核线程。
    3. 调用kthread_create创建一个kthread,它会被加入到kthread_create_list 链表中;
    4. 被执行过的kthread会从kthread_create_list链表中删除;
    5. 且kthreadd会不断调用scheduler函数让出CPU。此线程不可关闭。

    上面两个线程就是我们平时在Linux系统中用ps命令看到:

    点击(此处)折叠或打开

    1. tekkaman@Super-MAGI:~/development/analyze/linux-3.0$ ps -A
    2. PID TTY TIME CMD
    3. 1 ? 00:00:00 init
    4. 2 ? 00:00:00 kthreadd
    5. ......

        rcu_read_lock();
  24.     kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
  25.     rcu_read_unlock();
  26.     complete(&kthreadd_done);

这篇关于Linux内核源码分析--内核启动之(5)Image内核启动(rest_init函数)(Linux-3.0 ARMv7)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030165

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec