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 samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Linux安装MySQL的教程

《Linux安装MySQL的教程》:本文主要介绍Linux安装MySQL的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux安装mysql1.Mysql官网2.我的存放路径3.解压mysql文件到当前目录4.重命名一下5.创建mysql用户组和用户并修

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在