【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释

这篇具有很好参考价值的文章主要介绍了【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源码

【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释

解释1

  1. static int __ref kernel_init(void *unused): 声明一个静态整型函数kernel_init(),该函数不会被其他文件访问,使用__ref标记表示该函数是可重定位的,并且该函数不需要任何参数。

  2. wait_for_completion(&kthreadd_done);: 等待kthreadd线程完成初始化,wait_for_completion()函数会阻塞当前进程,直到指定的完成对象完成。

  3. kernel_init_freeable();: 调用kernel_init_freeable()函数进行内核初始化,该函数包括了内核的大部分初始化工作。

  4. async_synchronize_full();: 在进行异步初始化代码之前,需要进行同步操作,以确保所有异步初始化代码都已经完成。

  5. kprobe_free_init_mem();: 释放kprobe初始化时申请的内存空间。
    kprobe是一种用于动态跟踪内核函数调用的机制,在初始化阶段需要申请一些内存空间来存储相关的数据结构,该函数用于在初始化完成后释放这些内存空间。

  6. ftrace_free_init_mem();: 释放ftrace初始化时申请的内存空间。

  7. kgdb_free_init_mem();: 释放kgdb初始化时申请的内存空间。

  8. free_initmem();: 释放内核初始化时申请的内存空间。

  9. mark_readonly();: 将内核只读化,以提高系统的安全性和稳定性。
    这段代码是Linux内核启动过程中的一个重要函数rest_init()。该函数在内核初始化完成后,用于启动用户空间的第一个进程,即init进程。该函数会依次尝试多种方式来启动init进程,直到找到一个可行的方式。具体解释如下:

解释2

  1. pti_finalize();: 更新用户空间的页表,以完成PTI。
    PTI(Page Table Isolation)是一种安全机制,用于防止针对Meltdown漏洞的攻击。Meltdown漏洞是一种硬件漏洞,可以允许攻击者在不受限制的情况下读取内核内存中的敏感信息。为了解决这个问题,Linux内核引入了PTI机制,该机制将内核和用户空间的页表分离,以防止攻击者利用Meltdown漏洞来访问内核内存。

在Linux内核中,pti_finalize()函数用于更新用户空间的页表,以完成PTI机制。具体而言,该函数会将内核和用户空间的页表分离,并将用户空间的页表设置为只读状态,以防止恶意程序修改页表,从而绕过PTI机制。此外,pti_finalize()函数还会执行一些其他的安全检查和操作,以确保PTI机制能够正常工作。

pti_finalize()函数是Linux内核中用于完成PTI机制的重要函数,它通过更新用户空间的页表来分离内核和用户空间的页表,并确保PTI机制能够正常工作,从而提高系统的安全性和稳定性。
2. system_state = SYSTEM_RUNNING;: 将系统状态设置为SYSTEM_RUNNING,表示内核已经完成初始化,可以开始运行用户空间的进程。

  1. numa_default_policy();: 设置NUMA内存分配策略为默认值。
    NUMA(Non-Uniform Memory Access)是一种计算机内存架构,它允许多个处理器访问共享内存,以提高系统的性能和可扩展性。在NUMA系统中,每个处理器都有自己的本地内存,同时也可以访问其他处理器的远程内存。为了更好地管理内存,Linux内核提供了NUMA内存分配策略,用于确定在NUMA系统中如何分配内存。

在Linux内核中,numa_default_policy()函数用于设置NUMA内存分配策略为默认值。具体而言,该函数会根据系统的硬件配置和内核参数来确定NUMA内存分配策略,并将其设置为默认值。在设置NUMA内存分配策略之前,该函数还会执行一些其他的操作,如检查NUMA节点的状态、初始化NUMA节点的内存管理器等。

总之,numa_default_policy()函数是Linux内核中用于设置NUMA内存分配策略的重要函数,它根据系统的硬件配置和内核参数来确定NUMA内存分配策略,并将其设置为默认值,以提高系统的性能和可扩展性。
4. rcu_end_inkernel_boot();: 结束内核启动期间的RCU初始化。

  1. do_sysctl_args();: 处理内核启动参数中的sysctl参数。

  2. if (ramdisk_execute_command) {...}: 如果内核启动参数中指定了initrd命令,则执行该命令。

  3. if (execute_command) {...}: 如果内核启动参数中指定了init命令,则执行该命令。

  4. if (CONFIG_DEFAULT_INIT[0] != '\0') {...}: 如果内核配置文件中指定了默认的init命令,则执行该命令。

  5. if (!try_to_run_init_process("/sbin/init") || ...: 依次尝试尝试多种方式来启动init进程,包括/sbin/init/etc/init/bin/init/bin/sh等。如果所有方式都失败,则触发内核恐慌,提示用户使用init=选项来指定init进程。

rest_init()函数是Linux内核启动过程中的一个重要函数,用于启动用户空间的第一个进程,即init进程。在启动init进程之前,该函数会完成一系列必要的初始化工作,以确保内核能够正常运行。文章来源地址https://www.toymoban.com/news/detail-431481.html

到了这里,关于【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux0.11内核源码解析-read_write.c

    目录  sys_lseek read write read_write.c主要是实现文件系统调用read(),write()和lseek()三个功能 read和write函数分别是调用file_dev.c/pipe.c/block_dev.c/char_dev.c实现相对应的函数 lseek实现系统调用将对文件句柄对应文件结果体中的当前读写指针进行修改,对于读写指针不能移动的文件和管道文

    2024年02月13日
    浏览(17)
  • linux内核启动分析(三)

    我们前面看了start_kernel的一些函数,现在我们继续追setup_arch: setup_arch函数主要是处理cpu体系相关架构,我们是arm64平台,这个函数处理arm64的一些初始化,主要包括: 初始化内核的mm结构体的代码段、数据段和栈的结束地址; 调用函数early_fixmap_init进行早期固定映射初始化;

    2023年04月20日
    浏览(13)
  • Linux内核移植:内核的启动过程分析、启动配置与rootfs必要文件

     内核启动通常包括4个阶段: iROM代码启动(BIOS启动)。开发板上电后,先执行内部iROM中的固化代码,类似于BIOS,执行通电自检和初始化过程,包括初始化CPU、存储器、时钟、总线等一些必要的硬件资源。 启动引导加载程序BootLoader。根据启动引脚的电平,读取相应的存储

    2024年02月13日
    浏览(32)
  • Linux内核4.14版本——drm框架分析(1)——drm简介

    目录 1. DRM简介(Direct Rendering Manager) 1.1 DRM发展历史 1.2 DRM架构对比FB架构优势  1.3 DRM图形显示框架  1.4 DRM图形显示框架涉及元素 1.4.1 DRM Framebuffer 1.4.2 CRTC 1.4.3 Encoder 1.4.4 Connector 1.4.5 Bridge 1.4.6 Panel 1.4.7 Fence 1.4.8 Plane 1.4.9 小结 2. DRM驱动框架 2.1 DRM驱动对象介绍 2.2 DR

    2024年02月02日
    浏览(12)
  • 16_Linux内核启动流程

    目录 链接脚本vmlinux.Ids Linux内核入口stext mmap_switched函数 start_kernel函数 rest_init函数 init进程 要分析Linux启动流程,同样需要先编译一下Linux源码,因为有很多文件是需要编译才会生成的。首先分析Linux内核的连接脚本文件arch/arm/kemel/vmlinux.lds,通过链接脚本可以找到Linux内核的第一行

    2024年02月07日
    浏览(22)
  • uboot启动Linux内核卡住

    uboot启动Linux内核uImage卡在Starting kernel ...这一步 由于出现这种情况的原因有很多,暂时列举几种 查看uImage的信息 可以看见加载地址与入口地址为0xc2000040。由于uImage在头部添加了64个字节的识别信息,那么 加载地址是uboot在加载内核时的存放地址,入口地址是内核代码的开始

    2024年02月13日
    浏览(16)
  • linux 内核ARM32启动

    基于linux4.19内核翻译理解 为了启动ARM Linux,您需要一个引导加载程序,它是在主内核之前运行的小程序。 引导加载程序被期望初始化各种设备,并最终调用Linux内核,向内核传递信息。 基本上,引导加载程序应该提供(至少)以下内容: 1.设置和初始化RAM。 2.初始化一个串

    2024年01月18日
    浏览(11)
  • Linux 内核线程启动以及内核调用应用层程序

    #include linux/kthread.h //内核线程头文件   static task_struct *test_task; test_task = kthread_run(thread_function, NULL, \\\"test_thread_name\\\"); if(IS_ERR(test_task)) {         pr_err(\\\"test_thread_name create failn\\\"); } static int thread_function(void *arg) {     char *envp[3];     char *argv[3];     int ret= 0;     argv[0] = \\\"/bin/sh\\\";  

    2024年02月12日
    浏览(19)
  • Linux内核4.14版本——drm框架分析(7)——用户态和内核态间的交互

             驱动会注册一个支持KMS的DRM设备时,会在/dev/drm/下创建一个card%d文件,用户态可以通过打开该文件,并对文件描述符做相应的操作实现相应的功能。该文件描述符对应的文件操作回调函数(filesystem_operations)位于drm_driver中,并由驱动程序填充。典型如下:      

    2024年02月09日
    浏览(17)
  • 《Linux 内核设计与实现》10. 内核同步方法

    原子操作:可以保证指令以原子的方式执行,即执行过程不被打断。 原子整数操作 整数的原子操作只针对 atomic_t 类型。因为: 让原子函数只接收 atomic_t 类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用。同时这也保证了该类型的数据不会被传递给任何非原

    2024年02月04日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包