为啥堆栈必须是页面对齐的?
Posted
技术标签:
【中文标题】为啥堆栈必须是页面对齐的?【英文标题】:Why does the stack have to be page aligned?为什么堆栈必须是页面对齐的? 【发布时间】:2012-08-11 02:04:37 【问题描述】:在 Linux 中,我尝试(只是为了好玩)在 process.c 中修改内核源代码,创建一个具有更多熵的堆栈地址,即特别是以下行:
sp -= get_random_int() % 8192;
当我改变太多时,内核会停止,或者我会出现一些看似未定义的行为。我猜这会导致 PAGE_ALIGN() 以某种方式失败?我对 PAGE_ALIGN() 为何特别失败,或者内核中究竟是哪一段代码失败(尽管也很高兴知道)不感兴趣;我对堆栈为什么必须驻留在特定区域更感兴趣。这背后的架构原因和动机是什么?这是否与 GDT/LDT 在保护模式下的工作方式有关?
只是为了弄清楚我在问什么:
为什么堆栈必须具有 0xbfXXXXXX 形式(在 32 位上)?为什么堆栈不能是例如0xaaXXXXXX,还是其他任何值?
【问题讨论】:
【参考方案1】:do_page_fault()
中有一个限制,即您可以在堆栈 vma 之外多远才将其视为错误访问,也许您正在达到这个限制?
【讨论】:
在 x86 8K 上是 kernel 堆栈的默认大小。 OP 提到的代码会影响大小不固定的 user 堆栈。以上是关于为啥堆栈必须是页面对齐的?的主要内容,如果未能解决你的问题,请参考以下文章