【问题标题】:Can adjacent thread stacks corrupt each other?相邻的线程堆栈会相互破坏吗?
【发布时间】:2017-04-27 14:49:56
【问题描述】:

观察是- 2 个线程 a 和 b 一个接一个地创建。线程 b 所需的堆栈大小是分配的堆栈大小的三倍。 线程 b 的执行使用/破坏了分配给线程 a 的堆栈。现在当线程 a 执行时,操作系统给出堆栈溢出错误。

注意:新函数被添加到线程 b。没有新函数在线程 a 的上下文中执行。

使用的 RTOS 是 embOS。

这种情况可能吗?或者在这种情况下对观察结果的解释可能是错误的?我怎样才能知道?

【问题讨论】:

  • 使用比您分配的堆栈多三倍的堆栈基本上可以在 any 场景中结束,因为这将触发完全未定义的行为。其中之一可能是您描述的那个。其他 99.999999% 是简单的崩溃、重新启动,无论迟早。我觉得你的情况不太可能,但有可能。
  • “IT”如何检测(并报告)stackoverflow?还有,这是什么”?你编译过堆栈溢出保护吗?
  • @old_timer,问题已更新
  • @tofro:我不知道,给定的场景对我来说听起来并不那么难以置信。线程 B 大量过度分配并丢弃到下一个线程的连续分配的堆栈区域。在随后的上下文切换回线程 A 时,操作系统会注意到一个废弃的堆栈金丝雀并退出,直到那时,除非通过直接从线程 A 传递的堆栈分配缓冲区执行 IPC,否则不会发生太多崩溃。
  • @doynax 使用 3 倍于分配的堆栈可能会比其他任务的堆栈覆盖更多,假设它以相似的大小分配 - 这就是我想说的。跨度>

标签: embedded rtos


【解决方案1】:

这个场景很有可能,在某种程度上取决于你的记忆布局;但几乎可以肯定会发生一些不好的事情。 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 字节的堆栈空间。在你的筹码上保留一些储备几乎总是一个好主意。

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 2011-06-01
    • 2015-04-16
    • 2011-11-01
    • 1970-01-01
    • 2011-12-30
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多