为什么堆栈必须是页面alignment的?

在Linux中,我试过(只是为了好玩)在process.c中修改内核源代码。创build一个具有更多熵的堆栈地址,即:

sp -= get_random_int() % 8192; 

当我改变太多,内核停止或我得到一些看似不明确的行为。 我猜这会导致PAGE_ALIGN()以某种方式失败? 我并不关心为什么PAGE_ALIGN()特别是失败,或者说内核中的哪一段代码失败了(尽pipe这也是很好的事情)。 我更感兴趣的是为什么堆栈必须驻留在特定的区域。 这背后的build筑理由和动机是什么? 这与GDT / LDT如何在保护模式下工作有关系吗?

只是为了弄清楚我在问什么:

为什么堆栈的forms必须是0xbfXXXXXX(在32位上)? 为什么堆栈不能是例如0xaaXXXXXX或其他值?

do_page_fault()有一个限制,可以在它认为访问不正确之前在多大的范围内访问vma,也许你正在碰撞?