4

在 Linux 中,我尝试(只是为了好玩)修改 process.c 中的内核源代码,创建一个具有更多熵的堆栈地址,即特别是以下行:

sp -= get_random_int() % 8192;

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

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

为什么堆栈必须具有 0xbfXXXXXX 形式(在 32 位上)?为什么堆栈不能是例如 0xaaXXXXXX 或任何其他值?

4

1 回答 1

4

do_page_fault()在它认为这是一个错误的访问之前,你可以在堆栈 vma 之外有多远是有限制的,也许你正在打那个?

于 2012-08-15T07:13:53.117 回答