在 Linux 中,我尝试(只是为了好玩)修改 process.c 中的内核源代码,创建一个具有更多熵的堆栈地址,即特别是行:
sp -= get_random_int() % 8192;
当我对此进行过多更改时,内核会停止运行,或者我会出现一些看似未定义的行为。我猜这会导致 PAGE_ALIGN() 以某种方式失败?我对为什么 PAGE_ALIGN() 特别失败,或者内核中究竟是哪一段代码失败了(尽管知道这些也很高兴);我更感兴趣的是为什么堆栈必须驻留在特定区域中。这背后的架构原因和动机是什么?这与 GDT/LDT 在保护模式下的工作方式有关系吗?
只是为了弄清楚我在问什么:
为什么堆栈的形式必须是 0xbfXXXXXX(在 32 位上)?为什么堆栈不能是例如0xaaXXXXXX,或任何其他值?
最佳答案
在 do_page_fault()
中有一个限制,即在 vma 认为它是一个错误的访问之前你可以超出堆栈多远,也许你正在点击它?
关于linux - 为什么堆栈必须页面对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11958092/