在 Linux 中,我尝试(只是为了好玩)修改 process.c 中的内核源代码,创建一个具有更多熵的堆栈地址,即特别是以下行:
sp -= get_random_int() % 8192;
当我改变太多时,内核会停止,或者我会得到一些看似未定义的行为。我猜这会导致 PAGE_ALIGN() 以某种方式失败?我对 PAGE_ALIGN() 为何特别失败,或者内核中究竟是哪一段代码失败(尽管也很高兴知道)不感兴趣;我对堆栈为什么必须驻留在特定区域更感兴趣。这背后的架构原因和动机是什么?这是否与 GDT/LDT 在保护模式下的工作方式有关?
只是为了弄清楚我在问什么:
为什么堆栈必须具有 0xbfXXXXXX 形式(在 32 位上)?为什么堆栈不能是例如 0xaaXXXXXX 或任何其他值?