2012-08-14 56 views
4

在Linux中,我已经试过(只是为了好玩)修改process.c内核源代码创建一个具有更多的熵,即在特定的行栈地址:为什么堆栈必须进行页面对齐?

sp -= get_random_int() % 8192; 

当我改变这个太内核停顿了很多,或者我看到一些看似未定义的行为。我猜这会导致PAGE_ALIGN()以某种方式失败?我并不关心为什么PAGE_ALIGN()特别失败,或者说内核中哪些代码失败(尽管知道这一点很好)。我更感兴趣的是为什么堆栈必须驻留在特定区域。这背后的架构原因和动机是什么?这与GDT/LDT如何在保护模式下工作有关吗?

只是为了清楚我要问:

为什么堆栈必须有形式0xbfXXXXXX(32位)?为什么堆栈不能被0xaaXXXXXX或其他值?

回答

4

do_page_fault()有一个限制,你可以在它认为它是一个糟糕的访问之前有多远,可能是你碰到了吗?

+0

在x86上,8K是* kernel *堆栈的默认大小。代码OP提及影响*用户*堆栈,其大小不固定。 – 2012-10-07 19:08:57