#include #include #include int main();
pid_t pid;
while(1)
}else if(pid > 0)else
}return 0;
}
1. fork()函式
bash程序呼叫fork()系統呼叫建立乙個新的程序;
2. execlp()函式
execlp()函式是glibc對execve()系統呼叫的封裝。execve()系統呼叫被定義在unistd.h中,原型為:
int execve(const char* filename,char *const ar**,char *const envp);
注:glibc對execve()有5種不同形式的封裝,分別是execl(),execlp(),execle(),execv()和execvp()
3. sys_execve()函式
execve()系統呼叫核心中的相應入口是sys_execve()函式,它被定義在arch\i386\kernel\process.c中。該函式主要是進行一些引數的檢查複製。
4. do_execve()函式
sys_execve()函式呼叫do_execve()函式。該函式會首先查詢被執行的檔案,如果找到檔案,則讀取檔案的前128個位元組。
5. search_binary_handle()函式
do_execve()函式呼叫search_binary_handle()函式,並根據讀取的檔案的頭128個位元組去搜尋和匹配合適的可執行檔案裝載處理過程。
6. load_elf_binary()函式
search_binary_handle()函式根據搜尋的結果呼叫load_elf_binary()函式,該函式被定義在fs\binfmt_elf.c檔案中。
注:linux支援不同格式的可執行檔案,本例是以elf格式為例,故search_binary_handle()呼叫的是load_elf_binary()函式;如果是其它
格式的可執行檔案,則呼叫其它的函式
load_elf_binary()函式的主要工作:
(1) 檢查elf可執行檔案格式的有效性,比如魔數,程式頭表中段的數量
(2) 尋找動態鏈結的「.interp」段,設定動態鏈結器路徑
(3) 根據elf可執行檔案的程式表的描述,對elf檔案進行對映,比如**、資料、唯讀資料。
(4) 初始化elf程序環境,比如程序啟動時edx暫存器的位址應該是dt_fini的位址
個程式入口就是elf檔案的檔案頭中e_entry所指的位址;對於動態鏈結的elf可執行檔案,程式入口點是動態鏈結器。(注:這步
決定了程式從核心態到使用者態時轉入何處)
ELF學習 裝載過程
當我們在linux bash下執行elf程式時,linux系統是怎樣裝載和執行的呢?1.bash程序fork出子程序 2.在bash的子程序中呼叫execve系統呼叫來執行指定的elf。3.execve系統呼叫的入口是sys execve,在sys execve會呼叫do execve 4.在do ...
Linux下ELF可執行檔案裝載與執行
1 建立子程序 核心建立task struct資料結構,繼承父程序的虛擬位址空間 virtual memory space,vms 2 呼叫execve 系統呼叫執行指定的elf檔案 1 呼叫核心態函式sys execve 動態申請乙個linux binprm資料結構,並用elf可執行檔案的資料填充...
? 核心修煉 Linux啟動過程流程簡析
linux啟動流程分析 這裡僅簡要分析linux的大致啟動流程,更多細節請閱讀原始碼分析。linux核心啟動過程分為解壓和啟動vmlinux。啟動過程從核心映像入口開始執行,解壓 vmlinux 核心自引導 並且轉換到虛擬位址空間,再呼叫統一的核心啟動函式start kernel 從而啟動整個 li...