Linux核心裝載ELF過程簡介

2021-10-10 08:07:20 字數 1447 閱讀 8809

#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...