- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于内存监控库的实现,我想将被监控程序的堆栈移动,并保留上半部分虚拟内存供监控库使用,遵循“half'n'half”- TaintTrace 等工具使用的模型描述, LIFT和 Hobbes 。然而,我似乎不清楚如何实际做到这一点。仅映射所需的内存会失败(无法分配内存)。需要修改crt吗?链接器?
最佳答案
我不太确定如何在类 Unix 操作系统中分配受污染和未受污染的内存并进行优化。
Unix系统中的内存分配是使用brk()和sbrk()完成的。除此之外,仅此而已。对于其他内存空间,您需要使用共享内存分配(您可以让它们仅由您的进程读取/写入,以便它仅在您之间“共享”。)
您将遇到的问题是不断增长的内存分配。我不太确定,但根据我使用共享内存的内存,您无法轻松扩展分配的缓冲区。但较新的界面可能适合您。
---更新:
阅读 malloc() 文档,我发现了以下内容:
Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3). Allocations performed using mmap(2) are unaffected by the RLIMIT_DATA resource limit (see getrlimit(2)).
这意味着操作系统默认已经使用 mmap() 来分配大于 128Kb 的缓冲区。此外,标准 malloc() 受到此处记录的 RLIMIT_DATA 的 getrlimit() 的限制:
The maximum size of the process's data segment (initialized data, uninitialized data, and heap). This limit affects calls to brk(2) and sbrk(2), which fail with the error ENOMEM upon encountering the soft limit of this resource.
但是,正如 malloc() 所说,如果您分配大缓冲区 (128Kb+),那么您就不会受到该限制的影响。
话虽如此,大量内存分配给内核本身、程序、映射到地址的 I/O (DMA)、中断表、内存表(MMU 管理)和共享内存缓冲区(即使用 SHARED 的 mmap() 将分配所有进程都必须有权访问的内存地址,即使您尚未使用这些地址,它们也会被保留,以防您要访问它们。)
其中一个使用共享内存的东西就是共享库。 (二进制文件被加载到共享内存中,因此针对所述共享库运行的所有进程都加载一次。)
关于c - Linux 中移动堆栈并保留一半可寻址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23494768/
我是一名优秀的程序员,十分优秀!