【发布时间】:2012-02-20 01:22:41
【问题描述】:
我正在寻找open()、close()、write() 和unlink() 的实现,但我在任何地方都找不到它们!我发现的每个函数都类似于sys_open、do_open、etc_open... 但我们使用的界面却没有。你能帮帮我吗?
我需要了解他们进行了哪些安全检查
【问题讨论】:
标签: c linux linux-kernel kernel
我正在寻找open()、close()、write() 和unlink() 的实现,但我在任何地方都找不到它们!我发现的每个函数都类似于sys_open、do_open、etc_open... 但我们使用的界面却没有。你能帮帮我吗?
我需要了解他们进行了哪些安全检查
【问题讨论】:
标签: c linux linux-kernel kernel
您需要在内核源代码中查找SYSCALL_DEFINE 宏。例如,在 /fs 处对 unlink 进行 grepping 会得到以下结果:
$ 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 后面的数字是系统调用参数计数。
【讨论】:
如果您指的是 library 调用,例如 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 :-)
【讨论】: