开门见山
请说下单片机(Arm)在运行到 main() 函数前,都做了哪些工作?
常见问题
1.系统初始化工作,太泛泛
2.硬件初始化,比较不具体
答题思路
这道题应该从两方面回答,一个是比较表面的硬件的初始化(价值 200),另一个比较深层次的 C 环境的初始化,这也是加分比较多的一点(价值 800)。
芯片上电后,系统在指定地址取到 reset handler 地址,并执行; reset handler 主要就是处理 main 之前的事情并最终跳转到 main。
硬件相关配置主要包括:
系统上电后,会使用默认的时钟配置运行,所以重新配置系统时钟(通过 PLL 等)并不是必须的;
对于需要动态注册的中断处理程序,需要修改中断表寄存器指向内存中设置好的中断向量表;
对系统的 cache、访问控制等 feature 进行控制;
对 flash 控制器进行配置等;
C 环境初始化主要包括:
bss 段清零
data 段复制
栈指针设置
堆内存初始化
单片机中的程序通常是片上执行的(内部 norfalsh),程序同样符合 elf 规范,代码和只读数据存储在 norflash 上,而数据中的非零数据存储在二进制中的 data 段中,启动后需要复制到 SRAM 上,实现数据的读和写;对于那些零数据,并不存储在 flash 里,其段名是 bss 这种,程序中只记录区域范围,启动后需要对相应区域(SRAM 中的 bss 位置)置零。
通过上述数据的复制和清零,main 函数(C 语言函数)才可以访问全局变量等和其相关的数据。
同时,C 函数会使用栈来暂存临时数据,启动阶段需要将 sp 栈指针设置为规划好的栈地址。
此外,还需要调用编译器相关的初始化代码,比如 __main 来进行一些特性的初始化,最后调用 main 函数。
以上过程,具体可以参考下 mcu 的启动代码以及链接脚本,通常是汇编文件和 ld 文件
大家对可信计算感兴趣可以订阅我的可信计算专栏,下面是可信计算中的相关内容:
1. 背书凭证(TPM 是正经的)
背书凭证由生成背书密钥 EK 方颁发,EK 是在制作过程中生成的,即 TPM 制造商会生成 EK。不过,EK 可以在发给终端用户前的任意点生成,只要 TPM 制造商声明 EK 已经正常创建并嵌入到可用的 TPM 中。
EK密钥对在客户拿到平台后生成的话,密钥生成的条件可能会影响背书的提供。
背书凭证包含的信息有:
TPM 制造商名称 TPM 零件号 TPM 版本或阶段 EK 公钥
虽然 EK 公钥是公开的,但因为其和 TPM 一一绑定并会对平台进行扩展,所以属于敏感隐私。TCG 预期每个 TPM 需要有一个 EK 凭证。
2. 符合性凭证(TPM 或平台的设计和实现是正经的)
这些证书由具有足够可信度的任何人发布,以评估TPM或包含TPM的平台。这些评估可以由平台制造商、供应商或独立实体来进行。这个符合性凭证表明评估方根据评估指南同意可信构建元素TBB 的设计和实现。通过签发凭证,评估者可以证明评估结果,这些会被用于后期的检查。TCG 通过定义有意义的评估标准和准则来促进评估。
评估方可以向一个平台签发多个符合性凭证,一个是给 TPM 的,其他是签给各个可信构成元素 TBB 组件的。
符合性凭证可能包含以下信息:
评估方名称 平台制造商名称 平台型号 平台版本(如果有的话) TPM 制造商名称 TPM 型号 TPM 版本号或阶段 符合性凭证不包含任何唯一识别任何平台特定的信息。
TCG 设想每个平台模型可能存在多个符合性证书,但同一品牌和型号的多个平台只需要一组证书。
3. 平台凭证(平台是正经的平台)
平台凭证由平台制造商、供应商或者任引用何具有足够信用的相关方颁发,平台凭证能够唯一识别平台的制造商并描述平台属性。平台凭证会引用 TPM 背书凭证以及相关的符合性凭证,这些引用由引用凭证的消息签名构成。平台凭证可以被看做是隐私敏感信息,这个凭证和特定平台相关,而不是和一类平台相关。
平台凭证包含如下信息:
平台制造商名称 平台型号 平台版本(如果适用) 背书凭证 符合性凭证
平台凭证根据背书凭证证明平台包含一个 TPM。TCG 建议每个平台实例只有一个平台凭证。
4. 验证(资格)凭证(平台内的固件正经的哈希)
TCG 建议可测量组件(软硬件)能够在功能测试后能够生成其度量值,形成对应的凭证。当然,这只是对那些能够对安全造成威胁的组件。这些度量值需要在安全环境下生成,并形成签名文档,即验证凭证,在运行时进行度量值比较。
以下一些组件通常需要验证证书:
视频适配器 磁盘存储适配器 通信控制器/网络适配器 处理器 键盘和鼠标 软件
验证凭证由验证实体颁发,任何愿意并有能力度量、证明这些度量值的实体都可以视作验证实体。通常,组件制作商产生这些值的最佳选择。组件描述中的任何一部分可能成为信任决策的原料。然而,验证凭证的候选组件可能会造成安全威胁。
组件描述至少包含如下元素:
验证实体名称 组件制造商名称 组件型号 组件版本或阶段 度量值 组件能力(比如不可改,这个是可选的)
一个型号中的一组组件可以颁布一份凭证,也可以颁发多个凭证。
组件更新、升级流程由供应商自定义,比如如何使原来的验证凭证无效等。
5. 身份证明凭证(业务身份)
证明身份凭证(身份证)是用来证明 AIK 私钥的凭证,由 AIK 公钥和其他签发者认为有用的信息组成,证明凭证是由可信服务方颁发并能验证各种凭证同时保证客户端的隐私条款。
通过签发证明身份凭证,签发者能够证明 TPM 的真实性,证明 TPM 的一些事实。证明的目的是 TPM 拥有 AIK 并且这个 AIK 绑定了有效的背书凭证、符合性凭证、平台凭证。受信方进一步保证了其遵守的隐私保护满足用户期望,这些隐私包括在注册过程中暴漏的个人隐私数据。
证明身份凭证参考其他凭证如下:
证明身份凭证包含了一个TPM 制造商和型号的引用,如下图中 C,没有引用隐私敏感的 EK
证明身份凭证同时包含了平台制造商和型号如图 D,值得注意的是这个引用并不是引用平台凭证本身,而是引用平台凭证中信息不敏感的信息
最后,证明身份凭证包含一个指向 TPM 和平台符合性的条目,如图 E
挑战者可以使用该信息以及证书中的其他信息,通过认证协议信任平台。