linux内核init启动过程分析(一)

本文详细分析了Linux内核从`start_kernel`到`kernel_init`的过程,包括`rest_init()`中生成的`kernel_thread`、`kthreadd`线程,以及`kernel_init`函数执行的初始化任务,如工作队列初始化、驱动注册和初始化调用。通过`do_initcalls()`调用`.initcall`段中的函数,完成系统初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


linux内核启动过程分析(一)

从 源码目录/init/main.c开始分析
asmlinkage void __init start_kernel(void)
//__init表示这个函数的代码放在__init段中,这个段在arch/arm/kernel/vmlinux.lds.S链接文件中定义
 1-> ......中间省略了很多其他的初始化设置
 1-> rest_init();
   2-> kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);//生成内核线程kernel_init
  
   2-> pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);//生成内核线程kthreadd
       kthreadd这个线程是一个死循环不会终止,这个线程用于内核线程的维护,创建新的内核线程
   2-> cpu_idle();//又是一个死循环,在这个循环里不停地维护,然后调用schedule()调度用户进程
   到这,linux内核就真正的跑起来了。下面分析内核生成的另一个线程:kernel_init

init进程分析:kernel_init
  kernel_init
    1-> .....此处省略一些函数调用
       //这里完成的工作有:锁内核,设置当前线程屏蔽所有线程占领CPU,然后是多处理器的初始化
    1-> do_basic_setup();//做基本的设置,这个函数比较有意思,分析下它:
      2-> init_workqueues()    初始化 keventd_wq工作队列 其name域为events 
      2-> usermodehelper_init()创建一个工作队列khelper
      2-> driver_init()        完成驱动程序的抽象设备,总线,设备类,固件,平台总线,系统总线等的注册
        3-> devices_init();
        3-> buses_init();
        3-> classes_init();
        3-> firmware_init();
        3-> hypervisor_init();
        3-> platform_bus_init();
        3-> system_bus_init();
        3-> cpu_dev_init();
&nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值