Linux Systems Call 基于Arm v8

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)

函数根据系统调用表,和调用号,找到相应的入口函数。








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值