【LInux】從動態庫的加載深入理解頁表機制

在這里插入圖片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃個人主頁 :阿然成長日記 👈點擊可跳轉
📆 個人專欄: 🔹數據結構與算法🔹C語言進階🔹C++🔹Liunx
🚩 不能則學,不知則問,恥于問人,決無長進
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目錄

  • 動態庫的鏈接理解:
  • 鏈接的三種方式
  • 問題一:誰來決定哪些庫加載,哪些沒加載?
  • 問題二:談談裝入的三種方式
  • 談談程序的加載的地址問題
  • 動態庫是如何被進程動態鏈接的

動態庫的鏈接理解:

首先:你應該知道一個前提知識,每一個程序都有自己對應的進程空間,這個地址空間被劃分為很多區域,例如:棧、堆、共享區~。

系統中有很多程序,這些程序會用到一些公共方法,將這些公共方法打包成動態庫、共享庫。首次使用到庫時需要加載到內存中,之后其他程序在使用公共方法時,直接從內存中映射一份下來。不需要拷貝到自己的地址空間中,節省了內存。這種鏈接方式又叫動態鏈接

如下圖,進程1和進程2都是用了同一個庫中的方法,直接從內存中映射一份下來
在這里插入圖片描述

鏈接的三種方式

  • 靜態鏈接:在程序運行之前,先將各個目標模塊以及他們所需要的庫函數連接成一個完整的可執行文件(裝入模塊),之后不再拆開。
  • 裝入時動態鏈接:將各目標模塊裝入內存時,邊裝入邊鏈接
  • 運行時動態鏈接:在程序執行中需要該目標模塊時才對他進行鏈接,優點是便于修改和更新,便于實現對目標模塊的共享。

問題一:誰來決定哪些庫加載,哪些沒加載?

os操作系統,記住一句話操作系統中的管理都是先描述后組織,加載進來的一個個庫,操作系統會為它們生成一個結構體類似于PCB存儲它的描述信息,然后對其進行一個雙向指針連接,由操作系統來進行管理。

問題二:談談裝入的三種方式

裝入的三種方式

  • 絕對裝入:在編譯時知道程序放在內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。靈活性很低,只適用于單道程序環境,只有單道程序環境可以在程序運行之前就能確定程序將要放入哪個位置
  • 靜態重定位:又稱為可重定位裝入。裝入模塊全部使用邏輯地址,在裝入的時候將邏輯地址全部轉換為物理地址。
    特點是必須分配其要求的全部內存空間,如果沒有足夠的內存,就不能裝入作業。作業一旦進入內存后,在運行期間就不能再移動,也不能再申請內存空間。
  • 動態重定位:又稱為動態運行時裝入。裝入模塊使用相對地址。相對地址到物理地址的轉變要等到實際運行的時候才能確定。因此裝入內存后所有的地址仍然是邏輯地址。這種方式需要一個重定位寄存器的支持。
    重定位寄存器:存放裝入模塊存放的起始位置。當實際運行的時候實時地將邏輯地址轉換為物理地址。采用動態重定位允許程序在內存中發生移動。可以將程序分配到不連續的存儲區:在程序運行前只需要裝入他的部分代碼即可投入運算,然后在程序運行期間根據需要動態申請分配內存,便于程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。

每個程序加載到內存中,都會有一個進程地址空間結構體,有棧區、堆區、共享區等等。它實際上就是一個個的有起始地址的空間組合在一起的一塊空間。并不是連續的

首先,你的代碼一定是保存在了磁盤上的,并且它會以絕對地址進行編址----又叫平坦模式。只需要拿到首地址,然后加上偏移量,

相對編址:就是每個區內的代碼都是從0地址處開始編址

談談程序的加載的地址問題

你有沒有想過一個問題,就是你寫好的代碼,cpu是如何找到你的代碼所在位置的呢

1.你寫的代碼經過編譯形成一個可執行程序。通常它會以絕對地址進行編址----又叫平坦模式
例如下圖。一個可執行文件經過編譯鏈接后形成了一個可執行程序。

  • 它包含一個表頭一堆二進制代碼
    為了方便我們看,使用反匯編將 二進制代碼裝換成我們看的懂的匯編指令
    在這里插入圖片描述

  • 觀察上圖,可以看到每一條匯編指令都有一個八進制的地址,fun1和fun2是兩個函數,還有一個main函數去調用。 這些地址,又叫邏輯地址。

2 .根據可執行程序文件的表頭(表頭中包含了入口地址,每個分區的起始地址等)填充進程的地址空間。,
在這里插入圖片描述

在這里插入圖片描述

3.從磁盤加載到內存,加載到內存后,又得到了一個物理地址,本身自帶的就有邏輯地址。所有邏輯地址到物理地址的映射關系就有了。頁表的左側是邏輯地址,右側是物理地址。

在這里插入圖片描述

4.cup中的程序計數器pc指針用來保存正在執行指令的下一條指令

  • 執行的過程如下圖,藍色線所示,從cup的pc指針找到要執行的指令,放入到指令寄存器中,然后cpu執行這個指令。

在這里插入圖片描述

動態庫是如何被進程動態鏈接的

首先,第一次用到庫的時候肯定是 先需要加載到內存中的,加載到內存后,它也會有一個頁表(邏輯-物理地址)映射關系。而且庫的名稱對應的有加載到內存的起始地址。

邏輯(虛擬)地址就能找到所在內存位置,加上偏移量就能找到庫中函數的起始地址,所以,當一個進程用到庫中函數時,它會將函數代碼映射到程序地址空間的共享區中。其他程序在使用時也是一個道理,不需要拷貝到自己的代碼區中,只需在共享區做個映射即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41028.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MindSpore學習打卡】應用實踐-自然語言處理-基于RNN的情感分類:使用MindSpore實現IMDB影評分類

情感分類是自然語言處理(NLP)中的一個經典任務,廣泛應用于社交媒體分析、市場調研和客戶反饋等領域。本篇博客將帶領大家使用MindSpore框架,基于RNN(循環神經網絡)實現一個情感分類模型。我們將詳細介紹數據…

X86和ARM架構的服務器 的區別

X86和ARM架構的服務器各有其優缺點,并適用于不同的應用場景。 一、X86架構服務器的優缺點及應用場景: 優點: 1. 易于獲取和成本較低:X86服務器在市場上品牌和型號眾多,價格相對較低,適合中小型企業。 2. 處理能力強大:X86服務器通常具有強大的處理器性能,支持多核心…

CLIP-EBC:通過增強的逐塊分類,CLIP能夠準確計數

摘要 https://arxiv.org/pdf/2403.09281v1 CLIP(Contrastive Language-Image Pretraining,對比語言-圖像預訓練)模型在識別問題中表現出了卓越的性能,如零樣本圖像分類和對象檢測。然而,由于其固有的挑戰——即將計數…

Nettyの參數優化簡單RPC框架實現

本篇介紹Netty調優,在上篇聊天室的案例中進行改造,手寫一個簡單的RPC實現。 1、超時時間參數 CONNECT_TIMEOUT_MILLIS 是Netty的超時時間參數,屬于客戶端SocketChannel的參數,客戶端連接時如果一定時間沒有連接上,就會…

Spring Cloud 是什么?(Spring Cloud 組件介紹)

什么是 Spring Cloud? Spring Cloud 是微服務系統架構的一站式解決方案,是各個微服務架構落地技術的集合體,讓架構師、 開發者在使用微服務理念構建應用系統的時候, 面對各個環節的問題都可以找到相應的組件來處理,比…

二叉樹的遍歷算法:前序、中序與后序遍歷

在數據結構與算法中,二叉樹的遍歷是基礎且重要的操作之一,它允許我們按照某種順序訪問樹中的每個節點。常見的二叉樹遍歷方式有前序遍歷(Preorder Traversal)、中序遍歷(Inorder Traversal)和后序遍歷&…

React 19 競態問題解決

競態問題/競態條件 指的是,當我們在交互過程中,由于各種原因導致同一個接口短時間之內連續發送請求,后發送的請求有可能先得到請求結果,從而導致數據渲染出現預期之外的錯誤。 因為防止重復執行可以有效的解決競態問題&#xff0…

聊天廣場(Vue+WebSocket+SpringBoot)

由于心血來潮想要做個聊天室項目 ,但是仔細找了一下相關教程,卻發現這么多的WebSocket教程里面,很多都沒有介紹詳細,代碼都有所殘缺,所以這次帶來一個比較完整得使用WebSocket的項目。 目錄 一、效果展示 二、準備工…

html+css+js圖片手動輪播

源代碼在界面圖片后面 輪播演示用的幾張圖片是Bing上的&#xff0c;直接用的幾張圖片的URL&#xff0c;誰加載可能需要等一下&#xff0c;現實中替換成自己的圖片即可 關注一下點個贊吧&#x1f604; 謝謝大佬 界面圖片 源代碼 <!DOCTYPE html> <html lang&quo…

內存對齊宏ALIGN的理解

內存對齊宏ALIGN的理解 在Android Camera HAL代碼中經常看到ALIGN這個宏&#xff0c;主要用來進行內存對齊&#xff0c;下面是v4l2_wrapper.cpp中ALIGN的一些定義 //v4l2_wrapper.cpp中內存分配進行對其的操作和定義#define ALIGN( num, to ) (((num) (to-1)) & (~(to-1)…

【Android】自定義換膚框架03之自定義LayoutInflaterFactory

AppCompatActivity是如何創建View的 Activity通過LayoutInflater解析出XmlLayout相關信息LayoutInflater內部維護了一個InflaterFactory對象InflaterFactory接口包含了一個onCreateView方法&#xff0c;用于創建View將解析出的Xml信息轉為AttributeSet&#xff0c;交給Inflate…

安全測試之使用Docker搭建SQL注入安全測試平臺sqli-labs

1 搜索鏡像 docker search sqli-labs 2 拉取鏡像 docker pull acgpiano/sqli-labs 3 創建docker容器 docker run -d --name sqli-labs -p 10012:80 acgpiano/sqli-labs 4 訪問測試平臺網站 若直接使用虛擬機&#xff0c;則直接通過ip端口號訪問若通過配置域名&#xff0…

PyQt多線程詳解

PyQt多線程是在PyQt框架中利用多線程技術來提高應用程序的響應性和性能的一種方法。下面將詳細說明PyQt多線程的基本概念、應用場景以及實現方式。 一、PyQt多線程的基本概念 在PyQt中&#xff0c;多線程指的是在單個程序實例內同時運行多個線程。每個線程都可以執行不同的任…

第十五章 Nest Pipe(內置及自定義)

NestJS的Pipe是一個用于數據轉換和驗證的特殊裝飾器。Pipe可以應用于控制器&#xff08;Controller&#xff09;的處理方法&#xff08;Handler&#xff09;和中間件&#xff08;Middleware&#xff09;&#xff0c;用于處理傳入的數據。它可以用來轉換和驗證數據&#xff0c;確…

【Linux進階】文件系統5——ext2文件系統(inode)

1.再談inode (1) 理解inode&#xff0c;要從文件儲存說起。 文件儲存在硬盤上&#xff0c;硬盤的最小存儲單位叫做"扇區"&#xff08;Sector&#xff09;。每個扇區儲存512字節&#xff08;相當于0.5KB&#xff09;。操作系統讀取硬盤的時候&#xff0c;不會一個個…

記錄excel表生成一列按七天一個周期的方法

使用excel生成每七天一個周期的列。如下圖所示&#xff1a; 針對第一列的生成辦法&#xff0c;使用如下函數&#xff1a; TEXT(DATE(2024,1,1)(ROW()-2)*7,"yyyy/m/d")&" - "&TEXT(DATE(2024,1,1)(ROW()-1)*7-1,"yyyy/m/d") 特此記錄。…

charles使用教程

安裝與配置 下載鏈接&#xff1a;https://www.charlesproxy.com/download/ 進行移動端抓包&#xff1a; 電腦端配置&#xff1a; 關閉防火墻 Proxy–>勾選 macOS Proxy Proxy–>Proxy Setting–>填入代理端口8888–>勾選Enable transparent http proxying 安裝c…

俄羅斯方塊的python實現

俄羅斯方塊游戲是一種經典的拼圖游戲&#xff0c;玩家需要將不同形狀的方塊拼接在一起&#xff0c;使得每一行都被完全填滿&#xff0c;從而清除這一行并獲得積分。以下是該游戲的算法描述&#xff1a; 1. 初始化 初始化游戲界面&#xff0c;設置屏幕大小、方塊大小、網格大小…

昇思25天學習打卡營第1天|初識MindSpore

# 打卡 day1 目錄 # 打卡 day1 初識MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思 MindSpore 優勢|特點 昇思 MindSpore 不足 官方生態學習地址 初識MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思MindSpore 是全場景深度學習架構&#xff0c;為開發者提供了全…

女生學計算機好不好?感覺計算機分有點高……?

眾所周知&#xff0c;在國內的高校里&#xff0c;計算機專業的女生是非常少的&#xff0c;很多小班30人左右&#xff0c;但是每個班女生人數只有個位數。這就給很多人一個感覺&#xff0c;是不是女生天生就不適合學這個東西呢&#xff1f;女生是不是也應該放棄呢&#xff1f;當…