3.2.6 盘古开天地start_kernel

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

        3.2 内核初始化(盘古开天地)

                3.2.1 内核初始化的神话
                3.2.2 从头 (Head)开始
                3.2.3 从头初始化到身体
                3.2.4 宇之内存的空分复用
                3.2.5 宙之CPU的时分复用
                3.2.6 盘古开天地start_kernel

3.2.6 盘古开天地start_kernel

       __primary_switched最后义无反顾的跳转到了start_kernel(init/main.c)。为什么说义无反顾?因为使用的是b汇编指令而不是bl汇编指令,代表着跳转之后压根没有回头路。而且,前面已经构造好了栈空间,已经可以放心的执行C函数start_kernel。

       盘古开天辟地开始了,创世纪开始了,start_kernel实际上开始进行各种子系统的初始化。具体初始化过程有很多文章和书籍都有分析,就不一一赘述了。重点关注和中断相关的初始化。

第542行,关闭中断。实际上从内核运行开始一直都是关中断的,此处算是一个双保险操作。因为I-pipe要区分物理中断和虚拟中断,对此处会根据需要进行修改,后面会详细分析。

第590行,trap_init()定义在arch/arm64/kernel/traps.c,它的主要作用是:启用BRK指令为BUG()服务,在commit 9fb7410f955f7引入。__ipipe_init_early在trap_init()之前调用。

第637行,early_irq_init()定义在kernel/irq/irqdesc.c,初始化预分配的中断preallocated irqs。对于ARM64,dmesg启动过程中打印preallocated irqs为0,所以判断针对ARM64没有实质内容。

[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0

第638行,init_IRQ()真正进行ARM64中断初始化。

start_kernel <init/main.c>						
->	init_IRQ <arch/arm64/kernel/irq.c>					
	->	irqchip_init <drivers/irqchip/irqchip.c>				
		->	of_irq_init(__irqchip_of_table) <drivers/of/irq.c>			
			->	gic_of_init <drivers/irqchip/irq-gic-v3.c>		
				->	gic_init_bases <drivers/irqchip/irq-gic-v3.c>	
					->	set_handle_irq(gic_handle_irq)

第645行,time_init()对时钟进行初始化。__ipipe_init()的实质初始化,就放在了中断和时间子系统初始化之后。

第657行,打开中断。I-pipe会对local_irq_enable()进行改造,把它的语义从打开物理中断变成打开虚拟中断。

       盘古开天辟地的最后一步,就是分出天和地,start_kernel的最后一步是rest_init,也有异曲同工之妙。对代码进行精简,只保留最核心的部分:

static noinline void __ref rest_init(void)
{
    ……
	pid = kernel_thread(kernel_init, NULL, CLONE_FS);
    ……
	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
    ……
	cpu_startup_entry(CPUHP_ONLINE);
}
  • 辟地之创建1号进程init

        1号进程是0号进程调用kernel_thread->_do_fork创建的,本身是一个内核进程。1号进程的入口函数是kernel_init,它在当前根目录下寻找init程序,通过execve执行init程序转到用户态,变身为用户进程。

        此时的init程序实际上来自于initramfs或initrd,为方便描述,简称oldroot/init。它的职责是从initramfs或initrd中加载驱动并找到真正的根文件系统newroot,调用switch_root切换到newroot,并执行newroot/init程序。最重要的点是,newroot/init的进程号依然是1,这是怎么做到的?从switch_root源码可知,它复用了原来的1号进程,调用execv(init, initargs)重新装载newroot/init程序并执行,可以说是偷梁换柱的高手。当前,在嵌入式Linux中,经常把initramfs或initrd之间当作根文件系统,原理就是把oldroot/init的职责变更了,不再寻找newroot了,反而自己当家作主了,有点鸠占鹊巢的意思。

        Linux操作系统先后出现2个主流的init程序:System-V init和systemd。嵌入式Linux很多还在用System-V init,但是主流Linux发行版(例如红帽、Ubuntu)都在使用systemd.

        总而言之,1号进程init是所有用户进程的祖先!这里把它当作"地进程"!

        0 号进程在初始化阶段,无论是变量名还是函数名都使用了init前缀或后缀(例如init_task/init_stack等),而1号进程竟然也叫init进程,要特别注意不要混淆。

  • 开天之创建2号进程kthreadd

        2号进程是0号进程调用kernel_thread->_do_fork创建的,是一个内核进程,入口函数是kthreadd,它利用循环不断地判断kthread_create_list链表节点是否不为空,只要不为空,就取出链表节点,调用create_kthread-> kernel_thread->_do_fork创建相应的内核线程,然后删除链表节点。

        内核提供kthread_create/kthread_run来创建内核线程,实际上是向kthread_create_list链表添加新的链表节点,然后等待2号进程完成内核线程的创建。

        总而言之,2号进程kthreadd也是今后所有内核进程的祖先!这里把它当作”天进程“!

  • 0号进程swapper完成使命,变身闲云野鹤地”idle进程“

        当走到rest_init->cpu_startup_entry,意味着0号进程swapper已经完成了自己的使命,最终循环调用do_idle函数。只有当这个CPU上没有其它可运行的进程时,调度器才会选择执行进程0,让CPU进入空闲状态。0号进程因此有个绰号叫做idle进程。

 点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: msp432p4xx_dfp.3.2.6.pack是一个软件开发包,用于开发MSP432P4系列微控制器的应用程序。 MSP432P4系列微控制器是德州仪器(TI)公司推出的一款低功耗、高性能的微控制器。它采用了ARM Cortex-M4内核,具有丰富的外设和功能,适用于各种嵌入式应用。 msp432p4xx_dfp.3.2.6.pack是德州仪器提供的一套软件工具,其中包含了开发MSP432P4系列微控制器所需的一些必要组件。这些组件包括软件驱动程序、API库、示例代码以及一些工具和文档。 软件驱动程序是用于控制硬件外设的软件模块,可以通过对这些驱动程序的调用来操作和配置外设。API库是一组函数和方法的集合,提供了更高层次的抽象,方便开发人员进行应用程序的编写。示例代码则是一些常见功能的实现示例,供开发人员参考和学习。 软件工具方面,msp432p4xx_dfp.3.2.6.pack提供了一些用于调试和测试的工具,如调试器、仿真器和调试输出模块。这些工具可以帮助开发人员在开发过程中进行程序的调试和性能优化。 此外,msp432p4xx_dfp.3.2.6.pack还提供了一些文档,包括MSP432P4系列微控制器的技术手册、外设参考手册等,这些文档可以帮助开发人员更好地了解微控制器的特性和功能。 总之,msp432p4xx_dfp.3.2.6.pack是一套为MSP432P4系列微控制器开发提供的软件工具,它包含了开发所需的驱动程序、库文件、示例代码和一些辅助工具和文档,帮助开发人员更方便地进行应用程序的开发和调试。 ### 回答2: msp432p4xx_dfp.3.2.6.pack是一种软件开发工具包,用于支持MSP432P4系列微控制器的开发。这个工具包提供了许多用于编写和调试代码的软件库和驱动程序,使开发人员能够更轻松地创建和测试他们的应用程序。 MSP432P4系列微控制器是德州仪器(TI)公司推出的一种低功耗微控制器系列,适用于各种应用领域,如工业自动化、物联网、传感器节点等。该系列微控制器采用了超低功耗架构,可以在功耗敏感的应用中实现长时间运行。此外,MSP432P4微控制器还具有丰富的外设和通信接口,能够满足多种应用需求。 msp432p4xx_dfp.3.2.6.pack工具包中包含了与MSP432P4系列微控制器兼容的软件库和驱动程序。这些库和驱动程序提供了与微控制器硬件进行交互的接口,包括GPIO(通用输入/输出)、定时器、串口通信、ADC(模数转换器)等。开发人员可以使用这些库和驱动程序来更轻松地编写应用程序,并快速上手开发。 除了软件库和驱动程序,msp432p4xx_dfp.3.2.6.pack还提供了一套集成开发环境(IDE),用于编写、编译和调试代码。这个IDE提供了一套丰富的工具,包括代码编辑器、调试器、仿真器等,帮助开发人员更高效地开发和测试他们的应用程序。 综上所述,msp432p4xx_dfp.3.2.6.pack是一种用于支持MSP432P4系列微控制器开发的软件开发工具包。它提供了软件库和驱动程序,以及集成开发环境,使开发人员能够更轻松地编写、编译和调试他们的应用程序。这个工具包对于开发MSP432P4系列微控制器应用的开发者来说是非常有用的。 ### 回答3: msp432p4xx_dfp.3.2.6.pack是一个软件开发工具包,用于MSP432P4系列微控制器的开发和编程。 该软件开发工具包包含了一些必要的文件和库,可以用来编写和调试MSP432P4系列微控制器的应用程序。这些文件和库包括了处理器的驱动程序、外设的接口函数、标准函数库、示例代码等。 通过使用msp432p4xx_dfp.3.2.6.pack,开发者可以方便地编写和调试MSP432P4系列微控制器的应用程序。开发者可以使用该工具包提供的函数和库,来实现各种功能,如GPIO控制、定时器和计数器编程、串口通信等。 此外,msp432p4xx_dfp.3.2.6.pack还提供了一些示例代码,供开发者参考和学习。这些示例代码演示了如何使用不同的外设和功能,帮助开发者更好地理解和使用MSP432P4系列微控制器。 总的来说,msp432p4xx_dfp.3.2.6.pack是一个方便开发者进行MSP432P4系列微控制器开发和编程的工具包,提供了必要的文件、库和示例代码,帮助开发者更好地编写和调试应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值