- 论坛徽章:
- 0
|
本帖最后由 qinjiana0786 于 2010-05-13 11:36 编辑
回复 qinjiana0786
多谢您的分享,我已经购买了一本,至少因为您这本书让我有了把linux协议栈过一遍的信心.
只是还有一个小问题需要请教一下您,就是linux-2.6.30以上的内核好像找不到sys_socket,sys_bind等几个函数的位置.需要您指点一下.
buzzle 发表于 2010-05-12 18:24
仍旧在/net/socket.c文件中,只不过使用了SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)的定义形式,其余几个函数也在这个文件中。
下面这是SYSCALL_DEFINE3的定义,它在include/linux/syscalls.h中。
#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__))
__SC_DECL也是宏定义。
#define __SC_DECL1(t1, a1) t1 a1 //去掉参数定义中的逗号,例如char ,abc => char abc
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__) //处理二个参数定义中的逗号,例如 char,abc,int,def => char abc,int def
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__) //以此类推,__VA_ARGS__ 代表 "..." 中的多个参数 |
|