This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:在 TMS570系列 MCU 上通过 MPU 防止微处理器读取/写入

Guru**** 1996415 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1439325/tms570lc4357-protecting-from-nullptr-read-writes-via-mpu-on-tms570-series-of-mcus

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

工具与软件:

大家好、TI 专家:

我最近遇到了 这篇文章: 利用 ARM Cortex-M MPU 实现零指针保护。  它概述了  一种巧妙的方法、通过在0x00处设置 MPU 区域(其中 MPU 会阻止所有读取/写入)、防止对地址0x00 (nullptr)进行读取/写入。   本文介绍了 Cortex-M 的这种无效保护、但对于 Cortex-R、以及在 TMS570上实现的基于 VIM 的硬件中断调度方法、该保护应该保持相似。 一个有趣的方面是、它在 Cortex-M 上运行时不移动矢量表(请参阅副标题"矢量表呢?") 段落中的表达式)、这对于无法移动矢量表的 TMS570而言极具吸引力。

为了移植到 TMS570、我设置了一个0x00 - 0x20之间的 MPU 区域(因为使用 VIM 时中断向量仅为32字节)、并将其声明为  MPU_PRIV_NA_USER_NA_NOexec 和 NORMAL_OINC_NONSHARED 

我希望这足以避免 nullptr 读/写、但不幸的是、它不能立即在 TMS570LC4357上工作--我最后看到红色的错误 LED、调试器在 sys_intvecs.asm 中的 prefetchEntry 发生故障或之前断开。   

有人知道此方法是否实际上可以移植到 TMS570以及如何实现的吗?

谢谢!
 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨 

    从 HALCoGen 为任何新工程生成的默认配置将始终阻止空指针写入。

    您可以看到、在特权和用户模式下、闪存的前4MB 都配置为只读、但我们只保留前4MB 的执行。 因此、相同的配置也适用于矢量、因为它们也是从0x0到0x20的。 因此、这里不会进行空指针写入。

    [报价 userid="586213" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1439325/tms570lc4357-protecting-from-nullptr-read-writes-via-mpu-on-tms570-series-of-mcus "]为了移植到 TMS570、我设置了一个0x00 - 0x20之间的 MPU 区域(因为使用 VIM 时中断向量仅为32字节)、并将该区域声明为  MPU_PRIV_NA_USER_NA_NOexec 和 NORMAL_OINC_NONSHARED 。[/QUOT]

    这可能是您的情况下的问题、也许我们不应该为矢量保留 No execution (noexec)、这是因为 resetEntry (0x0)的闪存的起始地址将只指向代码起始地址、在本例中 _c_int00。

    因此、向量应该执行0x0以将执行移动到代码中。 因此、我们可能不会使向量保持无执行状态。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、 --添加 EXEC 标志可以解决问题!  现在、我们同时具有  nullptr 写保护和读保护、类似于前面链接的文章(使用 ARM Cortex-M MPU 进行 NULL 指针保护)中的方法。

    我看到的一个问题是启用了 SafeTI 测试。  这些函数看起来像是执行矢量表的读取(因此会导致 MPU 故障):

    56. b svcEntry
     00000000:??? 目标无法读取0x00000000 [代码= 0x1]
     57 prefetchEntry
     00000004:??? 目标无法读取0x00000004 [代码= 0x1]
     58 b prefetchEntry
     00000008:??? 目标无法读取0x00000008 [代码= 0x1]
     59 DataEntry
     0000000c:??? 目标无法读取0x0000000C [代码= 0x1]
     60 b DataEntry
     00000010:??? 目标无法读取0x00000010 [CODE=0x1]
     61 b phantomInterrupt
     00000014:??? 目标无法读取0x00000014 [CODE=0x1]
     62 LDR PC、[PC、#-0x1b0]
     00000018:??? 目标无法读取0x00000018 [CODE=0x1]
     63 LDR PC、[PC、#-0x1b0] 0000001c
    :??? 目标无法读取0x0000001C [代码=0x1] 
    

    我移动 flashBadECC1flashBadECC2离开了0x00区域、但仍然看到上面的问题。  您也许知道哪个自检可能执行这些读取、从而与0x00 - 0x20处的 MPU 读取保护相冲突?  

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨 

    我 flashBadECC1flashBadECC2从0x00区域移动并离开、但仍然看到上面的问题。  您也许知道哪个自检可能执行这些读取、从而与0x00 - 0x20处的 MPU 读取保护相冲突?  [报价]

    您是正确的 flashBadECC1和 flashBadECC2将使用此矢量表位置。 但我不记得其他哪些测试可以使用该区域。

    我也怀疑 IRQ 和 FIQ 中断也依赖于此区域:

    我想、禁用此向量位置的读取权限可能不是一个好主意。 无缝执行任何应用程序可能至少需要读取权限。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、 。  有趣的是-在原来的文章中它指出在正常的异常处理中、MCU 使用的指令与 LDR/STR 不同 、并且"看起来 MPU 不会检查除 LDR/STR 以外的指令对该区域的访问、例如在 Cortex-M 异常进入期间读取向量地址。"   因此、如果 Cortex-R 的行为相似、则可以在向量位置禁用读取访问。  在我的测试中、这对于非 SafeTI 构建确实可以正常工作(不过、我还没有详尽地进行测试)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Phitastic,

    您能否进一步说明一下。 我不明白。

    ——
    谢谢、此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据我所链接的文章、使用`PRIV_NA_USER_NA`锁定矢量表应该可以很好地工作、因为 MPU 仅防止 该区域中的 LDR/STR、但中断操作使用不同的指令。 非 SafeTI 版本确实是如此。  当我将 SafeTI 库与其一系列启动测试结合使用时、其中一些测试会导致中止、而这很难确定。 我假设一些测试(ECC?)会产生一些副作用、 这实际上会导致从该0x00 - 0x20区域读取。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我假设一些测试(ECC?)有一些副作用 可导致从0x00 - 0x20区域读取[/QUOT]

    您是对的、这可能会发生。

    我无法确定确切的测试、但某些测试可能具有矢量相关性。 SafeTI 诊断库是一个巨大的库、花了大量时间准确找出哪些测试具有这种依赖性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 。  鉴于难以在 SafeTI 库中确定矢量依赖性、我将把该问题标记为"暂时关闭"。