Linux堆栈的动态扩展

2024-02-19

我注意到 Linux 堆栈开始时很小,然后由于递归/推送/vlas 达到大小而导致页面错误而扩展getrlimit(RLIMIT_STACK,...)、给予或接受(在我的系统上默认为 8MiB)。

但奇怪的是,如果我通过直接寻址字节来导致页面错误,在限制范围内,Linux 将定期出现段错误而不扩展页面映射(不过,如果我在分配后执行此操作,则会导致堆栈扩展,则不会出现段错误)。

示例程序:

#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#define CMD "grep stack /proc/XXXXXXXXXXXXXXXX/maps"
#define CMDP "grep stack /proc/%ld/maps"
void vla(size_t Sz)
{
    char b[Sz];
    b[0]='y';
    b[1]='\0';
    puts(b);
}
#define OFFSET (sizeof(char)<<12)
int main(int C, char **V)
{
    char cmd[sizeof CMD]; sprintf(cmd,CMDP,(long)getpid());
    if(system(cmd)) return 1;
    for(int i=0; ; i++){
        printf("%d\n", i);
        char *ptr = (char*)(((uintptr_t)&ptr)-i*OFFSET);
        if(C>1) vla(i*OFFSET); //pass an argument to the executable to turn this on
        ptr[0] = 'x';
        ptr[1] = '\0';
        if(system(cmd)) return 1;
        puts(ptr);
    }
}

哪些内核代码正在执行此操作?它如何区分自然堆栈增长和我在地址空间中探索?


Linux内核以堆栈指针的内容为限制(在合理的范围内)。访问堆栈below堆栈指针负 65536 和 32 个无符号长整型的大小导致分段违规。因此,如果您访问堆栈中的内存,则必须确保堆栈指针以某种方式随着访问而减小,以使 Linux 内核扩大该段。请参阅此片段/arch/x86/mm/fault.c:

if (sw_error_code & X86_PF_USER) {
    /*
     * Accessing the stack below %sp is always a bug.
     * The large cushion allows instructions like enter
     * and pusha to work. ("enter $65535, $31" pushes
     * 32 pointers and then decrements %sp by 65535.)
     */
    if (unlikely(address + 65536 + 32 * sizeof(unsigned long) < regs->sp)) {
        bad_area(regs, sw_error_code, address);
        return;
    }
}

堆栈指针寄存器的值是这里的关键!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux堆栈的动态扩展 的相关文章

  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 用户控件内所有控件均为空

    我有一个 UserControl 它使用 UserControl 以及其他控件 In the ascx文件我有以下代码
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • 如何缩短 Git Bash 提示符 (Windows)

    如何缩短我的 git bash 提示符 Malik LAPTOP 7R9912OI MINGW64 Desktop test 像这样的事情 Malik test 我在 Windows 上使用 git bash git 版本为 2 21 0
  • java中从arraylist中删除具有多个索引的多个元素

    我有两个List2 我将项目存储在一个列表中 在第二个列表中我存储 int 数字 我将其视为索引 我想从包含所有索引的项目列表中删除项目 ArrayList
  • R中多个变量的线图

    我有以下格式的输入数据 x y z 0 2 2 4 5 5 3 8 6 8 10 4 6 9 3 15 7 6 10 5 我如何在R中像Excel 如下所示 一样绘制xy散点图 至少有四种方法可以做到这一点 1 此处使用名为 df 的 水平
  • 获取没有函数参数的二叉树的高度

    import java util Scanner public class BinaryTree private int info private BinaryTree left private BinaryTree right priva
  • 在 dplyr 中使用字符串作为过滤器?

    有没有办法在 dplyr 中使用字符串变量作为过滤器参数 例如 filter iris Sepal Length gt 6 将被替换为 string lt Sepal Length gt 6 filter iris string 基本上 我
  • 管理中的 AbstractController::DoubleRenderError

    我正在从事疯狂商务工作 我正在尝试调整 active sale controller 中的几个操作 我有一些条件 如果条件失败 我将重定向到 返回 否则我将继续下一步 我现在面临的问题是我在同一个操作中使用了两次redirected to
  • 无法安装 Visual Studio 2013 更新 5 (RTM); Apache Cordova 工具

    我正在尝试安装 VS2013 更新 5 但它不会安装 因为它被阻止 我必须 通过控制面板卸载旧版本的 Visual Studio Tools for Apache Cordova 多设备混合应用程序 我已经按照要求卸载了它 尽管与 VS20
  • Node js Express 中的环境变量(.env)

    是否可以为所有不同的部署环境 例如开发 生产等 提供一个 env 文件 根据环境 需要加载相应的环境变量文件 是的 您可以使用dotenv https github com motdotla dotenv module例如 env DB H
  • 在没有 JavaScript 的情况下将 HTML 元素与父元素的中间对齐

    我想在元素中间放置一个 水平对齐很容易 当然垂直对齐也可以用JS来完成 但我确信用CSS有更好的方法 有什么窍门呢 附 我需要这个用于具有 HTML5 元素的应用程序 因此我不介意该解决方案是否仅适用于支持画布的浏览器和 IE 7 8 使用
  • 使用 Typescript 时如何更新 Next-auth 中会话回调中的会话类型

    我正在使用打字稿 我的 next auth tsx 文件如下所示 import NextAuth Awaitable Session User from next auth import GithubProvider from next a
  • 如何使用try catch语句抛出错误?

    Utility const readUserUtility id a gt const currentstore store getState const returnedArray currentstore users filter us
  • 使用多个跟踪侦听器

    我有 2 个 WCF 服务 它们是从单个 Windows 主机托管的 我使用跟踪侦听器将数据记录到应用程序日志中 我已将以下代码添加到配置文件中
  • 插入符号训练的公式和非公式结果不同

    我注意到在训练时使用插入符中的公式和非公式方法会产生不同的结果 此外 公式方法所需的时间几乎是非公式方法所需时间的 10 倍 这是预期的吗 gt z lt data table c1 sample 1 1000 1000 replace T
  • 在 TeamCity 中全局禁用 FxCop 错误

    好的 今天还有一个 FxCop 问题 我已经阅读了有关 IdentifiersShouldBeCasedCorrectly 规则的争论 以及它是否应该是 XML 或 Xml 嗯 我是一个 XML 人 并且我想保持这种状态 因此 我做not希
  • 使用集束搜索实现 seq2seq

    我现在正在实施seq2seq基于示例代码的模型tensorflow提供 我想得到一个top 5解码器进行强化学习的输出 然而 他们用注意力解码器实现了翻译模型 所以我应该实现波束搜索来获取top k结果 现在有一部分代码已实现 该代码被添加
  • 无内存屏障的乱序写入:数据争用的唯一可能原因?

    在经历的同时Java 并发实践 作者 Brian Goetz我遇到了以下行 当一个变量被多个线程读取时 就会发生数据竞争 并由至少一个线程写入 但读取和写入不是按发生之前排序 正确同步的程序之一是 没有数据竞争 正确同步的程序表现出顺序 一
  • 这是 Xamarin Forms 中的内存泄漏吗?

    我遇到了一个问题 页面对象一旦被导航离开 就不会被垃圾收集 我整理了一个非常基本的示例 演示了使用 NavigationPage 和 PushAsync 方法时出现的问题 该页面使用弱引用列表显示 活动 页面的数量 public class
  • tar:错误不可恢复:现在退出

    当我解开教义时 rw r r 1 root root 660252 2010 10 16 23 06 Doctrine 1 2 0 tgz 我总是收到此错误消息 root X100e usr local lib Doctrine stabl
  • 何时在带有react-dom的jest单元测试中使用act()

    根据反应单元测试文档 act 要为断言准备组件 请包装代码渲染 它并在 act 调用中执行更新 这使得你的测试 运行起来更接近 React 在浏览器中的工作方式 但测试在这两种情况下都运行得很好 没有 act it Should retur
  • Linux堆栈的动态扩展

    我注意到 Linux 堆栈开始时很小 然后由于递归 推送 vlas 达到大小而导致页面错误而扩展getrlimit RLIMIT STACK 给予或接受 在我的系统上默认为 8MiB 但奇怪的是 如果我通过直接寻址字节来导致页面错误 在限制