请问哪位能解释一下linux新内核中SYSCALL_DEFINE实现系统调用的原理
时间:2010-03-18
来源:互联网
例如以前来自应用层的socket()函数调用系统调用sys_socket()。现在的内核里没有sys_socket()的实现,而是通过SYSCALL_DEFINE。
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1294{
1295 int retval;
1296 struct socket *sock;
1297 int flags;
1298
1299 /* Check the SOCK_* constants for consistency. */
1300 BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1301 BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1302 BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1303 BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1304
1305 flags = type & ~SOCK_TYPE_MASK;
1306 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1307 return -EINVAL;
1308 type &= SOCK_TYPE_MASK;
1309
1310 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1311 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1312
1313 retval = sock_create(family, type, protocol, &sock);
1314 if (retval < 0)
1315 goto out;
1316
1317 retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1318 if (retval < 0)
1319 goto out_release;
1320
1321out:
1322 /* It may be already another descriptor
Not kernel problem. */
1323 return retval;
1324
1325out_release:
1326 sock_release(sock);
1327 return retval;
1328}
请问这是怎么对应多来的?
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1294{
1295 int retval;
1296 struct socket *sock;
1297 int flags;
1298
1299 /* Check the SOCK_* constants for consistency. */
1300 BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1301 BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1302 BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1303 BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1304
1305 flags = type & ~SOCK_TYPE_MASK;
1306 if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1307 return -EINVAL;
1308 type &= SOCK_TYPE_MASK;
1309
1310 if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1311 flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1312
1313 retval = sock_create(family, type, protocol, &sock);
1314 if (retval < 0)
1315 goto out;
1316
1317 retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1318 if (retval < 0)
1319 goto out_release;
1320
1321out:
1322 /* It may be already another descriptor

1323 return retval;
1324
1325out_release:
1326 sock_release(sock);
1327 return retval;
1328}
请问这是怎么对应多来的?
作者: youngmanyd 发布时间: 2010-03-18
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
^^^^
^^^^
作者: sippey 发布时间: 2010-03-18
回复 youngmanyd
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINEx(x, sname, ...) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINEx(x, sname, ...) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
作者: CUDev 发布时间: 2010-03-18
#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__)
看这个更直接一点,2.6.35中有这样的宏定义
#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__)
看这个更直接一点,2.6.35中有这样的宏定义
作者: dreamice 发布时间: 2010-11-06
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28