System Call 的声明
今天在阅读内核代码时,很想看一下sys_mknod都作了一些什么。查找了半天,没有找到函数的定义。
只是找到了函数的声明, 和系统调用表内会把它包含。
arch/arm64/kernel/sys.c
#define __SYSCALL(nr, sym) [nr] = sym,
/*
* The sys_call_table array must be 4K aligned to be accessible from
* kernel/entry.S.
*/
void *sys_call_table[__NR_syscalls] __aligned(4096) = {
[0 ... __NR_syscalls - 1] = sys_ni_syscall,
#include <asm/unistd.h>
};
include/uapi/asm-generic/unistd.h
#define __NR_mknod 1027
__SYSCALL(__NR_mknod, sys_mknod)
sys_mknod的定义
grep sys_mknod无数次之后,我也没有找到具体的定义。
fs/namei.c:SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev)
费劲力气,我终于发现了sys_mknod的定义。 Linux开始采用宏来定义系统调用了。
System Call 的实现
在文件 arch/arm64/kernel/entry.S
/*
* SVC handler.
*/
.align 6
el0_svc:
adrp stbl, sys_call_table // load syscall table pointer
uxtw scno, w8 // syscall number in w8
mov sc_nr, #__NR_syscalls
el0_svc_naked: // compat entry point
stp x0, scno, [sp, #S_ORIG_X0] // save the original x0 and syscall number
enable_dbg_and_irq
ldr x16, [tsk, #TI_FLAGS] // check for syscall hooks
tst x16, #_TIF_SYSCALL_WORK
b.ne __sys_trace
adr lr, ret_fast_syscall // return address
cmp scno, sc_nr // check upper syscall limit
b.hs ni_sys
ldr x16, [stbl, scno, lsl #3] // address in the syscall table
br x16 // call sys_* routine
ni_sys:
mov x0, sp
b do_ni_syscall
ENDPROC(el0_svc)
函数根据系统调用表,和调用号,找到相应的入口函数。