日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Linux源碼解讀(七):文件系統(tǒng)——可執(zhí)行文件的加載和執(zhí)行
1、ELF格式2、可執(zhí)行文件加載3、可執(zhí)行文件執(zhí)行4、總結(jié)在前面的文章中,一、ELF格式在介紹可執(zhí)行文件加載和執(zhí)行之前,內(nèi)核首先會(huì)去搜索環(huán)境變量PATH指定路徑下是否有該命令的可執(zhí)行文件。


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

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

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

一、ELF格式

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

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

當(dāng)然,在使用GCC編譯工具時(shí),默認(rèn)就會(huì)生成一個(gè)符合ELF規(guī)范的二進(jìn)制目標(biāo)代碼。

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

1. 加載方式

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

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

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

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

(3)載入代碼段:將可執(zhí)行文件中的代碼段復(fù)制到剛剛分配好的虛擬地址空間中,并設(shè)置相應(yīng)頁(yè)表項(xiàng)標(biāo)志位。

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

2. 加載器

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

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

1. 入口函數(shù)

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

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

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

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

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

3. 信號(hào)處理

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

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

四、總結(jié)

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

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


本文題目:Linux源碼解讀(七):文件系統(tǒng)——可執(zhí)行文件的加載和執(zhí)行
標(biāo)題URL:http://www.dlmjj.cn/article/coiiseh.html