Linux 中的堆栈内存管理

2024-02-01

我有几个与 Linux 堆栈大小限制相关的问题。我对 x86_64 系统最感兴趣,但如果存在平台差异,我也想了解它们。我的问题是:

1)Linux如何动态增加堆栈的大小?

我编写了一个带有递归函数(以使用堆栈空间)的测试程序,我可以在其中指定迭代次数作为命令行参数。程序在完成递归后暂停等待用户输入,这使我能够获取有关正在运行的进程的信息。如果我运行少量迭代然后使用pmap查看堆栈大小为132K。

00007fff0aa3c000    132K rw---   [ stack ]

然而,如果我运行更多的迭代,大小可能会变得更大,我相信默认情况下可达 8192 KB。例如,这是运行更多迭代的输出。

00007fff3ed75000   8040K rw---   [ stack ]

但如果我使用strace为了在运行应用程序时跟踪系统调用,我没有看到任何与增长堆栈相关的内容。所以我想知道内核正在做什么来管理进程的堆栈空间。

2)Linux在设置时是否以任何方式保护堆栈区域ulimit -s unlimited?

如果我使用命令ulimit -s unlimited然后我就可以运行更多的递归函数迭代,并且堆栈会变得更大。例如,这是 pmap 的输出

00007ffda43a3000 8031260K rw---   [ stack ]

因为我不想导致我的机器崩溃/挂起/锁定,所以我还没有测试无限递归。但我想知道我是否做了任何事情会导致内核检测到堆栈溢出。或者 ulimit 是唯一的保护,关闭它可以让堆栈无限增长?

3)如何处理堆栈保护页?

这与我尝试过的任何事情都没有直接关系,但我也想知道 Linux 如何管理堆栈保护页面并允许堆栈动态增长。


  1. 对于每个正在运行的进程,Linux 都会保存一个虚拟内存地址区域的列表。如果地址引用生成页面错误,Linux 会检查该列表以查看虚拟地址是否合法(在其中一个区域的范围内)。如果某个区域没有声明,应用程序会收到 SIGSEGV 错误,否则内核会分配另一页系统内存并添加到转换缓存中。如果错误地址恰好错过了一个区域,并且该区域用于堆栈(根据机器架构向上或向下增长),那么Linux会分配另一个VM页面,将其映射到该区域,从而增加堆栈。
  2. 内核不保护堆栈。如果堆栈访问由于物理 VM 页面未附加到进程的内存区域而导致页面错误,则会测试进程的 rlimit 以查看是否允许添加另一个页面。
  3. 一些 malloc(3) 调试器库正在使用堆栈保护页。这些的目的是将每个内存请求扩展 2 个 VM 页:新页之前一页,新页之后一页。额外的页面被标记为根本无法访问,因此如果应用程序离开区域的末尾或在开始之前移动,则应用程序会遇到访问冲突。

上面的内容已经过于简单化了,但仍然应该给出要点。

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

Linux 中的堆栈内存管理 的相关文章

  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • Pyaudio 安装错误 - “命令‘gcc’失败,退出状态 1”

    我正在运行 Ubuntu 11 04 Python 2 7 1 并想安装 Pyaudio 于是我跑了 sudo easy install pyaudio 在终端中 进程退出并显示以下错误消息 Searching for pyaudio Re
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使

随机推荐

  • 如何捕获 Javascript 中的 404 错误?

    我有一个 HTML 音频元素 并且我将该元素的 src 属性动态设置为存储在局域网上的音频文件 它是这样工作的 function setSource source audio src source var audio new Audio v
  • 如何在 C 中使用 printf() 和 scanf() 而不进入下一行?

    我想在一行中获取出生日期 include
  • 删除重复的尾部斜杠

    我想检测php如果一个字符串像 string包括重复的尾部斜杠 例如 string http somepage com something some html to string http somepage com something so
  • 在 iOS 上使用 Cordova 1.6 设置外部起始页

    是否可以加载外部index html 包含cordova js 而不是本地index html 我在 appdelegate m 中找到了这段代码 self viewController wwwFolderName www self vie
  • 如何在 NodeJs 中安排 Google 会议并获取会议链接?

    在我的项目中 我必须在给定时间在两个用户之间安排一次谷歌会议 我在 NodeJS 中拥有其电子邮件 ID 有人能帮我解决这个问题吗 您将需要使用谷歌日历API https developers google com calendar api
  • 使用 BlueSnap 托管支付字段轻松开始;

    您好 我正在寻找一个可以复制并粘贴到我的网站中的简单脚本 以便我可以开始使用 BlueSnap 的 HPF 字段进行销售 该表单应包括取回代币并向购物者收费所需的最基本元素 我不是在寻找任何设计 只是在寻找功能 我有基础知识 但我需要看看如
  • xml解析-代码重构问题

    我有以下 xml
  • 使用 rxjs 处理刷新令牌

    自从我开始使用 angular2 以来 我已经设置了我的服务来返回 T 的 Observable 在服务中 我将进行 map 调用 并且使用这些服务的组件将仅使用 subscribe 来等待响应 对于这些简单的场景 我真的不需要深入研究 r
  • 从 JavaScript 加载图像

    在我的 Grails 应用程序中 我有一个目录web app images carousel slides包含以下文件 foo png foo thumbnail png bar png bar thumbnail png 我的应用程序正在
  • 如何以惯用的方式计算有多少元素满足条件?

    有了这些数据 gt data 1 1290603356 1290603360 1290603350 1290603344 1290603340 1290603373 7 1290603354 1290603359 1290603345 12
  • QGLWidget 在 Mac OS X Lion 下无法正常工作

    正如你所看到的 我不知道为什么它根本不起作用 When the program run it will look like this 我正在使用 macports 的 qt4 mac v4 8 2 看来该包是预编译的 这是来源 主要 cpp
  • 控制器中的 GGTS 重复方法名称/签名错误

    我正在使用基于 eclipse 4 3 1 64 位版本的最新 GGTS v3 4 在 Grails 2 3 2 上开发应用程序 我的类路径中的每个控制器都有一个错误 每个控制器类都有两个相同的错误 Groovy 类 package Som
  • django 模板中的逗号分隔列表

    If fruits是列表 apples oranges pears 有没有一种使用 django 模板标签快速生成 苹果 橙子和梨 的方法 I know it s not difficult to do this using a loop
  • 如何处理函数数组中的重复函数调用?

    我正在尝试按顺序执行以下函数 同步 异步 数组 避免callbackHell 实现函数runCallbacksInSequence 我需要实现自己的函数来了解回调的工作原理并避免使用 Async js 这是我到目前为止所拥有的 功能runC
  • 在 pandas 数据框替换功能中使用正则表达式匹配组

    我刚刚学习 python pandas 喜欢它的强大和简洁 在数据清理期间 我想使用正则表达式对数据框中的列进行替换 但我想重新插入匹配的部分 组 简单示例 姓氏 名字 gt 名字 姓氏 我尝试了类似以下的内容 实际情况更复杂 所以请原谅简
  • Hyperledger Fabric 了解 MSP

    我想清楚MSP的用途 所以我的问题是 当用户出于任何原因想要使用某个通道时 本地 MSP 会为其提供一个带有私钥的身份 在文档中说 MSP 有一个密钥库 并且在通道确认用户使用该通道 MSP 后 CA何时参与 None
  • 查询字符串是否有类似 hashchange 的事件?

    我一直在使用哈希值在页面之间传递数据 例如设置scrollTop 等 并且还使用了hashChange触发给定页面上的更改的事件 然而 哈希值具有我不一定感兴趣的默认行为 例如使页面跳转到给定的 有时是无关紧要的 位置 我觉得获取 设置查询
  • 游戏路径寻找

    所有类型的游戏中都使用哪些路径查找算法 无论如何 在角色移动的所有类型中 迪杰斯特拉 Dijkstra 曾经被使用过吗 我并不是真的想编写任何代码 只是做一些研究 不过如果你粘贴伪代码或其他东西 那就没问题了 我可以理解 Java 和 C
  • Spyder互动剧情:等待剧情关闭继续

    我使用 Spyder 在 Windows 上工作 使用 matplotlib 进行绘图 我的问题是我想要进行交互式绘图 或者有时绘制很多东西 并且我希望spyder等待我关闭图形以继续代码 与传统终端相同的方式 我试过 plt ion mp
  • Linux 中的堆栈内存管理

    我有几个与 Linux 堆栈大小限制相关的问题 我对 x86 64 系统最感兴趣 但如果存在平台差异 我也想了解它们 我的问题是 1 Linux如何动态增加堆栈的大小 我编写了一个带有递归函数 以使用堆栈空间 的测试程序 我可以在其中指定迭