首页 > 其他分享 >SystemCall系统调用流程

SystemCall系统调用流程

时间:2022-09-28 22:57:07浏览次数:78  
标签:__ 调用 name SYSCALL 流程 SystemCall DEFINEx sysinfo define

用户空间

bionic/libc/kernel/uapi/asm-generic/unistd.h 系统调用号的宏定义

#define __NR_sysinfo 179

bionic/libc/arch-arm64/syscalls/sysinfo.S 汇编定义相关函数的中断调用过程

#include <private/bionic_asm.h>

ENTRY(sysinfo)
    mov     x8, __NR_sysinfo
    svc     #0

    cmn     x0, #(MAX_ERRNO + 1)
    cneg    x0, x0, hi
    b.hi    __set_errno_internal

    ret
END(sysinfo)

将调用号__NR_sysinfo传给寄存器r8,最终内核将收到这个调用号

内核空间

内核中调用号的定义在include/uapi/asm-generic/unistd.h中

#define __NR_sysinfo 179
__SC_COMP(__NR_sysinfo, sys_sysinfo, compat_sys_sysinfo)

系统调用的申明在include/linux/syscalls.h中

asmlinkage long sys_sysinfo(struct sysinfo __user *info);

arch/arm/kernel/calls.S 在内核中有与系统调用号对应的系统调用表

CALL(sys_sysinfo)
SYSCALL_DEFINE

sys_sysinfo()定义在内核源码找不到直接定义,而是通过syscalls.h文件中的SYSCALL_DEFINE宏定义。这些宏的展开参考Linux系统调用(syscall)原理

#define SYSCALL_DEFINE0(sname)                  \
    SYSCALL_METADATA(_##sname, 0);              \
    asmlinkage long sys_##sname(void)

#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)

#define SYSCALL_DEFINEx(x, sname, ...)              \
    SYSCALL_METADATA(sname, x, __VA_ARGS__)         \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

kernel/sys.c最终函数

SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
{
    struct sysinfo val;

    do_sysinfo(&val);

    if (copy_to_user(info, &val, sizeof(struct sysinfo)))
        return -EFAULT;

    return 0;
}
技巧

如果你要查找系统调用的最终函数,只要记住SYSCALL_DEFINEx(x, sname, ...)
比如kill函数原型是int kill(pid_t pid, int sig), 因此只需要grep -rn 'SYSCALL_DEFINE2(kill'就可以查找到, 其中2是函数原型的参数个数,kill是函数名
sysinfo函数原型int sysinfo(struct sysinfo *info),则是grep -rn 'SYSCALL_DEFINE1(sysinfo'就可以查找到,最终结果

$ grep -rn 'SYSCALL_DEFINE1(sysinfo'
kernel/sys.c:2567:SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
kernel/sys.c:2597:COMPAT_SYSCALL_DEFINE1(sysinfo, struct compat_sysinfo __user *, info)
$ grep -rn 'SYSCALL_DEFINE2(kill'
kernel/signal.c:2970:SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)

标签:__,调用,name,SYSCALL,流程,SystemCall,DEFINEx,sysinfo,define
From: https://www.cnblogs.com/tangshunhui/p/16739605.html

相关文章

  • Python psutil cpu_percent调用说明
    psutil获取系统cpu使用率的方法是cpu_percent(),其有两个参数,分别是interval和percpu,interval指定的是计算cpu使用率的时间间隔,percpu则指定是选择总的使用率还是每个cpu的......
  • 子类调用父类方法
    最近在给老师做WPF,遇到了之前没有仔细考虑的一个问题:子类如何调用父类的方法。主要情景:在一个父类窗体A中,打开另一个窗体B,现在B想访问A中的方法。如果是A想访问B中的方法......
  • 流程控制:while循环与for循环
    流程控制:while循环与for循环目录§一、流程控制之while循环1.while条件2.while条件中的关键字3.whileelse语句4.while循环的补充说明§二、流程控制之for循环1.基本使用......
  • 流程控制之while与for结构
    while与for循环while循环结构的补充死循环真正的死循环是一旦执行,CPU功能消耗就会急速上升,直到系统采取紧急措施,尽量不要让CPU长时间不间断运算死循环案例eg1:......
  • 流程控制(二)
    1.死循环真正的死循环是一旦执行,cpu功耗不断上升,直到系统采取紧急措施尽量不要让cpu长时间不间断运算2.嵌套及全局标志位注意:一个break只能结束一个循环......
  • while循环补充说明,流程控制之for循环,range的使用方法
    while循环补充说明1.死循环 真正的死循环是一旦执行CPU功耗会急速上升直到系统采取紧急措施 尽量不要让CPU长时间不间断运算2.嵌套及全局标志位 强调:一......
  • while循环补充说明,流程控制之for循环,基本数据类型内置方法
    目录while循环补充说明,流程控制之for循环,基本数据类型内置方法今日内容概要今日内容详细while循环补充说明流程控制之for循环range方法range实战案例作业while循环补充说......
  • 流程控制之循环(二)
    流程控制之循环(二)while循环之补充说明死循环死循环的意思是一旦程序运行就不会自动停止像上图所示的这种就是一个死循环,但还不是一个真正的死循环真正的死循环是一......
  • 流程控制之for循环
    目录一.流程控制之for循环1.for循环语法结构2.for循环特点3.for循环主要遍历的数据类型4.for循环语法结构中的变量名如何命名5.for循环中break/continue/else的使用二.ran......
  • python流程控制下-for、while循环补充
    循环结构之for循环实现循环结构还可以用关键字for。for关键字我们来看这一段代码:emotions=['smile','laugh','cry','angry']foremoinemotions:print('我......