程式的執行可以換成可執行檔案執行這種說法
程序可以理解為執行上下文,這就意味著進行計算需要收集各種資訊
可執行檔案可以理解為在乙個程序中描述了新的上下文資訊,雖然程序的id並沒有改變
在linux下,開啟shell算是開啟了乙個程序,在shell下執行命令ls -l ,shell程序開啟了乙個新程序,在新程序中本來是繼承了shell程序的全部程式(子程序會將父程序的**進行拷貝,貼上到乙個新的使用者態位址空間內),但是這個新程序是要執行ls命令的,也就是執行某個目錄下的ls可執行檔案,程序就會呼叫系統函式execve(),並且傳遞ls可執行檔案的路徑,execve() 函式接下來尋找到路徑下的可執行檔案,判斷其檔案型別(檢查是否是可執行檔案),並根據可執行檔案中的資訊修改原本的執行上下文,當系統呼叫execve()函式終止時,新程序開始執行**「」「」,也就是執行ls命令(檢視當前目錄)。
當乙個程序執行可執行檔案的時候,他的執行上下文會改變很大,因為從父程序繼承的大部分資源會被拋棄。
那命令列引數是如何傳遞給程式的呢?
引數傳遞依賴於所用的高階語言,在c語言中的
int main(int argc, char * argv[ ] )
argc是引數的個數,argc[ ] 是指向字串指標陣列的指標
比如以下命令:
/usr/bin : ls -l
這條命令是檢視/usr/bin下的全部檔案目錄的命令,由於傳遞了三個引數,那麼argc的值就是3,分別是ls字串,-l字串,/usr/bin字串,argv中存放的就是三個字串的位址
目標檔案向可執行檔案的轉化
編譯+彙編原始碼檔案之後,原始碼檔案轉變成了組合語言指令的機器**,但此時並不能執行,因為一些庫檔案和其他原始碼檔案不被包含在裡面,要進行鏈結操作
鏈結操作分為動態鏈結和靜態鏈結,靜態鏈結就是將其他庫檔案和原始碼檔案中的**粘合到目標檔案形成可執行檔案,使用動態鏈結的檔案並不用包含庫檔案的目標**,而是指向要用的庫檔案,程式被裝入記憶體後,動態鏈結器會專注於分析可執行檔案中的庫名,確定庫在系統目錄中的位置並進行記憶體對映,然後把控制權交給程式,程式執行!
作業系統 程式的併發執行
在早期無作業系統及單道批處理系統時,程式都是按照順序進行執行的。先進入記憶體的先執行,在執行的過程中不能執行其他的程式。程式中的指令也是按照順序執行,一條指令正在執行時不能開始執行另一條指令。所以程式順序執行有以下幾個特點。處理機的操作,嚴格按照順序執行,前一操作還沒執行完畢,後繼操作則不能繼續執行...
作業系統 前言03 程式執行過程
cpu讀取pc指標指向的指令,將他匯入指令暫存器.pc program counter 程式計數器,也是一種暫存器。2.cpu分析指令暫存器中的內容,並分析指令的型別和引數.3.如果是計算機型別指令,就交給邏輯單元計算 如果是儲存型別的指令,難就由控制單元執行.4.pc指標自增,並準備獲取在一條指令...
作業系統(四)作業系統的執行機制
目錄 1.4 作業系統的執行機制 1.4.1 核心程式 應用程式 1.4.2 特權指令 非特權指令 1.4.3 核心態 使用者態 1.4.4 作業系統的核心 1.4.5 小結 作業系統其實也是一種程式,程式的執行過程也就是cpu執行一行行機器指令的過程。區別於一般程式設計師開發的應用程式,實現作業系...