SylixOS 多核SMP BSP开发(二十一)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2021年4月10日23:25:12 评论 1,209

修改内核入口文件

有了前面的基础知识后,我们从本章开始正式学习多核BSP开发。首先要做的工作就是修改startup.S这个内核入口文件,为了支持多核我们需要添加修改一些代码。

1. 调整栈设置

我们知道单核下内核入口文件的处理流程是:中断向量表设置 -> 关闭Cache和MMU -> 栈设置 -> 内核数据段和BSS段设置 -> 跳转C入口。这里其实有一个不严谨的地方,就是关闭Cache和MMU这步我们都是调用的内核提供好的接口,我们不知道这些接口实现是不是用到了栈,而栈设置是放在这之后的。之所以敢这么做是因为我们知道uboot已经设置了栈为某个地址,即使内核代码中用到了栈,这些代码也能正常工作。

但是如果是从核执行这些代码就可能有问题了,我们不知道从核被唤醒后它的栈是指向哪的,所以我们需要先设置栈再关闭Cache和MMU。第一个修改的地方就是将栈设置代码移动到关闭Cache和MMU操作之前,SylixOS启动时多个核使用的栈空间是在编译时确定的,总大小是通过config.h 中的BSP_CFG_BOOT_STACK_SIZE宏来配置的,每个核默认栈空间大小是在startup.S 中通过CPU_STACKS_SIZE宏来配置,所以BSP需要确保BSP_CFG_BOOT_STACK_SIZE 配置的大小要比所有核总共需要的栈空间要大:

SylixOS 多核SMP BSP开发(二十一)

然后需要根据当前启动的是哪个核来计算使用的栈空间的起始地址:

SylixOS 多核SMP BSP开发(二十一)

2. 跳转从核入口

主核启动的时候需要进行内核数据段的搬运和BSS段清零操作,从核启动的时候就不需要进行这个操作了,所以启动的时候需要跳过这段处理,在关闭Cache和MMU之后直接跳转到从核C入口执行:

SylixOS 多核SMP BSP开发(二十一)

SylixOS 多核SMP BSP开发(二十一)

halSecondaryCpuMain 就是从核的C语言函数入口,这个接口中需要做的工作会在后续章节中讲解。

我们来总结下从核启动时在startup.S中做的事情:中断向量表设置 -> 栈设置 -> 关闭Cache和MMU -> 跳转C入口。可以看出基本流程和主核启动时差不多,主要就是少了数据段和BSS段的设置。

gewenbin
  • 本文由 发表于 2021年4月10日23:25:12
  • 转载请务必保留本文链接:http://www.databusworld.cn/10231.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: