如果我理解正确的话,一个 dylib 实例在加载时存储在一个内存段中,然后它就成为共享的并且没有复制多个进程之间需要它的虚拟内存。但它如何知道谁在执行时调用呢?
例如,我询问某个库的类构造函数,该构造函数取决于我的进程名称(无需直接传递名称,因为我实际上可以传递任何名称),它如何知道它所附加的多个进程到底调用了什么?
(忽略了这样一个事实,在这个例子中,元信息不是秘密,可以通过简单的系统调用来检索)/库的代码甚至不能依赖于理论上可以依赖的每个进程内存的信息,就像相同的内存共享一样方案肯定不能向后应用(一个库<-同时有多个进程)-这将是一个很大的安全漏洞。
当库需要在其类中存储一些特定于进程的信息作为静态属性,以便在某些特定进程和/但不是每个进程中共享时,情况甚至会变得更加复杂英语它所附着的。我假设,事实上,数据将以类将其视为自己的常规字段的格式写入进程内存中,但我们再次回到了库代码级别的进程识别问题。
答案1
一般来说,指向栈(返回地址的来源)、堆(数据存储)的指针以及一些变量值或地址都是在CPU寄存器中传递的。所有这些地址都在调用者的虚拟内存中。动态库代码在调用者的上下文中运行,因此所有系统调用的行为就像调用者已经完成了它们一样。
我在我的虚拟空间中用指向我的东西的指针来调用共享库,而你在你的虚拟空间中用指向你的东西的指针来调用共享库。