實驗七 Linux核心如何裝載和啟動乙個可執行程式

2021-07-11 00:09:15 字數 2014 閱讀 3132

理解編譯鏈結的過程和elf可執行檔案格式

對於靜態鏈結來說,start_thread中的elf_entry就是可執行檔案的entry

在乙個新的可執行檔案返回到使用者態之前,要把壓入核心棧的eip修改,用新的可執行程式的起點

sys_execve的內部處理過程

do_open開啟檔案,載入檔案頭部

exec_binprm關鍵點是:

尋找可執行檔案的處理函式

關鍵點是尋找能夠解析當前可執行檔案的**模組

載入處理函式​

load_elf_binary嚴格解析elf格式檔案​

尋找可執行檔案的處理函式

關鍵點是尋找能夠解析當前可執行檔案的**模組

載入處理函式​

load_elf_binary嚴格解析elf格式檔案​

**:

shell會呼叫execve將命令列引數和環境引數傳遞給可執行程式的main函式

sys_execve內部會解析可執行檔案格式

命令列引數和環境串都放在使用者態堆疊中:

用test_exec.c替換test.c​:

儲存**:

使用gdb跟蹤除錯​:

設定以下三個斷點​

在 linux 核心中,供使用者建立程序的系統呼叫fork()函式的響應函式是 sys_fork()、sys_clone()、sys_vfork()。這三個函式都是通過呼叫核心函式 do_fork() 來實現的。根據呼叫時所使用的 clone_flags 引數不同,do_fork() 函式完成的工作也各異。這部分內容簡單,我不打算就此而展開分析。下面我們重點來講解以下 do_fork() 函式的工作原理。我們知道 do_fork() 函式生成乙個新的程序,大致分為三個步驟。

1、建立程序控制結構並賦初值,使其成為程序映像。這個過程完成以下內容。 

在記憶體中分配乙個 task_struct 資料結構,以代表即將產生的新程序。把父程序 pcb 的內容複製到新程序的 pcb 中。

為新程序分配乙個唯一的程序標識號 pid 和 user_struct 結構。然後檢查使用者具有執行乙個新程序所必須具有的資源。重新設定 task_struct 結構中那些與父程序值不同的資料成員。

設定程序管理資訊,根據所提供的 clone_flags 引數值,決定是否對父程序 task_struct 中的指標 fs 、files 指標等所選擇的部分進行拷貝,如果 clone_flags 引數指明的是

共享而不是拷貝,則將其計數器 count 的值加1 ,否則就拷貝新程序所需要的相關資訊內容 pcb 。這個地方是區分 sys_fork() 還是 sys_clone() 。

把新程序加入到程序鍊錶中。把新程序加入到 pidhash 雜湊表中,並增加任務計數值。

通過拷貝父程序的上、下文來初始化硬體的上下文(tss段、ldt以及 gdt)。

3、啟動排程程式,使子程序獲得執行的機會。這部分完成以下動作:

設定新的就緒佇列狀態 task_runing , 並將新程序掛到就緒佇列中,並重新啟動排程程式使其執行。向父程序返回子程序的 pid,設定子程序從 do_fork() 返回 0 值。

作業七 Linux核心如何裝載和啟動乙個可執行程式

可執行檔案的建立 預處理 編譯和鏈結 在object檔案中有三種主要的型別。乙個可重定位 relocatable 檔案儲存著 和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。乙個可執行 executable 檔案儲存著乙個用來執行的程式 該檔案指出了exec b...

作業七 Linux核心如何裝載和啟動乙個可執行程式

可執行檔案的建立 預處理 編譯和鏈結 在object檔案中有三種主要的型別。乙個可重定位 relocatable 檔案儲存著 和適當的資料,用來和其他的object檔案一起來建立乙個可執行檔案或者是乙個共享檔案。乙個可執行 executable 檔案儲存著乙個用來執行的程式 該檔案指出了exec b...

Linux核心如何裝載和啟動乙個可執行程式

linux核心如何裝載和啟動乙個可執行程式 沙雨濟一 實驗目的 理解編譯鏈結的過程和elf可執行檔案格式 程式設計使用exec 庫函式載入乙個可執行檔案,動態鏈結分為可執行程式裝載時動態鏈結和執行時動態鏈結,程式設計練習動態鏈結庫的這兩種使用方式 使用gdb跟蹤分析乙個execve系統呼叫核心處理函...