我知道堆栈大小可通过限制工具控制,但内核如何强制执行某些限制,例如RLIMIT_STACK?由于linux不参与堆栈操作(它只是一个mov或push指令),当你超出限制时内核如何发出SIGSEGV?据我所知,对于虚拟寻址,CPU提供了linux内核可以使用的工具。这类似于如何强制执行堆栈大小限制?或者linux是否在犯罪发生后对堆栈大小进行例行检查并发出段错误&#39 ;?或者有第三种选择吗?
答案 0 :(得分:3)
由于虚拟内存,内核可以控制它。虚拟内存(也称为内存映射)基本上是虚拟内存区域(基本+大小)的列表,以及内核可以操作的目标物理内存区域,每个程序都是唯一的。当程序试图访问不在此列表中的地址时,会发生异常。此异常将导致上下文切换到内核模式。内核可以查找错误。如果内存有效,它将在程序可以继续之前放置(例如,交换并且mmap不能从磁盘读取)或者可以生成SEGFAULT。
为了确定堆栈大小限制,内核只是简单地操作虚拟内存映射。