我正在尋找open()
,close()
,write()
和unlink()
的實現,但我找不到它們在任何地方!我發現的每個功能都類似於sys_open
,do_open
,etc_open
...但與我們使用的接口沒有任何關係。你可以幫我嗎?在Linux內核尋找系統調用實現
我需要發現什麼樣的安全檢查,他們讓
我正在尋找open()
,close()
,write()
和unlink()
的實現,但我找不到它們在任何地方!我發現的每個功能都類似於sys_open
,do_open
,etc_open
...但與我們使用的接口沒有任何關係。你可以幫我嗎?在Linux內核尋找系統調用實現
我需要發現什麼樣的安全檢查,他們讓
您需要在內核源代碼中尋找SYSCALL_DEFINE
宏。例如,在/fs
grepping爲unlink
給出如下:
$ grep -r -n SYSCALL_DEFINE *.c | grep unlink
namei.c:2811:SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
namei.c:2822:SYSCALL_DEFINE1(unlink, const char __user *, pathname)
注意SYSCALL_DEFINE
後的數字是系統調用參數計數。
如果你指的是庫調用,如在fcntl.h
發現,他們不是內核的一部分,他們的glibc
一部分。
如果您的是是指實際的內核調用,系統調用xyzzy
通常由功能sys_xyzzy
處理。
的entry.S文件,至少在2.4(我沒有看過以後的內核),舉行了表映射系統調用號到功能:
.data
ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall) /* 0 - old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open) /* 5 */
.long SYMBOL_NAME(sys_close)
.long SYMBOL_NAME(sys_waitpid)
.long SYMBOL_NAME(sys_creat)
.long SYMBOL_NAME(sys_link)
.long SYMBOL_NAME(sys_unlink) /* 10 */
.long SYMBOL_NAME(sys_execve)
.long SYMBOL_NAME(sys_chdir)
.long SYMBOL_NAME(sys_time)
.long SYMBOL_NAME(sys_mknod)
.long SYMBOL_NAME(sys_chmod) /* 15 */
:
.long SYMBOL_NAME(sys_ni_syscall) /* sys_remap_file_pages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address */
KernelGrok似乎已經顯示系統的有用頁面來電,他們的名字,參數,以及在哪裏找到來源。例如(稍微重新格式化):
0 sys_restart_syscall
eax = 0x00
kernel/signal.c:2058
1 sys_exit
eax = 0x01
ebx = int error_code
kernel/exit.c:1046
2 sys_fork
eax = 0x02
ebx = struct pt_regs *
arch/alpha/kernel/entry.S:716
3 sys_read
eax = 0x03
ebx = unsigned int fd
ecx = char __user *buf
edx = size_t count
fs/read_write.c:391
4 sys_write
eax = 0x04
ebx = unsigned int fd
ecx = const char __user *buf
edx = size_t count
fs/read_write.c:408
:
等等。但是,在上學的時候,我更喜歡將內核源碼保存在本地,只需使用grep
:-)