【问题标题】:Flush ELF section from RAM after library initialization库初始化后从 RAM 中刷新 ELF 部分
【发布时间】:2011-02-24 20:25:44
【问题描述】:

我在 ELF 共享库中有很多代码,这些代码仅在库初始化期间使用(它从静态初始化程序中调用)。如果我把这段代码放在它自己的部分(或者它可以放在 .init 部分),我可以使用__attribute__((section(".mysection"))) 来做,有没有办法在库加载后强制这个部分被分页?

This question 是相关的,但结论是内核在内存不足时会分页出未使用的页面,因此无需显式这样做。但是,我在嵌入式环境中工作,内存非常宝贵,从磁盘(慢速 USB 闪存驱动器)中分页代码的成本很高。因此,我宁愿明确地刷新这段代码,我知道它永远不会被再次使用,而不是让内核可能决定刷新一些最终可能需要重新分页的其他代码。

我确定我记得读过一个系统调用来要求内核对某些内存区域进行分页或分页,尽管我在任何地方都找不到对此的任何引用,所以也许是我想象的。有这种事吗?

【问题讨论】:

  • madvise 系统调用,特别是带有 MADV_WILLNEED/MADV_DONTNEED 参数的,是我的想法。但是,我仍然想知道是否有一种简单的方法可以强制将特定的 ELF 部分换出。

标签: linux memory-management elf


【解决方案1】:

查找有关精灵叠加层的文档。安排您的代码,以便您有一个覆盖用于初始化,另一个用于处理。您可能还想查看关闭覆盖。当调用下一个叠加层时,应替换叠加层中的代码。

【讨论】:

  • 有趣的是,这个页面现在是“elf overlays”的顶级 Google 搜索结果。
  • 我找不到太多关于 ELF 覆盖的信息。我能找到的最好的是sourceware.org/binutils/docs-2.20/ld/Overlay-Description.html,这在脱离上下文时并不是特别有用。您能否详细说明或提供一些相关文档的链接,特别是与使用共享库的覆盖有关?此外,我不确定覆盖是否适合我,因为初始化代码需要访问库中的所有其他代码。
  • 在最坏的情况下,您能否为第一个初始化后代码提供微覆盖?
  • 我在redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gdb/… 发现了精灵支持覆盖的迹象。自从我不得不使用覆盖以来已经有几十年了。它们主要是针对有限的内存空间的解决方案。多个覆盖都映射到相同的地址空间,并且根据需要加载交换代码。新代码将在您不再需要的代码上读取。在您的情况下,您将初始化代码放在一个部分中,该部分将覆盖初始化后运行的代码。你真的需要尽早初始化才能做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2021-10-16
  • 2020-11-23
相关资源
最近更新 更多