基礎鞏固-操作系統-程序的執行

程序的執行

程序的執行可以換成可執行文件執行這種說法

進程可以理解爲執行上下文,這就意味着進行計算需要收集各種信息

可執行文件可以理解爲在一個進程中描述了新的上下文信息,雖然進程的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[]中存放的就是三個字符串的地址

目標文件向可執行文件的轉化

編譯+彙編源碼文件之後,源碼文件轉變成了彙編語言指令的機器代碼,但此時並不能執行,因爲一些庫文件和其他源碼文件不被包含在裏面,要進行鏈接操作

鏈接操作分爲動態鏈接靜態鏈接,靜態鏈接就是將其他庫文件和源碼文件中的代碼粘合到目標文件形成可執行文件,使用動態鏈接的文件並不用包含庫文件的目標代碼,而是指向要用的庫文件,程序被裝入內存後,動態鏈接器會專注於分析可執行文件中的庫名,確定庫在系統目錄中的位置並進行內存映射,然後把控制權交給程序,程序執行!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章