Chinaunix首页 | 论坛 | 博客
  • 博客访问: 377715
  • 博文数量: 160
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-18 01:16
文章分类

全部博文(160)

文章存档

2016年(4)

2015年(13)

2014年(29)

2013年(114)

我的朋友

分类: Android平台

2013-07-23 00:15:37

引用于
http://blog.csdn.net/csalp/article/details/6455387  与
http://blog.csdn.net/zf_prm/article/details/8856499

include/linux/syscalls.h中定义了sys_socket函数的函数原型(prototype

asmlinkage long sys_socket(int, int, int);

系统调用函数必须满足:

asmlinkage long sys_##function-name(##args){ ,return ret}

 

include/linux/unistd.h中,将sys_socket系统调用和系统调用好关联起来

#define __NR_socket 198       

__SYSCALL(__NR_socket, sys_socket)//系统调用号为198

unistd.h中,同时给出注释表明,给函数的实现在socket.c

进入socket.cnet/中),发现有这样一个函数实现(或者定义)

SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ ….}

3:代表有3个参数,用于解析参数时候用)

肯定这就是asmlinkage long sys_socketintintint)的实现了。为了表明这一切,需要进一步查看宏SYSCALL_DEFINE3的定义

值得高兴的是SYSCALL_DEINFE3的定义也在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, _##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__)

那么:SYSCALL_DEFINE3(socket,int,family,int,type,int,protocal)===

SYSCALL_DEFINEX(3,socket,__VA_ARGS__)

在同一文件中,定义了SYSCALL_DEFINEX(….)

#ifdef CONFIG_FTRACE_SYSCALLS

#define SYSCALL_DEFINEx(x, sname, ...)                          /

       static const char *types_##sname[] = {                    /

              __SC_STR_TDECL##x(__VA_ARGS__)                 /

       };                                              /

       static const char *args_##sname[] = {               /

              __SC_STR_ADECL##x(__VA_ARGS__)                 /

       };                                              /

       SYSCALL_METADATA(sname, x);                      /

       __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

#else

#define SYSCALL_DEFINEx(x, sname, ...)                          /

       __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

#endif

 

#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS

 

#define SYSCALL_DEFINE(name) static inline long SYSC_##name

 

#define __SYSCALL_DEFINEx(x, name, ...)                              /

       asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));        /

       static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));    /

       asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))        /

       {                                                      /

              __SC_TEST##x(__VA_ARGS__);                      /

              return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));     /

       }                                                      /

       SYSCALL_ALIAS(sys##name, SyS##name);                         /

       static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))

 

#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */

 

#define SYSCALL_DEFINE(name) asmlinkage long sys_##name

#define __SYSCALL_DEFINEx(x, name, ...)                              /

       asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

 

#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */

#define __SC_DECL1(t1, a1)      t1 a1
#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)


#define __SC_LONG1(t1, a1)      long a1
#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__)
#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__)
#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__)
#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__)
#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__)
#define __SC_CAST1(t1, a1)      (t1) a1
#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__)
#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__)
#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__)
#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__)
#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__)

由此,我们得到

SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ ….}

ó SYSCALL_DEFINEX(3,_socket,__VA_ARGS__)

ó_SYSCALL_DEFINE(3,_socket,__VA_ARGS__)

óasmlinkage long sys_socket(int family,int type,int protocol)

而他的原型正是:asmlinkage long sys_socketintintint

分析了系统是如何定义和实现sys_socket的系统调用。接下来,仔细分析sys_socket是如何实现创socket的。在前面,我们知道inet_family_ops中的create函数为inet_create,也就是说,如果要创建inet型的socket,将由函数inet_create来创建。

先来看看inet_family_ops

static const struct net_proto_family inet_family_ops = {

       .family = PF_INET,

       .create = inet_create,

       .owner  = THIS_MODULE,

};

 

 

 

下面看看sys_socket中的函数调用关系:

sys_socket

       |

       +--------- sock_create

       |                    |

       |                    +------- __sock_create

       |                                         |

       |                                         +------- security_socket_create

       |                                         +-------- sock_alloc()

       |                                         +---------rcu_dereference(net_families[family])

       |                                         +--------- pf->create(net, sock, protocol, kern)

       |                                         +--------- module_put(pf->owner)

       |                                         +--------- security_socket_post_create

       +---------- sock_map_fd

sys_socket 调用sock_create函数,最终调用rcu_dereference函数来得到相应的net_family_ops,在这里是inet_family_ops,然后调用inet_family_ops结构中的create函数,这里是inet_create函数,来创建socketsock_map_fd是得到一个文件号。

(not confirm)

当使用socket(int,int,int)创建一个socket时,socket会调用sys_socket来完成socket的创建。


阅读(2236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~