linux内核如何强制堆栈大小限制?

Posted

技术标签:

【中文标题】linux内核如何强制堆栈大小限制?【英文标题】:how does the linux kernel enforce stack size limits? 【发布时间】:2016-06-01 06:47:42 【问题描述】:

我知道堆栈大小可以通过限制工具来控制,但是内核如何强制执行其中一些限制,例如 RLIMIT_STACK?由于linux不涉及栈操作(只是一个mov或push指令),那么超过限制时内核如何发出SIGSEGV?我知道对于虚拟寻址,CPU 提供了 linux 内核可以使用的工具。这是否类似于强制执行堆栈大小限制的方式?或者 linux 是否会在“犯罪发生后”对堆栈大小进行例行检查并发出段错误?还是有第三种选择?

【问题讨论】:

【参考方案1】:

由于虚拟内存,内核可以控制这一点。虚拟内存(也称为内存映射)基本上是虚拟内存区域(基数+大小)和内核可以操作的目标物理内存区域的列表,每个程序都是唯一的。当程序尝试访问不在此列表中的地址时,会发生异常。此异常将导致上下文切换到内核模式。内核可以查找故障。如果内存要变得有效,它将在程序继续运行之前就位(例如,swap 和 mmap 尚未从磁盘读取)或者可以生成 SEGFAULT。

为了决定堆栈大小限制,内核简单地操作虚拟内存映射。

【讨论】:

谢谢,这是有道理的。相关,这是否意味着内核会在异常时映射内存的前 8mb(或堆栈大小限制)中的任何内容,而必须通过 SYS_BRK 请求以下区域? brk/sbrk 可以用于我的 libc 来增加堆空间。手册页指定这通常在数据区域之后。堆栈内存理论上可以放置在任何内存位置,许多内核和操作系统正是这样做的,这使得利用其中存在安全错误的软件变得更加困难。

以上是关于linux内核如何强制堆栈大小限制?的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核——用户堆栈和内核堆栈

Linux内核分析 02

Linux内核分析作业第二周

Linux内核分析(第二周)

Linux内核分析之操作系统是如何工作的

Linux内核分析——第二周学习笔记