傻孩子(GorgonMeducer) · 2020年06月11日

简单粗暴解读Cortex-M23/33(上)

作者:GorgonMeducer 傻孩子
首发:裸机思维

猝不及防的,ARM在最新的TechComm上发布了两款ARMv8-M架构的新处理器——自从年初发布新架构以来,靴子总算落地了。

内心飘过弹幕:

谁TM告诉我,这个M23和M33是什么鬼?

从个位数一下蹦到两位数了喂!

前面十几位兄弟怎么了?喂!

别说跟M3有啥关系,这以后下第n代是不是就该叫2333333了?

该来的总会来,那么如何简单粗暴的理解这两个全新的处理器呢?以下是傻孩子独家特别提供的的无责任囫囵吞枣公式:

Cortex-M23 = 

Cortex-M0/M0 + 硬件除法器 + 性能提升 +

指令集不可忽略的小动作 +

安全扩展(TrustZone for ARMv8-M) +

“哎妈呀我错了,我改还不行么?”

Cortex-M33 =

Cortex-M3/M4 + 性能提升 +

指令集可以忽略的小动作 +

安全扩展(TrustZone for ARMv8-M)+

“哎妈呀我错了,我改还不行么?”

再简单点说就是无敌增强版的“M0/M0+,M3/M4”加“安全扩展”。有人说,ARMv8-M的主要功能就是为Cortex-M家族引入TrustZone,这么看来也是不无道理的。

  1. 增强版的Cortex-M0/M0+

根据官方的说法,Cortex-M23实现的是ARMv8-M架构的Baseline子架构,我们不妨理解为手机里面的“入门级”产品。

0.jpg
      注:图片来自ARM官网

M23从定位上也非常直接,就是给M0/M0+增加个安全扩展。因此,实际上所有为M0/M0+编译生成的二进制代码基本上都可以“无修”的在Cortex-M23/M33上执行——除非你原本的代码使用了MPU。此外M23居然配备了硬件除法器,这无疑在原本M0和M0+主打的8位/16位市场上把“基本配置”又提升了一个档次。当然,相应的,原本就不大的内核上,除法器面积的增加在比率上可是“秃子头上的虱子”——你懂的——关我们消费者屁事!

指令集上,M23师承ARMv6-M,除了支持“安全扩展”所必须的一系列指令之外,这款入门级产品还做了一个“不可忽略的小动作”——也就是说,除了M33以外,M23也可以通过很小的代价支持“暗代码”。什么是暗带么呢?和“暗物质”只能理论上知道它存在却很难探测到类似——“暗代码”是一类只能执行(取指令)却根本无法读取代码本身OPCODE的机器码——也就是人们常说的XO(Execute-Only)代码。“暗代码”并不是依靠内核来实现的,但却需要编译器和内核共同努力才能支持。这是因为XO的特性是靠芯片设计厂商提供提供一个特殊的存储器来实现的,这个存储器最特殊的特性就在于,只能“取指”,不能进行普通的数据访问。这就要求“暗代码”里不能直接保存任何常数,他们必须编码到指令里面——成为指令的一部分,以单纯OPCODE的立即数存在。ARMv6-M的指令集大部分都是16位的Thumb指令,16位的OPCODE可以编码的立即数长度可想而知——少得可怜。ARMv7-M由于引入了32位的Thumb2指令集,从而极大增强了OPCODE携带立即数的能力。为了将这一能力引入ARMv8-M的Baseline指令集,MOVT和MOVW这两个可以分别携带32位立即数高低16位的指令就被特别加入到M23的指令集中。ARMv8-M强调的是安全,“暗指令”有多大的分量,可想而知。

Cortex-M23——这个M0不简单。

2.    增强版的Cortex-M3/M4

相对Cortex-M3/M4来说,M33在性能上有了提升并不是什么意料之外的事情,不提也罢。值得说明的是,从城里来的Cortex-M7在性能上仍然可以甩其他Cortex-M土包子几条街——6级流水线和3级流水线的差别可是三缸夏利和六缸宝马之间的差距所不能比拟的!(认真脸)。

0-1.jpg
      注:图片来自ARM官网

3.     ARMv8-M是个知错就改的好少年

       我不知道有多少人真正用过ARMv7-M,也就是M3/M4的MPU——简单说就是个以Region为单位来修改Memory属性的系统级外设。原本设计的时候想法很简单,一个Region,给个大小(Size)给个基地址(Base Address),再给个属性(Memory Attribute),一使能,就工作了,很简单,很Happy。然而,出于优(pi)化(gu)内(jue)核(ding)面(nao)积(dai)的原因,Region地址范围的设定被人为加入了一个限定:

基地址(Base Address)必须对齐(Aligned with)到它的尺寸(Size),而且尺寸必须是2的整数次方(还必须大于4次方)。

举个例子:一个Region大小为512K,那么基地址必须是512K的整数倍……如果你还不能理解这个问题蛋疼的点在哪里,设想一个任意大小的Region该怎么设定,比如,一个234K大小的Memory该咋办?——还能咋办,用多个Region组合出来呗。

       正是这个蛋疼的限制,导致几乎没有什么RTOS可以很好的使用MPU,也罕有身边的项目把MPU这么骨感的现实应用的如理想般美好。

那么ARMv8-M做了什么呢?他更正了这一蛋疼的设定,Region的设置由“基地址+尺寸”进化为“起始地址+终止地址”,除了这两个地址都必须是32字节的整倍数的要求外,再也没有变态的关于“基地址必须是Region大小的整倍数”这样的限定。是不是突然觉得眼前一亮,是不是突然发现了一个宝藏?MPU顿时好玩起来。

ARMv8-M的MPU是个好同志,士别三日当刮目相看

4.      安全扩展(Trust Zone for ARMv8-M)是什么gui?

请听下回分解。

专栏推荐文章


如果你喜欢我的思维,欢迎订阅裸机思维
版权归裸机思维(傻孩子图书工作室旗下公众号)所有,
所有内容原创,严禁任何形式的转载。
推荐阅读
关注数
1466
内容数
108
探讨嵌入式系统开发的相关思维、方法、技巧。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息