2016-06-01 130 views
3

我知道堆栈大小可以通过限制设施进行控制,但内核如何强制执行一些限制,例如RLIMIT_STACK?由于linux不涉及堆栈操作(它只是一个mov或push指令),当超出限制时,内核如何发出SIGSEGV?我明白,对于虚拟寻址,CPU提供了Linux内核可以使用的工具。这与堆栈大小限制如何实施相似吗?或者,linux是否对堆栈大小进行例行检查并在犯罪发生后发出segfaults?还是有第三种选择?linux内核如何强制实现堆栈大小限制?

回答

3

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

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

+0

谢谢,这是有道理的。这是否意味着内存的前8mb(或堆栈大小限制)中的任何内容都将被内核映射为异常,而下面的区域必须通过SYS_BRK请求? –

+0

brk/sbrk可以用我的libc来增加堆空间。手册页指定通常在数据区后面。堆栈内存理论上可以放置在任何内存位置,而许多内核和操作系统正是这样做的,这使得更难以利用其中存在安全错误的软件。 –