为啥堆栈必须是页面对齐的?

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 堆栈。

以上是关于为啥堆栈必须是页面对齐的?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 玄学:为啥页面垂直对齐如此困难?

内存对齐与页面对齐

Perl 中的 OS 页面对齐分配

为啥页面宽度大于屏幕宽度? [关闭]

在堆栈视图中创建UILabel互相拥抱

如何将图像彼此对齐,以使它们沿页面宽度均匀分布? [关闭]