gpt4 book ai didi

c - 如何从库中获取地址信息以在所有进程之间共享?

转载 作者:IT王子 更新时间:2023-10-29 00:57:35 24 4
gpt4 key购买 nike

Understanding the Linux Kernel, 3rd edition 中,它说:

Shared libraries are especially convenient on systems that provide file memory mapping, because they reduce the amount of main memory requested for executing a program. When the dynamic linker must link a shared library to a process, it does not copy the object code, but performs only a memory mapping of the relevant portion of the library file into the process’s address space. This allows the page frames containing the machine code of the library to be shared among all processes that are using the same code. Clearly, sharing is not possible if the program has been linked statically. (page 817)

我对这个很感兴趣,想用C写一个小程序来验证,给定两个pid作为输入比如两个gedit进程,然后从page frame中获取地址信息进行共享。有谁知道该怎么做?从那本书中,我认为来自两个或多个 gedit 进程的 bss 段和文本段地址是相同的,对吗?

最佳答案

具有相同地址的不是你的 gedit(或其他)的 textbss 部分,而是 libc.so< 的内容 共享库 - 以及两个 gedit 进程使用的所有其他共享库。

正如引用的文字所说,这允许共享库成为一个副本,这通常是共享库的主要好处。

bss 通常不共享 - 因为这是每个进程的数据。在 Linux 中,运行相同可执行文件的两个进程的 text 部分将共享相同的代码。

不幸的是,这一点的证明是查看页面的物理映射(进程 A 中地址 X 的页面在物理地址 Y,进程 B 中地址 X 的页面也在物理地址 Y)内进程,据我所知,如果不在操作系统内核内部摸索,就不容易获得。

关于c - 如何从库中获取地址信息以在所有进程之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34524804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com