Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux内核如何实施堆栈大小限制?_Linux_Stack_Kernel_Limits - Fatal编程技术网

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

linux内核如何实施堆栈大小限制?,linux,stack,kernel,limits,Linux,Stack,Kernel,Limits,我知道堆栈大小是可以通过limits工具控制的,但是内核是如何执行这些限制的,比如RLIMIT_堆栈?由于linux不涉及堆栈操作(它只是一条mov或push指令),当您超出限制时,内核如何发出SIGSEGV?我知道,对于虚拟寻址,CPU提供了linux内核可以使用的工具。这与强制执行堆栈大小限制的方式类似吗?或者linux是否在“犯罪发生后”对堆栈大小执行例行检查并发出SEGFULTS?或者有第三种选择吗?由于虚拟内存,内核可以控制这一点。虚拟内存(也称为内存映射)基本上是一组虚拟内存区域(基

我知道堆栈大小是可以通过limits工具控制的,但是内核是如何执行这些限制的,比如RLIMIT_堆栈?由于linux不涉及堆栈操作(它只是一条mov或push指令),当您超出限制时,内核如何发出SIGSEGV?我知道,对于虚拟寻址,CPU提供了linux内核可以使用的工具。这与强制执行堆栈大小限制的方式类似吗?或者linux是否在“犯罪发生后”对堆栈大小执行例行检查并发出SEGFULTS?或者有第三种选择吗?

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


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

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