Linux kernel之SMP初始化

01


linux

SMP数据结构
web

SMP的数据结构以下图所示,主要由2部分构成,经过两个宏定义CONFIG_SMP和CONFIG_HOT_PLUG来控制。当设置kernel支持SMP模式时,那么CONFIG_SMP选项是必定会打开的,所以第一部分是必须实现的内容。而第二部分是否须要实现取决于热插拔宏定义CONFIG_HOTPLUG_CPU是否打开。


CONFIG_SMP宏定义:


CONFIG_HOTPLUG_CPU宏定义:
微信



02网络


数据结构

SMP初始化
app

  • smp_init_cpus

core0执行该函数实际上并不去设置硬件,这个函数经过SCUCONFIG(0x4)寄存器获取当前SoC的core数量,预先初始化好一张cpu map的表,后期若除primary cpu以外的cpu真正被激活并设置为SMP模式,那么会再次更新cpu map这张表。

其实例化以下:

  • smp_prepares_cpus函数

core0执行完setup_arch后,在其初始化的最后部分调用,配置好SMP相关的SCU模块。其中setup_max_cpus由内核配置选项NR_CPUS决定。flex

其实例化以下:url

  • smp_secondary_initspa

这个函数是SMP系统初始化过程当中惟一一个secondary core执行的代码。它的执行时间点在core1解复位以后,由secondary_start_kernel()调用,一般会配置core1的电源模式等。

  • smp_boot_secondary

做为开启SMP系统的钥匙函数,它是必定要实现的。由__cpu_up进行调用,设置core1解复位后要执行的第一条指令地址,使core1得以执行初始化代码并最终进入到secondary_start_kernel()函数中。

对于每一个多核ARM SoC而言,这个函数使必定要实现的,其实例化的方式截然不同,均可以参考以下方式:

而core1执行的第一条指令符号是secondary_startup,一般的作法是将符号secondary_startup的绝对地址写入SoC内部特定的寄存器,当core1被激活后,会自动跳转到该寄存器所存的地址处进行取指。

至此,4个smp相关的初始化函数介绍完毕,如下为kernel SMP的完整初始化流程。


推荐阅读


【1】【从0学ARM】你不了解的ARM处理异常之道
【2】为何使用结构体效率比较高? 必读
【3】9. 基于Cortex-A9 LED汇编、C语言驱动编写必读
【4】一文包你学会网络数据抓包必读
【5】10. 基于Cortex-A9的pwm详解 必读
【6】11. 基于ARM Cortex-A9中断详解 必读

 


 

进群,请加一口君我的微信,带你嵌入式入门进阶。


本文分享自微信公众号 - 一口Linux(yikoulinux)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。