058
LINUX系统中sock.c模块的分析样本
(样本只提供该系统的基本情况介绍,若需要完整的设计和论文,建议您购买本系统,凡是购买本站系统的,本站均根据您的要求,把系统上的开发信息,题目等修改成符合您的要求)
本设计包含内容:源代码+毕业论文
论文大概:
目
录
1引言………………………………………………………….……………………3
2
sock.c模块部分代码分析……….……………………………………………..3
2.1分析内容及工具……………………………………………….………...….3
2.2与上一层的调用关系………………………………………………………..3
2.3程序流程、功能、实现以及与下层调用关系……………………………………………………………………………………4
2.3.1
int sock_setsockopt(struct socket *sock, int level, int
optname,
char__user*optval, int optlen)……………………………....4
2.3.2
static int sock_set_timeout(long *timeo_p, char __user *optval,
int optlen)………………………………………………….….13
2.3.3 static void
sock_warn_obsolete_bsdism(const char *name)…………..15
2.3.4 static
void sock_disable_timestamp(struct sock *sk)…………….…....15
2.3.5
int sock_getsockopt(struct socket *sock, int level, int
optname,
char __user *optval, int __user
*optlen)………………..…….16
2.3.6 struct sock *sk_alloc(int family, int
priority,
int zero_it, kmem_cache_t
*slab)………………………..……22
2.3.7 void sk_free(struct sock
*sk)…………………………………………...24
2.3.8 void __init
sk_init(void)…………………………………………...…...25
2.4主要数据结构关系图………………………………………………….…....26
3
结束语……………………………………………………………………….…...27
参考文献……………………………………………………………………..…….27
附
录1….……………………………………………………………………….…28
附
录2……………………………………………………………………….…….40
LINUX系统中sock.c模块的分析
作者:许慧 指导老师:陈国顺
摘
要:Lninux是一款公开源代码的操作系统,经过多年来众多程序员对它的使用及完善,使得Linux的功能也日趋完善。目前越来越多的人投身于Linux的源代码分析,人们希望通过分析其源代码去了解操作系统的运作,或者提高自己的编程水平.本文主要介绍了Linux内核中的sock.c模块中的部分代码的流程、功能、上下层调用关系,以及与这些函数相关的数据结构之间的关系,差错处理等。
关键字:LINUX内核 ;scoket 分析;流程图;数据结构
The Analysis Of Sock.c In Linux
Abstract:Linux is a source-open operating system,used and
perfected by a lot of programmers in many years,it becomes more and
more perfect. now more an more academician throw themself into the
analyse in Linux source files,they hope to comprehend how the
operating system running,or they want to heighten their program
level.This text introduce some of the flow, function, transfer and
struct relation an error manage of the sock.c in Linux.
Key Words:Linux kernel;socket analyse; flow
chart;struct
1、引 言
在计算机技术的发展史上,UNIX操作系统的出现是一个非常重要的里程碑。而Linux是一个兼容了各种UNIX标准的多用户、多任务的具有复杂内核的操作系统。LINUX的一大优点就在于它的核心源代码的公开性,在安装好的系统中,LINUX的内核源代码在/usr/scr/linux下。早期的源代码并不是很多,但是随着LINUX的越来越完善,功能越来越强大,LINUX的源代码已经是非常庞大了,但是并不是杂乱无章的,通过进一步观察你可以发现源码目录中包含有
Kernel,mm 以及 net
等的目录,其中包含了许多的源文件,但是包含在其中的.c和.h文件并不是每个都会用到的,而是在编译时根据系统的配置有选择的使用。
目前越来越多的人投身于LINUX的核心源代码分析,在对LINUX源代码的分析者中,以对内存管理,中断,进程调度,文件系统,磁盘管理,网络等模块的分析的人居多,而在网络系统模块中,有分析数据报的,分析协议的等方面。在分析socket方面,研究内容多以分析net/socket.c及其涉及到的头文件为主。就sock.c来说,可以说它是比socket.c更为底层的,因为socket.c中所调用的函数很多就是调用这个文件里的。我们所要分析的而涉及到的文件就是基本包含在net下的。
2、sock.c模块部分代码分析
2.3.4 void sk_free(struct sock *sk)
这个函数的作用是释放一个socket,其程序流程及与下层的调用关系如图8
N
Y
N
Y
Y
图8
函数先定义了sk_filte型的指针变量filte,以及module型变量owner,并把sk指向的sk_owner赋给它。然后判断socket是否已经被破坏,如果没有则破坏它;然后把sk指向的sk_filte赋给filte,如果赋值成功则把sk的sk_filte释放,并指向空。而后把socket的时间标志重置。读取sk->sk_omem_alloc的地址的值,如果不为空,则打印。把socket安全的释放,之后把缓冲区释放,分配CPU。
static
inline void sk_filter_release(struct sock *sk, struct sk_filter
*fp)是把socket中的过滤器释放,其中sk是sock型的指针变量,fp是sk_filter型的指针变量。
static
void sock_disable_timestamp(struct sock
*sk)(详细请参照5.3.4)
atomic_read(v)的作用是读取v的值。
static inline void
security_sk_free(struct sock
*sk)是在释放socket前对是否许可释放的检测,允许返回0。
kmem_cache_free(kmem_cache_t *,
void *)是对缓冲区的释放,其中kmem_cache_t *是slab,int优先级。
static inline void
module_put(struct module
*module)的作用为分配谁拥有这一模块,module为module型的指针变量。
2.3.5 void __init sk_init(void)
这个函数的作用是建立发送和接收数据的缓冲区的大小,设定用来发送和接收数据的最大和默认的存储空间大小。其程序流程及与下层的调用关系如图9
N
Y
Y
else if
Y
N
图9
函数首先是建立缓冲区,并把结果赋给sk_cachep,然后判断建立是否成功,不成功则打印,否则判断物理页的大小,如果小于4096则最大与默认的发送接收队列大小都设定为32767,如果物理页大于131072,则把最大的发送队列大小设定为131071。
kmem_cache_create(const
char *, size_t, size_t, unsigned
long,
void (*)(void *, kmem_cache_t *, unsigned
long),
void (*)(void *, kmem_cache_t *, unsigned
long));的作用是建立缓冲区,其中第一个参数是socket的名字,size_t是socket的大小,第三个参数是协议,一般为0,接下去是缓冲区的头指针等。