av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

Linux源碼解讀(七):文件系統(tǒng)——可執(zhí)行文件的加載和執(zhí)行

1、ELF格式2、可執(zhí)行文件加載3、可執(zhí)行文件執(zhí)行4、總結(jié)在前面的文章中,一、ELF格式在介紹可執(zhí)行文件加載和執(zhí)行之前,內(nèi)核首先會去搜索環(huán)境變量PATH指定路徑下是否有該命令的可執(zhí)行文件。


目前創(chuàng)新互聯(lián)建站已為上千余家的企業(yè)提供了網(wǎng)站建設、域名、虛擬主機、成都網(wǎng)站托管、企業(yè)網(wǎng)站設計、平原網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

在前面的文章中,我們已經(jīng)講解了Linux文件系統(tǒng)的基本概念、目錄結(jié)構(gòu)以及各種類型的文件。今天,我們將深入探討一個非常重要的主題:可執(zhí)行文件的加載和執(zhí)行過程。

作為一名程序員,我們每天都會編寫各種應用程序或者腳本,并通過編譯器生成可執(zhí)行文件。但是,在運行這些程序之前,操作系統(tǒng)需要對其進行加載并分配內(nèi)存空間。那么,在Linux中,這個過程具體是如何實現(xiàn)的呢?

一、ELF格式

在介紹可執(zhí)行文件加載和執(zhí)行之前,先來了解一下ELF格式。ELF(Executable and Linkable Format)即“可執(zhí)行與鏈接格式”,它是Unix類操作系統(tǒng)上二進制目標代碼所采用的標準格式。

ELF不僅支持靜態(tài)庫和動態(tài)庫等多種形式組合成符號表等信息,并且還可以指定段權(quán)限、節(jié)區(qū)屬性以及調(diào)試信息等內(nèi)容。

當然,在使用GCC編譯工具時,默認就會生成一個符合ELF規(guī)范的二進制目標代碼。

二、可執(zhí)行文件加載

1. 加載方式

當用戶從shell命令行輸入某個命令時(例如ls),內(nèi)核首先會去搜索環(huán)境變量PATH指定路徑下是否有該命令的可執(zhí)行文件。

如果找到了,就會將該可執(zhí)行文件加載到內(nèi)存中。這個過程主要包括以下幾個步驟:

(1)檢查權(quán)限:內(nèi)核首先會檢查用戶對該文件是否有讀取和執(zhí)行權(quán)限,只有具備這些權(quán)限才能夠繼續(xù)進行下一步操作。

(2)分配空間:在物理內(nèi)存上為新進程分配一個虛擬地址空間,并根據(jù)程序頭部信息確定各段的大小、屬性以及所需對齊方式等內(nèi)容。同時,在用戶態(tài)和內(nèi)核態(tài)之間建立好映射關(guān)系。

(3)載入代碼段:將可執(zhí)行文件中的代碼段復制到剛剛分配好的虛擬地址空間中,并設置相應頁表項標志位。

(4)載入數(shù)據(jù)段:同樣地,將可執(zhí)行文件中的數(shù)據(jù)段復制到虛擬地址空間中,并設置相應頁表項標志位。

2. 加載器

那么,在Linux系統(tǒng)中,是哪個程序負責完成上述工作呢?答案是ld-linux.so.x或者其它類似名稱的動態(tài)鏈接器庫。當我們在shell命令行輸入某個命令時,實際上是由此啟動了一個新進程,并且通過動態(tài)鏈接器來完成相關(guān)工作并運行用戶指定程序。

三、可執(zhí)行文件執(zhí)行

1. 入口函數(shù)

當我們成功加載完畢某個可執(zhí)行文件后,接下來就是真正的程序運行過程。在C語言中,每個程序都必須包含一個入口函數(shù)main()。

當操作系統(tǒng)將控制權(quán)交給該程序時,會首先跳轉(zhuǎn)到該入口地址,并開始執(zhí)行相關(guān)代碼。此時,用戶指定的參數(shù)也會被傳遞進去。

2. 系統(tǒng)調(diào)用

除了main()函數(shù)之外,在Linux內(nèi)核中還提供了許多常用的系統(tǒng)調(diào)用API供我們使用(例如open、read、write等),以便于對各種資源進行讀寫和管理等操作。

這些系統(tǒng)調(diào)用實際上是由用戶態(tài)向內(nèi)核態(tài)發(fā)起請求并獲取返回結(jié)果的過程。而在ELF格式的可執(zhí)行文件中,則需要通過PLT表和GOT表來完成動態(tài)鏈接庫函數(shù)的加載和綁定等工作。

3. 信號處理

在某些特殊情況下(例如按下Ctrl+C組合鍵或者遇到非法指令等錯誤),操作系統(tǒng)可能會向當前進程發(fā)送一條信號通知其停止或者重新啟動等操作。

此時,我們需要編寫相應信號處理函數(shù),并且注冊到signal() API中以便于捕獲相關(guān)事件并做出相應響應。

四、總結(jié)

本文主要介紹了Linux源碼解讀系列第七篇:文件系統(tǒng)——可執(zhí)行文件的加載和執(zhí)行過程。通過深入剖析ELF格式及其規(guī)范約束,我們了解了Linux系統(tǒng)如何在內(nèi)存中為可執(zhí)行文件分配虛擬地址空間,并且將其載入到物理內(nèi)存中。

同時,在介紹動態(tài)鏈接庫的加載和使用過程時,我們也深刻認識到操作系統(tǒng)與用戶程序之間緊密相連的關(guān)系。最后,希望本文能夠?qū)Υ蠹矣兴鶈l(fā)并提供一些參考價值。


本文標題:Linux源碼解讀(七):文件系統(tǒng)——可執(zhí)行文件的加載和執(zhí)行
URL地址:http://uogjgqi.cn/article/coiiseh.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流