内核开发中使用的堆栈大小

Nic*_*ynt 9 size stack operating-system kernel osdev

我正在开发一个操作系统而不是编程内核,我正在设计内核.该操作系统面向x86架构,我的目标是现代计算机.估计所需的RAM数量为256Mb或更多.

使每个线程的堆栈在系统上运行的好大小是多少?我是否应该尝试以这样的方式设计系统:如果达到最大长度,堆栈可以自动扩展?

我想如果我没记错,RAM中的页面是4k或4096字节,这对我来说似乎不是很多.我绝对可以看到时间,特别是在使用大量递归时,我希望一次在RAM中有超过1000个积分.现在,真正的解决方案是让程序通过使用malloc和管理自己的内存资源来实现这一点,但实际上我想知道用户对此的意见.

4k足够大,可以用于现代计算机程序的堆栈吗?堆栈应该大于那个吗?堆栈是否应自动扩展以适应任何类型的大小?从实际开发人员的角度和安全角度来看,我对此感兴趣.

堆栈是4k太大了吗?考虑到正常的程序执行,特别是从C++中的类的角度来看,我注意到良好的源代码倾向于malloc/new创建类时所需的数据,以最小化函数调用中抛出的数据.

我甚至没有得到的是处理器缓存的大小.理想情况下,我认为堆栈将驻留在缓存中以加快速度,我不确定是否需要实现此目的,或者处理器是否可以为我处理它.我只是计划使用常规无聊的旧RAM进行测试.我无法决定.有什么选择?

bog*_*bog 10

堆栈大小取决于您的线程正在做什么.我的建议:

  • 在创建线程时使堆栈大小成为一个参数(不同的线程会做不同的事情,因此需要不同的堆栈大小)
  • 为那些不想打扰指定堆栈大小的人提供了一个合理的默认值(4K会吸引我的控制狂,因为它会导致堆栈挥手,呃,很快得到信号)
  • 考虑如何检测和处理堆栈溢出.检测可能很棘手.您可以将防护页面 - 空 - 放在堆栈的末尾,这通常会起作用.但是你依靠坏线程的行为不要跳过那条护城河并开始污染什么.一般来说,这不会发生......但是,这就是让真正艰难的虫子变得艰难的原因.密封机制涉及黑客攻击编译器以生成堆栈检查代码.至于处理堆栈溢出,你需要一个专门的堆栈,其他地方的违规线程(或其守护天使,无论你决定谁 - 毕竟你是操作系统设计师)将运行.
  • 我强烈建议用一个独特的模式标记堆栈的末端,这样当你的线程越过末端(并且它们总是这样做)时,你至少可以进行验尸并看到实际上已经运行了它的东西堆.一页0xDEADBEEF或类似的东西很方便.

顺便说一句,x86页面大小通常是4k,但它们不一定是.你可以使用64k或更大的尺寸.较大页面的通常原因是避免TLB未命中.我再次将其作为内核配置或运行时参数.