Exec函式對應的系統呼叫處理過程

2021-07-01 22:19:54 字數 1721 閱讀 6874

關於系統呼叫,前兩周已經詳細說明了,這次就主要講講exec函式對應的系統呼叫的不同之處。還有,exec對應的程式是怎樣載入到記憶體裡並且執行的。

exec對應的中斷處理程式

在這裡我們首先來說明一下,在linux裡,乙個程式是如何載入執行的。一般,我們是在shell裡執行一條命令,然後就執行了乙個程式。那麼shell的原理是什麼呢?一般shell,都是首先先fork乙個子程序,可是,fork的子程序是和父程序執行相同的程式,這不符合我們的要求,所以就需要execlp函式,用子程序來載入執行我們想要執行的程式。這就是shell的基本原理。

那麼下面呢,我們就來分析一下exec系統呼叫。首先,exec會呼叫sys_execve,然後呢,呼叫do_execve,再呼叫do_execve_common,這個函式會把函式引數和系統環境傳進來進行相應的處理。然後呼叫exec_binprm來執行相應的程式。這個函式裡面有很多重要的**。其中,很重要的一點就是會呼叫search_binary_handler,這個函式會呼叫各種不同的格式來識別相應的檔案,直到識別為止,比如linux中可執行檔案為elf,它就會識別出elf檔案。我們可以分析一段這段**.

1369    list_for_each_entry(fmt, &formats, lh) 

1384

if (retval !=

-enoexec

||!bprm->file)

1388 }

首先,先找出對應的格式,直到找到為止。接著,找到以後,retval = fmt->load_binary(bprm)把對應的檔案以對應的格式載入到記憶體裡面(fmt->load_binary(bprm)),這就是這段**的作用。然後,根據相應的格式,因為是linux,所以格式是elf,所以會執行對應的load_elf_binary,然後在這個函式裡面有乙個函式start_thread,這個函式會複製核心堆疊,同時會設定新的程序的執行位置,即會設定新的eip,把eip指向新程式的入口位置。

gdb除錯程式

我們一邊做實驗一邊來說明,首先,我們像往常一樣開始除錯,exec對應的系統呼叫的中斷處理程式為sys_execve,我們在這裡加個斷點。如下圖。

然後,我們選擇s,一步一步執行,會發現程式會sys_execve->do_execve -> do_execve_common -> exec_binprm….

到了這裡注意,我們發現設定了新的eip,我們看一下這個新的eip是什麼位置,我們選擇po eip,同時 read -h hello,我們發現hello的入口位置就是這個eip的值。如圖:

最後,選擇繼續執行c,hello成功執行。

程式的靜態和動態鏈結

程式有靜態鏈結和動態鏈結,動態鏈結又分為裝載時鏈結和執行時鏈結。

所謂靜態鏈結呢,就是在鏈結時,就已經把庫檔案打包好到源程式了,這時候裝載到記憶體裡就可以直接執行了,不在需要做什麼工作了。像對於sys_execve系統呼叫load_elf_interp指的就是程式的入口位址。裝載時鏈結,就是在程式裝入時記憶體時,進行鏈結,我們一般,最常使用的方式就是這種。而執行時鏈結是在執行時動態載入的,這種一般需要使用幾個函式如,dlopen,dlsym等等。裝載時鏈結等載入源程式結束後load_elf_interp接著把控制權交給了鏈結器ld。

總結本週,我們主要學習了execve系統呼叫,結合上週的fork系統呼叫,我們就可以成功地執行乙個新程式了。簡單地說,fork負責建立乙個和父程序一樣的子程序來執行,而execve負責把子程序來執行新的程式,這就是乙個新程式執行的基本方法。

實驗六 fork函式對應的系統呼叫處理過程

一.實驗過程 跟蹤到do fork 跟蹤到copy process 跟蹤到copy thread 到此就一直在迴圈執行,最後執行到ret from fork.在ret from fork中會jump到syscall exit。二.實驗分析 linux通過複製父程序建立新程序,fork vfork c...

5 3 系統呼叫 系統呼叫處理程式

通知核心的機制是靠軟中斷實現的 通過引發乙個異常來促使系統切換到核心態去執行異常處理程式。此時的異常處理程式實際上就是系統呼叫處理程式。5.3.1 指定恰當的系統呼叫 因為所有的系統呼叫陷入核心的方式都一樣,所以僅僅是陷入核心空間是不夠的。因此必須把系統呼叫號一併傳給核心。system call 函...

linux系統呼叫 exec函式族簡介

6個exec只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。exec函式族的作用是根據指定的檔名找到可執行檔案,並用他來取代系統呼叫的內容,也就是說在呼叫程序內部執行乙個可執行檔案 2進製或指令碼 exec函式執行成功後不返回,因為呼叫程序的實體,包括 段 資料段 棧堆等...