+ -
当前位置:首页 → 问答吧 → 请问哪位能解释一下linux新内核中SYSCALL_DEFINE实现系统调用的原理

请问哪位能解释一下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}

请问这是怎么对应多来的?

作者: 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__))

作者: 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中有这样的宏定义

作者: dreamice   发布时间: 2010-11-06