相邻的线程堆栈会相互破坏吗?
Can adjacent thread stacks corrupt each other?
观察是-
2个线程a和b一个接一个创建。线程 b 所需的堆栈大小是分配的堆栈大小的三倍。
线程b的执行uses/corrupts分配给线程a的栈。现在当线程 a 执行时,OS 给出堆栈溢出错误。
注:线程b新增功能。没有新函数在线程 a 的上下文中执行。
RTOS使用的是embOS。
这种情况可能吗?或者在这种情况下对观察结果的解释可能是错误的?我怎样才能知道?
这种情况很有可能,有点取决于你的内存布局;但几乎可以肯定会发生一些不好的事情。 embOS 通常没有内存保护,因为它运行的大多数系统都没有 MMU 来保护你的内存。
在大多数体系结构上,堆栈向下增长,即从较高的内存地址到较低的内存地址。如果您像下面这样创建堆栈(使用 embOS 时通常这样做):
static char stack_a[512];
static char stack_b[512];
并且线程 b 使用 1536 字节的堆栈内存,它将使用 stack_b 作为其前 512 字节,stack_a 作为接下来的 512 字节和我们在这里看不到的 512 字节.所以不好的事情会发生...
embOS 检测到您的堆栈损坏的原因是(使用我知道的配置),它将一些特殊签名放在堆栈的较低字节,并在某些情况下检查此签名是否仍然完好无损。这虽然暗示,当您想在线程中使用 512 字节的堆栈内存时,您需要超过 512 字节的堆栈 space。在筹码上保留一些储备几乎总是一个好主意。
观察是- 2个线程a和b一个接一个创建。线程 b 所需的堆栈大小是分配的堆栈大小的三倍。 线程b的执行uses/corrupts分配给线程a的栈。现在当线程 a 执行时,OS 给出堆栈溢出错误。
注:线程b新增功能。没有新函数在线程 a 的上下文中执行。
RTOS使用的是embOS。
这种情况可能吗?或者在这种情况下对观察结果的解释可能是错误的?我怎样才能知道?
这种情况很有可能,有点取决于你的内存布局;但几乎可以肯定会发生一些不好的事情。 embOS 通常没有内存保护,因为它运行的大多数系统都没有 MMU 来保护你的内存。
在大多数体系结构上,堆栈向下增长,即从较高的内存地址到较低的内存地址。如果您像下面这样创建堆栈(使用 embOS 时通常这样做):
static char stack_a[512];
static char stack_b[512];
并且线程 b 使用 1536 字节的堆栈内存,它将使用 stack_b 作为其前 512 字节,stack_a 作为接下来的 512 字节和我们在这里看不到的 512 字节.所以不好的事情会发生...
embOS 检测到您的堆栈损坏的原因是(使用我知道的配置),它将一些特殊签名放在堆栈的较低字节,并在某些情况下检查此签名是否仍然完好无损。这虽然暗示,当您想在线程中使用 512 字节的堆栈内存时,您需要超过 512 字节的堆栈 space。在筹码上保留一些储备几乎总是一个好主意。