90、【OS】【Nuttx】【启动】栈溢出保护:配置项解析
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
接之前 blog
【OS】【Nuttx】【启动】栈溢出保护:内联汇编
简单分析了下内联汇编的语法,把周边的点点滴滴细节分析完毕,终于可以开始继续往下分析了
栈溢出保护
还是这张熟悉的图
先回顾一下之前的 blog
【OS】【Nuttx】【启动】启动函数分析
这短短一行语句涉及的知识点可不少,结合下图,首先这条语句的作用是将栈指针减到栈底,然后栈底往上 64 字节区域作为栈溢出检测区域,其逻辑上的栈底存放在 r10 寄存器,至于为什么存放在 r10 寄存器,前面 blog 花了很大篇幅已经解释了
【OS】【Nuttx】【启动】栈溢出保护:r10 寄存器
有了这个基础后,可以继续往下去分析
ARMV7M_STACKCHECK
下面来看这个栈溢出检查配置项的描述
管中窥蠡,从配置项的描述中,可以看到栈溢出的一些整体和细节,下面讲几个关键点:
- 首先 81 行,bool 表示这个配置项是一个布尔值(配置项开或关),引号中的文字是用户在配置界面中看到的提示信息:在每次函数调用时检查是否发生栈溢出
之前 blog 【OS】【Nuttx】【构建】配置 stm32 工程 讲过如何配置 stm32 工程,并且里面还讲到了 configure 脚本的配置,在 bash 终端输入
./configure menuconfig
如果没有配置 configure 脚本,在 nuttx 工程目录下用 make menuconfig 也是一样的
打开配置界面后,在 System Type 目录下,可以找到栈溢出配置项的开关,这里的描述信息和 bool 后面的引号文字是一样的
- 接着 82 行表示这个配置项默认是关闭的,这个配置界面可以看出来,没有被选上,后面会讲为什么要默认关闭这个配置项,如果想启用这个功能,需要手动在配置界面设置为 y
- 83 行表示这个功能只在支持栈溢出检测的平台上启用,ARMV7M_HAVE_STACKCHECK 是另一个配置项,用来标识当前平台是否支持这种检测机制,可以看到这个配置项默认是关闭的,并且 bool 类型后面没有引号文字,说明该配置项不在配置界面中被支持,那么这个配置项在哪里被支持呢?
可以看到在另一份 Kconfig 文件中(描述 ARM 架构所支持的配置),有 ARMV7M_HAVE_STACKCHECK 的配置,这份配置文件是静态固定的,不接受配置界面进行动态配置,应该由芯片厂商 FAE 或熟悉相关架构的人员进行固化,可以看到,我们所选的 STM32 系列是全系支持 ARMV7M_HAVE_STACKCHECK 栈溢出检测的
- 84 行 help 也很有意思,表示从 84 行帮助信息开始,用户在配置工具中选择该项的 Help 时会看到这些说明
点击这里的 Help,可以看到和 Kconfig 同款的帮助说明信息,还能看到默认值以及类型,定义配置项的文件位置,以及依赖性(这里的所有的依赖性都会显示出来,包括依赖项 ARMV7M_HAVE_STACKCHECK 的依赖项)
先到这里吧,下篇 blog 继续