動態鏈結器如何判斷某個共享庫已經載入進記憶體

時間 2021-05-29 23:39:48

1樓:jiangtao9999

核心自己維護乙個共享庫的表就行了,而且這個表還牽扯到應用的高位記憶體位址的共享庫入口呼叫的問題。不光 so 檔案會有乙個表,最重要的是每個 so 裡面封裝的函式也都有乙個入口位置的。

2樓:ruanyuanyu

處於使用者態的動態鏈結器並不知道某個共享庫是否已經載入進記憶體,真正知道並實現記憶體共享的是Linux核心。

你可以使用strace隨意跟蹤乙個程式的執行過程看看,應該會有以下的類似輸出:

open

("/lib/x86_64-linux-gnu/libc.so.6"

,O_RDONLY

|O_CLOEXEC)=

3read(3

,"\177

ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0

>\0\1\0\0\0\320\37\2\0\0\0\0\0

"...,

832)

=832

fstat(3

,)=0

mmap

(NULL

,3949248

,PROT_READ

|PROT_EXEC

,MAP_PRIVATE

|MAP_DENYWRITE,3

,0)=

0x7fe5983b7000

從這輸出中可以看出程式開啟了libc,然後進行了mmap操作,也就是說動態鏈結器並不知道乙個動態鏈結庫是否已經在記憶體中,它只是根據需要直接開啟訪問相應的動態鏈結庫。

那麼動態鏈結庫是怎麼實現相同部分記憶體被不同程序共享的呢?

重點就在核心中的mmap處理和缺頁異常處理上面。

大致思路如下(需要知道程序虛擬記憶體,程序頁表,頁表項,物理記憶體頁框等概念):

為程序分配一段虛擬位址空間,並將此空間與libc.so關聯起來。此時還沒有分配物理記憶體,程序頁表相應頁表項也為空。

程序開始執行的時候,發現相應頁表項為空,此時產生缺頁異常。

核心中會為每個檔案節點維持乙個radix樹(Page Cache),該樹記錄了為載入該檔案已經分配的物理記憶體頁框。因此在缺頁異常的處理過程中,會去查詢對應檔案內容部分的頁框是否已經分配,如果沒有則進入步驟4,如果已經分配了進入步驟5.

首先分配物理記憶體頁框,設定程序頁表對應頁表項,然後從磁碟讀取libc.so的相應內容到對應的物理記憶體頁框中。並將該頁框加入到radix樹中。

找到已經分配的物理記憶體頁框,設定程序頁表對應頁表項。此時便實現了相應物理記憶體頁框的共享,也就是說乙個存在有檔案內容的物理記憶體頁框被對映進了不同程序的虛擬位址空間。

mmap核心處理部分大概思路:

do_mmap_pgoff():

//建立vma線性區等

mmap_region

()file

->f_op

->mmap

(file

,vma)[

generic_file_mmap

()]缺頁異常處理部分大概思路:

filemap_fault():

if(find_lock_page

(inode

->,vmf

->pgoff

))//找到對應物理記憶體頁框

else附圖:

如何判斷某個演員適不適合這個角色?

Zhuly 大概從演員的軟條件和硬體兩方面的分析。演員對角色的理解,對劇本的感覺。最好是能理解角色,並有共鳴,有激情想演這個角色。氣質符合,起碼不矛盾。還有就是外表條件符合人設啦 別搶我小魚幹 我覺得看演技和敬業水平。演技好演什麼像什麼 參考黃渤 演技好又相當敬業的演員演的戲會讓你忘了你在看戲 參考...

如何判斷某個人是否患有精神疾病?

亞特蘭蒂斯 本身並不難判斷,有這方面培訓的人或是看這方面的書之後很好的理解並訓練的人,應該很難判斷,殺死83歲老人的67歲農婦公安如果測慌就很難通過,她殺人都這麼鎮定應該是慣犯。判斷精神病也應該有類似的情形。 肇事惹禍的精神病人比肇事惹禍的正常人概率還要低 而且現在很多掛著精神病醫生名號的,有一部分...

如何判斷伺服器是否被攻擊?

QQ76590222 如果是DDOS攻擊,直接找機房要流量圖就看得到了,如果是CC攻擊的就比較麻煩點。雖然市面上有各種盾來防禦CC,實際上都是做的一些防禦策略。具體的可以詳細去了解一下。 IDC wang 攻擊主要分cc或者ddos,ddo是比較直接的,直接就把你伺服器ip打掛了,就連線不上伺服器,...