观察是 - 一个接一个地创建2个线程a和b。线程b所需的堆栈大小是分配的堆栈大小的三倍。 执行线程b使用/破坏分配给线程a的堆栈。现在,当线程执行时,OS会出现堆栈溢出错误。
注意:新功能被添加到线程b。没有新函数在线程a的上下文中执行。
使用的RTOS是embOS。
这种情况可能吗?或者在这种情况下对观察结果的解释可能是错误的?我该怎么知道?
答案 0 :(得分:0)
这种情况非常可能,在某种程度上取决于你的记忆布局;但几乎肯定会发生一些不好的事情。 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字节的堆栈空间。在你的筹码上有一些保留几乎总是一个好主意。