1. 程式人生 > >系統呼叫入口函式原始碼分析system_call——X86_64

系統呼叫入口函式原始碼分析system_call——X86_64

在實驗中用到這一塊,就去看原始碼分析整理了一下,全部為個人理解。有錯誤的地方,希望和大牛交流。大笑

首先解釋一下,我實驗的目的是獲得系統呼叫入口函式system_call的起始地址和函式大小。

在linux-3.10.1, x86 64位的系統下,系統呼叫的入口地址儲存在MSR暫存器中,通過rdmsrl(MSR_LSTAR,ksystem_call);便可獲得系統呼叫的入口地址,然後對該入口地址進行解析得到入口函式為system_call,具體的函式實現在/linux-3.10.1/arch/x86/kernel/entry_64.S檔案中。

Entry_64.S為一個彙編檔案,即system_call函式是有組合語言實現的,在ENTRY(system_call)與END(system_call)之間有很對其他的函式定義和呼叫,與C語言程式的結構不同,因此system_call以及它內部包含的所有的核心函式的符號資訊都儲存在kallsyms檔案系統中,因此根據核心棧中的返回地址查詢kallsyms得到的核心符號可能只是真正呼叫函式內部的一箇中間函式,通過實驗我們也驗證了這個猜想,這也是在實驗中根據核心函式中一個地址本該獲得的核心符號為system_call,結果得到的卻是system_call_fast_path的原因。

對system_call的函式實現分析之後我們得到圖1的處理流程:


圖1 system_call的處理過程

為了獲取到正確的核心函式資訊,在核心模組中使用kallsyms_lookup_name()函式以system_call為引數可以獲得它對應的核心符號資訊,在得到system_call結束後的第一個函式對應的地址資訊,即可計算出system_call函式所佔空間大小。

對於宿主機的系統呼叫表以及其他核心符號的資訊,使用相同的方法獲取。