linux - 为什么堆栈必须页面对齐?

标签 linux stack kernel aslr

在 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/

相关文章:

在 R 中 reshape 数据

linux - swi SYS_ERROR0 在 arm linux 内核中做什么?

linux - Shell 脚本使用 Trap 获取 CTRL+Z

c++ - OpenCV c++ Mat MADNESS

c++ - C++ 内存不足 : write to file instead, 在需要时读取数据?

linux - 将 expect_out 的特定部分保存在变量中

c++ - 使用 2 个队列实现堆栈

C++ 堆栈数据结构。这段代码有什么问题?

c - 互斥体 |自旋锁 | ???在龙记

linux - 通过/dev/mtd 更新内核