[英]Implementation of system calls / traps within Linux kernel source
我目前正在學習操作系統使用陷阱來促進Linux內核中的系統調用。 我在traps.c中找到了陷阱表,並在entry.S中實現了許多陷阱。
但是,我被指示在Linux內核中找到兩個系統調用的實現,它使用陷阱來實現系統調用。 雖然我可以找到陷阱本身的定義,但我不確定內核中的其中一個陷阱的“調用”是什么樣的。 因此,我正在努力尋找這種行為的一個例子。
在有人問之前,是的,這是作業。
作為一個注釋,我正在使用Github瀏覽內核源代碼,因為kernel.org已關閉: https : //github.com/torvalds/linux/
對於x86架構,SYCALL_VECTOR(0x80)中斷僅用於32位內核 。 您可以在arch/x86/include/asm/irq_vectors.h
看到中斷向量布局。 所述trap_init()
從函數traps.c
是設置在所定義的陷阱處理程序的一個entry_32.S
:
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
對於64位內核 ,出於性能原因使用新的SYSENTER (Intel)或SYSCALL (AMD)。 arch/x86/kernel/cpu/common.c
的syscall_init()
函數設置了entry_64.S
定義的“handler”,並帶有相同的名稱( system_call )。
對於用戶空間的持久性,您可能需要查看此頁面 (對於函數/文件名有點過時)。
我被指示在Linux內核中找到兩個系統調用的實現,它使用陷阱來實現系統調用
每個系統調用都使用一個陷阱(如果我沒記錯的話,中斷0x80),因此PSW中的“內核”位將被打開,並且處理器可以使用特權操作。
正如您所提到的,系統調用在sys_call_table:
下的entry.S中指定,並且它們都以“sys”前綴開頭。
你可以在:include / linux / syscalls.h找到系統調用函數頭,你可以在這里找到它: http : //lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h
通常使用lxr(如上面的注釋已經提到的)來瀏覽源代碼。
無論如何,該函數是使用SYSCALL_DEFINE1或其他版本的宏實現的,請參閱http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c
如果您正在尋找實際的系統調用,而不是系統調用的實現,那么您可能想要檢查一些C庫。 為什么內核會包含系統調用? (我不是在談論系統調用實現 ,我在談論例如一個真正的chdir
調用。例如,有一個chdir
系統調用 ,這是一個更改目錄的請求,實際上有一個chdir
系統調用實現改變它,必須在內核的某個地方)。 好吧,也許有些內核確實包含了一些系統調用,但這是另一個故事:)
無論如何,如果我的問題是正確的,那么你不是在尋找一個實現,而是一個實際的呼叫。 GNU libc對我來說太復雜了,但您可以嘗試瀏覽dietlibc源代碼。 一些例子:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.