这里主要看下SYSCALL_DEFINE3这个宏定义: // include/linux/syscalls.h #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...
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval;//返回值 struct socket *sock;//struct socket主要用于给上层提供接口,会跟文件系统相关联 //后续还会有一个结构体:struct sock,它主要用于向下对接协议栈 int flags; //做一些检测 BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC...
SYSCALL_DEFINE3(open,constchar__user*,filename,int,flags,umode_t,mode)展开之后是:SYSCALL_DEFINEx(3,_open,__VA_ARGS__)这又是一个宏,根据宏定义:#define SYSCALL_DEFINEx(x, sname, ...) \__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)SYSCALL_DEFINEx(3,_open,__VA_ARGS__)展开为:__SYSCA...
1 #define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void) 2 #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) 3 #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) 4 #define SYSCALL_DEFINE3(name, ...) SYSCALL_D...
SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg) { return ksys_shmget(key, size, shmflg); } long ksys_shmget(key_t key, size_t size, int shmflg) { struct ipc_namespace *ns; static const struct ipc_ops shm_ops = { ...
在内核中,所有的系统调用函数都是通过 SYSCALL_DEFINE 等宏定义的,比如上面的write函数,使用的是 SYSCALL_DEFINE3。 将该宏展开后,我们可以得到如下的函数定义: 由上可见,SYSCALL_DEFINE3宏展开后为三个函数,其中只有__x64_sys_write是外部可访问的,其它两个都有被static修饰,不能被外部访问,所以注册到上文中提...
所以SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) 就是sys_socket函数。具体实现后续会在linux协议栈中进行介绍。 置于为什么会这么复杂,因为linux发展过程中难免碰到各种漏洞,有些则是因为修改漏洞需要,例如CVE-2009-0029漏洞 https://bugzilla.redhat.com/show_bug.cgi?id=479969 ...
SYSCALL_DEFINE3是一个宏,它定义于include/linux/syscalls.h,展开后就有sys_poll函数。 sys_poll对超时参数稍作处理后,直接调用do_sys_poll。 5.2 do_sys_poll函数 do_sys_poll位于fs/select.c文件中,我们忽略其他代码,只看关键部分: 代码语言:javascript ...
SYSCALL_DEFINE3(poll): 一开始将超时时间转换,然后调用do_sys_poll,如果在poll调用被阻塞时收到signal,do_sys_poll则产生EINR错误;此时返回ERESTART_RESTARTBLOCK,通知内核处理完信号后自动通过sys_restart_syscall重启poll调用(这个过程对用户进程而言是透明的), ...
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count) { return ksys_write(fd, buf, count); } 其逻辑同读操作基本是一致的,此处也是调用ksys_write函数,该函数如下,逻辑同读操作并无二: ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t...