2011-09-13 103 views
12

我目前正在學習操作系統使用陷阱來促進Linux內核中的系統調用。我在traps.c中定位了陷阱表,並在entry.S中實施了許多陷阱。在Linux內核源代碼中執行系統調用/陷阱

不過,我奉命找到在Linux內核兩個系統調用它利用陷阱來實現系統調用的實現。雖然我可以找到陷阱本身的定義,但我不確定對內核中這些陷阱之一的「調用」是什麼樣子。因此,我正在努力尋找這種行爲的例子。

有人問之前,沒錯,這就是功課。

作爲一個說明,我使用Github上瀏覽內核源代碼,因爲kernel.org下跌: https://github.com/torvalds/linux/

+2

作業問題:) – James

+6

使用http://lxr.linux.no/瀏覽linux源代碼。將爲您節省大量的時間;) – rumpel

+0

@rumpel:從來沒有聽說過..看起來很平淡。這裏有什麼特別的東西不能用於vim +'ctags'嗎? –

回答

0

我指示找到兩個系統的實現在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

+1

也有快速調用,不需要中斷。我不確定他們是如何實施的,所以你不得不穀歌,我很抱歉。 – RedX

+0

@RedX你是對的,但我確定系統調用Entry.S下面的'sys_call_table'是通過中斷來實現的(簡要閱讀代碼後) –

+2

@RedX x86中有SYSENTER/SYSEXIT指令這可能是你在想什麼:http://articles.manugarg.com/systemcallinlinux2_6.html – SoapBox

0

如果你正在尋找一個真正的系統調用,而不是一個系統調用的實現,也許你想檢查一些C庫。爲什麼內核會包含系統調用? (我不是在談論一個系統調用實現,我說的是如實際chdir呼叫例如,有一個chdir系統調用,這是改變目錄的請求,有一個chdir系統調用實現它實際上改變它,並且必須在內核中的某個地方)。好吧,也許有些內核做一些包括系統調用太多,但是另一個故事:)

無論如何,如果我得到你的問題的權利,你不找一個實現,但實際通話。 GNU libc對我來說太複雜了,但您可以嘗試瀏覽dietlibc源文件。一些例子:

chdir.S

syscalls.h

7

對於x86架構的SYCALL_VECTOR(0x80的)中斷僅針對32位內核使用。您可以在arch/x86/include/asm/irq_vectors.h中看到中斷矢量佈局。從traps.ctrap_init()函數是一個用來設置在entry_32.S定義的陷阱處理程序:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

對於64位內核,新SYSENTER(英特爾)或SYSCALL(AMD)說明資訊是用於性能方面的原因。來自arch/x86/kernel/cpu/common.csyscall_init()功能設置了在entry_64.S中定義並且具有相同名稱(system_call)的「處理程序」。

對於用戶空間perspetive你可能想看看this page(有點過時的功能/文件名)。