TMS320F2838x DCSM Zone 1寄存器详解与嵌入式安全配置实战

📅 2026/7/19 22:07:26
TMS320F2838x DCSM Zone 1寄存器详解与嵌入式安全配置实战
1. DCSM Zone 1寄存器概览与安全架构核心在TMS320F2838x这类多核、高集成度的实时微控制器上做产品开发尤其是涉及工业控制、汽车电子或高端消费电子领域代码和数据的安全性往往不是“锦上添花”而是“生死攸关”的底线。我经历过不止一次因为早期安全设计考虑不周导致后期量产时面临固件被逆向或篡改的风险补救成本极高。德州仪器TI的双代码安全模块Dual Code Security Module, DCSM就是为此而生的硬件安全卫士而理解其核心——Zone 1寄存器组——是构建可靠安全方案的第一步。简单来说DCSM将芯片的存储资源Flash和RAM划分为两个独立的安全区域Zone 1和Zone 2。每个区域都有自己的密码CSM Password和一套完整的控制寄存器。Zone 1寄存器组就是用来管理和控制属于Zone 1的所有安全属性的“控制面板”。它不是一个单一寄存器而是一个从基地址0x4008_5000开始、包含约30个寄存器的集合。这些寄存器大体可以分为几类核心功能安全状态与控制如Z1_CR、密码与密钥管理如Z1_CSMKEYx、Z1_JTAGKEYx、存储资源分配如Z1_GRABSECTxR、Z1_GRABRAMxR、执行保护配置如Z1_EXEONLYSECTxR、Z1_EXEONLYRAM1R以及安全锁定与通用寄存器如Z1_OTPSECLOCK、Z1_GPREGx。这套机制的工作原理可以类比为一个高级别的“银行金库权限门禁系统”。芯片上电后默认所有受保护的存储区域金库都是锁定的Secure/Locked状态。你的代码相当于安保人员必须先在Z1_CSMKEY0-3这四个寄存器中输入正确的128位密码才能“解锁”UnsecureZone 1。一旦解锁你就可以根据Z1_GRAB...系列寄存器的配置决定Zone 1可以访问哪些Flash扇区和RAM块。更进一步Z1_EXEONLY...寄存器允许你将某些区域设置为“只执行”Execute-Only这意味着代码可以从中运行但无法被读取其内容这能有效防止核心算法被提取。而Z1_OTPSECLOCK寄存器则像是一把控制“后门”JTAG调试接口和“密码查看权限”的锁。理解这些寄存器不仅仅是读懂手册上的位定义更是要理解它们如何联动以及错误配置可能带来的“变砖”风险。例如如果你错误地将所有存储资源都划给另一个Zone或者误操作了Z1_CR的FORCESEC位都可能导致当前Zone的代码无法运行。接下来我们就深入这个“控制面板”看看每个关键部分该如何操作。2. 核心寄存器功能详解与配置逻辑2.1 安全状态与控制寄存器Z1_CRZ1_CRZone 1 Control Register是整个Zone 1安全状态的中枢神经。它的地址偏移是0x30x8。这个寄存器是只读的R但包含一个至关重要的可写位FORCESEC。我们不要只看位域表关键是要理解每个状态位在安全生命周期中的意义。UNSECURE (Bit 21)这是最重要的状态指示位。它直接告诉你Zone 1当前是锁定0还是解锁1状态。这个位不是由你写1来解锁的解锁的唯一正确方式是通过Z1_CSMKEYx寄存器写入正确的密码。上电后或执行FORCESEC操作后此位为0。ARMED (Bit 22)这是一个“准备就绪”标志。当你对OTP中的CSM密码位置执行一次“哑读”Dummy Read后此位会被硬件置1。这个操作通常由TI的启动引导程序Boot ROM或安全的初始化代码完成目的是将OTP中的密码加载到内部的比较电路中为后续的解锁比较做准备。在编写自己的安全初始化代码时必须确保执行了这次哑读否则密码验证无法进行。ALLONE (Bit 20) ALLZERO (Bit 19)这两个位反映了OTP中CSM密码的编程状态。ALLONE1表示密码全为0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF这是一个特殊状态意味着该Zone没有启用密码保护任何代码都可以直接解锁它即处于开放状态。ALLZERO1则表示密码全为0x0000 0000 0000 0000 0000 0000 0000 0000这是一个死亡状态意味着该Zone被永久锁定无法再被解锁常用于销毁芯片或确保最终产品固件绝对不可更改。在产品开发调试阶段绝对要避免意外将密码编程为全零。FORCESEC (Bit 31)这是整个寄存器中唯一一个你可以写入的位R-0/W。向该位写1会立即强制Zone 1进入锁定状态并复位本寄存器的所有位。这个操作是不可逆的除非再次输入正确密码解锁。它的典型用途是在代码完成关键安全操作例如验证完第二段引导程序后或检测到安全攻击时立即锁定区域保护敏感数据。实操心得在调试阶段我习惯在代码开头读取并打印Z1_CR的值快速确认ARMED和UNSECURE状态。如果UNSECURE为0而你的代码预期运行在Zone 1那么第一步就是检查密码加载和比对流程。FORCESEC位要慎用最好在代码中为其设置一个明确的、受保护的触发条件如特定的安全事件标志避免误操作。2.2 密码与密钥寄存器Z1_CSMKEYx 与 Z1_JTAGKEYx这是解锁Zone 1和JTAG接口的“钥匙孔”。Z1_CSMKEY0-3(偏移 0x20, 0x24, 0x28, 0x2C)这四个32位寄存器共同组成一个128位的密钥输入端口。解锁Zone 1的标准流程是确保Z1_CR.ARMED 1已对OTP密码区执行哑读。按顺序KEY0到KEY3将正确的128位密码写入这四个寄存器。硬件自动将写入的128位值与从OTP加载的密码进行比较。如果完全匹配则Z1_CR.UNSECURE位自动置1Zone 1解锁。任何一位不匹配解锁都会失败并且没有重试计数机制这是与一些智能卡芯片不同的地方。这意味着暴力破解在理论上是可能的但128位的密钥空间使得这在实践中不可行。Z1_JTAGKEY0-3(偏移 0x5C, 0x60, 0x64, 0x68)这组寄存器用于解锁JTAG调试接口。当Z1_OTPSECLOCK.JTAGLOCK1即JTAG被锁定时需要通过JLMJTAG Lock Module扫描链输入128位的JTAG密码到这四个寄存器。其比较对象是OTP中的JTAGPSWD区域。重要区别CSMKEY是由CPU通过总线写入来解锁代码执行权限而JTAGKEY是通过外部调试器如XDS通过JTAG扫描链写入来解锁调试访问权限。两者密码可以不同实现了代码运行和调试访问的分离控制。注意事项密码的存储和管理是安全的核心。切勿在发布的固件中以明文形式存储密码。标准的做法是在安全的环境下如产线将密码一次性编程到OTP中然后代码中只包含一个“解锁”函数该函数从非易失性存储器的加密区域或通过安全通信获取密码并在内存中瞬时使用后立即清除。CSMKEY寄存器是可读写的但读取它们只会返回上次写入的值或0不会泄露OTP中的真实密码。2.3 存储资源分配寄存器Z1_GRABSECTxR 与 Z1_GRABRAMxRDCSM的精妙之处在于精细化的资源划分。GRAB抓取寄存器的值决定了当Zone 1处于锁定状态时它能否访问特定的Flash扇区或RAM块。这些寄存器的值是从OTP中对应的Z1_GRABSECTx和Z1_GRABRAMx位置加载的上电后即固定。每个存储资源如CPU1 Flash Sector 0对应一个2位的字段其含义如下表所示字段值 (二进制)含义 (当Zone 1锁定时)00无效/不可访问。该存储资源对Zone 1完全不可用。01请求分配。Zone 1请求独占该资源。如果另一个Zone也请求01则冲突解决机制通常优先Zone 1会决定归属。10无请求。Zone 1不要求访问该资源。11解锁时可访问锁定时不可访问。这是最常用的配置之一允许Zone 1在解锁后使用该资源锁定时则禁止实现了动态安全隔离。例如Z1_GRABSECT1R的GRAB_SECT0位域控制CPU1 Flash Sector 0。如果你希望Zone 1的代码在解锁后能运行在这个扇区但锁定时如芯片刚启动不能读取或执行其中的代码就应将其OTP配置为11。Z1_GRABSECT1R控制CPU1的Flash扇区Sector 0-13。Z1_GRABSECT2R控制CMConnectivity Manager的Flash扇区。Z1_GRABSECT3R控制CPU2的Flash扇区。Z1_GRABRAM1R控制CPU1的LS0-LS7及D0、D1 RAM。Z1_GRABRAM2R控制CM与CPU间消息RAMMSG RAM及CM的C0、C1 RAM。Z1_GRABRAM3R控制CPU2的LS0-LS7及D0、D1 RAM。配置策略在规划项目时你需要绘制一个内存映射图明确哪些代码段、数据段必须放在Zone 1受保护区域。例如将安全引导程序、加密库、密钥管理代码放在Zone 1的Flash中并将其对应的GRAB位设为01或11。将非安全或第三方库代码放到Zone 2或公共区域。RAM的分配也同样重要用于处理敏感数据的RAM必须划归安全Zone。2.4 执行保护寄存器Z1_EXEONLYSECTxR 与 Z1_EXEONLYRAM1R这是防止代码提取的关键硬件特性。即使攻击者通过某种方式获得了存储器的读权限例如利用芯片的某些漏洞Execute-Only保护也能阻止他们直接读取Flash/RAM中的指令代码。Z1_EXEONLYSECT1R控制CM和CPU1 Flash扇区的执行保护。某位为0表示启用执行保护只能执行不能读/写为1表示禁用可读可执行。Z1_EXEONLYSECT2R控制CPU2 Flash扇区的执行保护。Z1_EXEONLYRAM1R控制各CPU和CM的RAM块的执行保护。注意RAM通常用于存储数据但有时也会用于动态加载代码如从Flash解密后运行。对此RAM启用执行保护可以增加攻击难度。重要限制执行保护仅在该存储资源已被分配给本Zone由GRAB寄存器决定时才生效。例如即使你将EXEONLY_CPU1_SECT0设为0如果GRAB_SECT0不是01或11这个保护也不会起作用。开发影响启用执行保护后调试器将无法读取该区域的反汇编代码给调试带来困难。因此建议在开发阶段关闭此功能在发布固件前再于OTP中启用。此外如果代码需要自修改如某些加壳技术或需要在RAM中动态生成代码则不能对相关RAM启用执行保护。2.5 安全锁定与通用寄存器Z1_OTPSECLOCK(偏移 0x4)这是一个状态寄存器反映OTP中安全锁定的配置。JTAGLOCK (Bit 0)为1时JTAG接口被锁定需要正确的JTAGKEY才能解锁。这是防止通过调试端口窃取固件的第一道防线。PSWDLOCK (Bit[7:4])如果OTP中对应字段为1111则CSM密码在OTP中的位置不受保护即使Zone被锁定调试器也能直接读取。在任何严肃的产品中都不应将其设置为1111。应设置为其他值使得只有解锁Zone后才能读取OTP中的密码实际上密码永远不应被软件读取。CRCLOCK (Bit[11:8])控制VCUViterbi/Complex Math Unit是否能对安全存储器计算CRC。用于安全启动时的完整性校验。Z1_GPREG1-4(偏移 0x10, 0x14, 0x18, 0x1C)这四个通用寄存器非常有用。它们的值从Zone 1的USER-OTP区域加载。你可以在这里存储一些非易失性的配置信息例如软件版本号硬件配置标识安全启动的容错计数器自定义的激活标志 因为它们是从OTP加载的所以是只读的且内容在芯片出厂编程后即固定非常适合存储“黄金映像”的元数据。3. 安全模块配置实战流程与代码示例理解了寄存器之后我们来看如何将它们组合起来完成一个典型的Zone 1安全配置和启动流程。这里假设你使用Code Composer Studio (CCS)和C2000的DriverLib或直接寄存器操作。3.1 步骤一OTP预编程规划与准备在编写任何安全代码之前必须在Excel或文本文件中规划好OTP的配置。这包括CSM密码生成一个强壮的128位随机数例如使用安全的随机数发生器。备份好这个密码丢失意味着Zone 1永久锁定除非密码是全1开放状态。JTAG密码可以不同于CSM密码用于独立控制调试访问。GRAB寄存器映射根据你的内存布局图确定每个Flash扇区和RAM块对应的2位值00,01,10,11。EXEONLY配置确定哪些核心算法代码扇区需要启用执行保护设为0。GPREG值规划好四个通用寄存器的用途和初始值。OTPSECLOCK配置确定JTAGLOCK、PSWDLOCK、CRCLOCK的值。3.2 步骤二上电后Zone 1状态诊断与解锁系统上电后运行在非安全区域如ROM或未受保护的Flash的引导代码需要诊断并解锁Zone 1。// 假设使用DriverLib并已包含相关头文件 #include driverlib.h #include device.h bool Zone1_Unlock(void) { uint32_t csmPswd[4]; // 存储128位密码应从安全位置获取 // !!! 警告此处仅为示例实际密码绝不能硬编码在源码中 !!! // 应从加密存储、安全元件或通过安全协议获取。 csmPswd[0] 0x01234567; csmPswd[1] 0x89ABCDEF; csmPswd[2] 0xFEDCBA98; csmPswd[3] 0x76543210; // 1. 检查ARMED状态确保OTP密码已可被比较 // 通常BootROM会做这件事。如果没有需要先执行一次对OTP密码地址的哑读。 // 这里假设已ARMED。 if ((HWREG(DCSM_Z1_BASE DCSM_O_Z1_CR) DCSM_Z1_CR_ARMED_M) 0) { // 未ARMED需要先触发哑读。地址参考TRM中Z1 CSMPSWD OTP位置。 // volatile uint32_t dummy *(volatile uint32_t *)(0x780400); // 具体地址请查阅芯片数据手册。 return false; // 或执行哑读操作 } // 2. 检查当前是否已解锁 if (HWREG(DCSM_Z1_BASE DCSM_O_Z1_CR) DCSM_Z1_CR_UNSECURE_M) { return true; // 已解锁直接返回成功 } // 3. 检查密码是否为全1开放状态或全0永久锁定 uint32_t crReg HWREG(DCSM_Z1_BASE DCSM_O_Z1_CR); if (crReg DCSM_Z1_CR_ALLZERO_M) { // 密码全零Zone 1已永久锁定 // 记录错误系统无法继续。 SystemHaltWithError(ERROR_ZONE_PERMANENTLY_LOCKED); return false; } if (crReg DCSM_Z1_CR_ALLONE_M) { // 密码全一Zone 1处于开放状态无需密码即可访问。 // 但为了安全我们可能仍然希望“形式上”解锁或者记录一个警告。 // 实际上对于全1密码写入任何值包括全1都能解锁。 } // 4. 写入密码到CSMKEY寄存器进行解锁 HWREG(DCSM_Z1_BASE DCSM_O_Z1_CSMKEY0) csmPswd[0]; HWREG(DCSM_Z1_BASE DCSM_O_Z1_CSMKEY1) csmPswd[1]; HWREG(DCSM_Z1_BASE DCSM_O_Z1_CSMKEY2) csmPswd[2]; HWREG(DCSM_Z1_BASE DCSM_O_Z1_CSMKEY3) csmPswd[3]; // 5. 关键插入一个内存屏障和延迟确保写操作完成并被硬件处理 __asm( NOP); __asm( NOP); __asm( NOP); __asm( NOP); // 6. 验证解锁是否成功 if (HWREG(DCSM_Z1_BASE DCSM_O_Z1_CR) DCSM_Z1_CR_UNSECURE_M) { // 解锁成功 // 立即清除内存中的密码副本防止被窃取 csmPswd[0] 0; csmPswd[1] 0; csmPswd[2] 0; csmPswd[3] 0; return true; } else { // 解锁失败密码错误。 // 应采取安全措施如递增错误计数器达到阈值后触发永久锁定或系统复位。 HandleSecurityBreach(); return false; } }3.3 步骤三配置资源访问与执行保护基于OTPGRAB和EXEONLY寄存器的配置是在OTP编程时确定的运行时是只读的。但你的软件需要知道当前的配置以决定代码和数据如何布局。你可以在初始化时读取这些寄存器判断哪些资源可用。void CheckZone1MemoryConfiguration(void) { uint32_t grabSect1 HWREG(DCSM_Z1_BASE DCSM_O_Z1_GRABSECT1R); uint32_t exeOnlySect1 HWREG(DCSM_Z1_BASE DCSM_O_Z1_EXEONLYSECT1R); // 示例检查CPU1 Sector 0的配置 uint32_t grabSect0_cfg (grabSect1 0) 0x3; // 获取GRAB_SECT0字段 uint32_t exeOnlySect0_cfg (exeOnlySect1 0) 0x1; // 获取EXEONLY_CPU1_SECT0位 if (grabSect0_cfg 0x3) { // 配置为11解锁时可访问 if (HWREG(DCSM_Z1_BASE DCSM_O_Z1_CR) DCSM_Z1_CR_UNSECURE_M) { // Zone 1已解锁可以访问Sector 0 if (exeOnlySect0_cfg 0) { // 该扇区为Execute-Only不能读取代码内容 DEBUG_PRINT(Sector0: Accessible (Execute-Only) when unlocked.\n); } else { DEBUG_PRINT(Sector0: Fully accessible when unlocked.\n); } } else { DEBUG_PRINT(Sector0: Inaccessible (Zone locked).\n); } } else if (grabSect0_cfg 0x1) { DEBUG_PRINT(Sector0: Requested for Zone1 (may be exclusive).\n); } // ... 检查其他扇区和RAM }3.4 步骤四安全启动与完整性校验集成DCSM与安全启动流程紧密集成。Z1_CMACKEY0-3寄存器存放了用于验证后续引导映像例如从外部Flash加载的应用程序的CMAC密钥。安全启动ROM会使用这个密钥如果OTP中使能了安全启动来验证映像的完整性和真实性。OTP配置在OTP中编程CMACKEY和使能安全启动相关选项。映像签名在编译生成应用程序二进制后使用相同的密钥和指定的算法如AES-CMAC对映像进行签名并将签名附加到映像中。ROM验证芯片上电后Boot ROM在跳转到Zone 1代码前会使用Z1_CMACKEY验证映像签名。失败则中止启动。软件验证Zone 1的引导程序在接管后可以再次使用Z1_CMACKEY或派生的密钥验证下一级映像形成信任链。// 伪代码在Zone 1引导程序中验证下一级应用程序 bool VerifyApplicationImage(uint32_t* imageStart, uint32_t imageSize) { // 1. 从Z1_CMACKEY寄存器读取密钥仅当Zone已解锁且OTP允许 // 注意直接读取可能受OTPSECLOCK.CRCLOCK控制。通常ROM已使用过。 uint32_t cmacKey[4]; // 谨慎操作确保安全状态允许读取 cmacKey[0] HWREG(DCSM_Z1_BASE DCSM_O_Z1_CMACKEY0); cmacKey[1] HWREG(DCSM_Z1_BASE DCSM_O_Z1_CMACKEY1); cmacKey[2] HWREG(DCSM_Z1_BASE DCSM_O_Z1_CMACKEY2); cmacKey[3] HWREG(DCSM_Z1_BASE DCSM_O_Z1_CMACKEY3); // 2. 提取映像中的签名假设附加在末尾 uint32_t* storedSignature imageStart (imageSize - SIGNATURE_SIZE_WORDS); // 3. 使用硬件加速的CMAC引擎如VCU或软件库计算映像的CMAC uint32_t computedSignature[4]; ComputeCMAC(cmacKey, imageStart, imageSize - SIGNATURE_SIZE_BYTES, computedSignature); // 4. 比较计算出的签名和存储的签名 for(int i 0; i 4; i) { if(computedSignature[i] ! storedSignature[i]) { // 验证失败可能映像被篡改。 SecurityFaultHandler(); return false; } } return true; }4. 常见问题、调试技巧与避坑指南配置DCSM时极易因理解偏差或操作疏忽导致芯片“变砖”或安全功能失效。以下是我在实际项目中总结的常见陷阱和应对方法。4.1 问题一Zone 1无法解锁代码无法运行症状程序在尝试解锁Zone 1后Z1_CR.UNSECURE位始终为0后续代码位于Zone 1的Flash中无法执行。排查步骤检查ARMED位首先读取Z1_CR.ARMED。如果为0说明OTP密码区域的“哑读”未执行。确保你的启动代码或BootROM执行了对Z1_CSMPSWDOTP地址的读操作即使丢弃结果。对于C2000通常BootROM会处理此事但自定义引导程序可能需要自己完成。验证密码这是最常见的原因。百分之百确认你写入Z1_CSMKEY0-3的128位值与实际编程到OTP中Z1_CSMPSWD0-3位置的值完全一致包括大小端。建议在OTP编程后通过调试器如果JTAG未锁读取OTP区域验证或者使用一个已知密码的测试芯片反复验证解锁流程。检查ALLZERO/ALLONE读取Z1_CR.ALLZERO和ALLONE。如果ALLZERO为1说明密码被编程为全零Zone 1已永久锁定无法挽回。如果ALLONE为1则密码是全1任何写入操作或保持KEY寄存器为0都可能解锁但你的代码可能写入了错误的值。检查GRAB配置确认你尝试运行的代码所在的Flash扇区其对应的Z1_GRABSECTxR寄存器值不是00。如果是00即使Zone 1解锁CPU也无法从该扇区取指。时序问题在写入四个KEY寄存器后必须插入足够的空操作NOP或数据同步屏障DSB确保写操作完成后再去读取状态位。参考TI例程通常需要至少4个NOP。4.2 问题二调试器JTAG连接被拒绝症状CCS无法连接芯片提示“找不到设备”或“安全锁定”。排查步骤确认JTAGLOCK状态读取Z1_OTPSECLOCK.JTAGLOCK位。如果为1则JTAG已被锁定。使用JTAGKEY解锁需要通过JTAG扫描链输入Z1_JTAGKEY密码。在CCS中这通常通过“Unlock Security”之类的脚本或插件完成你需要提供正确的128位JTAG密码。确保JTAG密码与CSM密码区分开。检查JLM_ENABLEZ1_JLM_ENABLE寄存器控制JTAGLOCK的使能逻辑。如果OTP中Z1OTP_JLM_ENABLE不是全1则JTAGLOCK功能由该寄存器的低4位控制。确保其值允许JTAG访问值为0xF或密码匹配。硬件连接排除硬件问题如TCK、TMS、TDI、TDO线路连接是否正常电源是否稳定。4.3 问题三启用Execute-Only后无法调试代码症状对某个Flash扇区启用执行保护EXEONLY0后调试器无法设置断点、查看反汇编或内存内容。解决方案开发阶段在OTP配置中将该扇区的EXEONLY位暂时设为1禁用保护。OTP通常有仿真区域可以先在仿真OTP中测试。发布阶段在最终量产时再将EXEONLY位编程为0。务必在仿真环境下充分测试启用保护后的代码功能因为某些调试手段将失效。替代调试使用串口打印日志、GPIO翻转测时序、或保留一小块非执行保护区域用于调试输出。4.4 问题四资源分配冲突导致不可预知行为症状系统运行不稳定某些内存访问导致硬件错误。排查仔细检查Z1_GRAB...和Z2_GRAB...寄存器配置。确保同一存储资源如CPU1 D0 RAM没有同时被两个Zone以01请求分配方式争夺。虽然DCSM有仲裁规则但错误的配置可能导致访问异常。使用11解锁时可访问是更安全的选择它为资源提供了动态归属。4.5 安全配置的黄金法则先仿真后烧写始终先在OTP的仿真存储器如果支持或Flash中测试完整的安全启动和运行流程。TI的很多开发板支持“OTP仿真模式”。备份密码将CSM密码和JTAG密码以加密形式离线保存并建立严格的访问管理。丢失密码等于丢失芯片。分阶段锁定产品开发周期内逐步提升安全等级。早期开放JTAG和CSM密码全1中期锁定JTAG但保留CSM可解锁最终量产时锁定CSM并启用执行保护。理解复位影响SYSRSn系统复位和PORESETn上电复位对某些寄存器的影响不同。例如Z1_CR的大部分位由SYSRSn复位而JTAGLOCK由PORESETn复位。这意味着通过软件复位可能无法解除JTAG锁定。阅读勘误表TI的芯片勘误表Silicon Errata中经常有DCSM相关的重要提示或限制务必查阅你所用芯片型号的最新版本。配置TMS320F2838x的DCSM Zone 1是一个需要极度谨慎和细致的过程。它就像为你的嵌入式系统设计一套完整的门禁、监控和保险柜系统。寄存器手册是蓝图而实际配置则是施工。希望这篇详细的解读和实战指南能帮助你在下一次涉及嵌入式安全的项目中更加自信和稳妥地使用这项强大的功能。记住安全不是一个功能而是一个贯穿产品生命周期的过程从芯片选型、硬件设计、固件开发一直到生产烧录每一步都需要将DCSM这样的硬件安全特性考虑在内。