簡體   English   中英

在Linux內核源代碼中實現系統調用/陷阱

[英]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.csyscall_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源代碼。 一些例子:

chdir.S

syscalls.h

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM