关于socket在Linux下系统调用的分析

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

asmlinkage long sys_socket(int, int, int);

系统调用函数必须满足:

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

2.在arch/arm/include/asm,unistd.h中,将sys_socket系统调用和系统调用好关联起来

#define __NR_socket 97

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

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

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

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

肯定这就是asmlinkage long sys_socket(int,int,int)的实现了。为了表明这一切,需要进一步查看宏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_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

4.

分析了系统是如何定义和实现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函数,来创建socket。sock_map_fd是得到一个文件号。

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

原文地址:https://www.cnblogs.com/buzhidao1/p/11984888.html

时间: 2024-11-14 12:39:42

关于socket在Linux下系统调用的分析的相关文章

Linux下apache日志分析与状态查看方法

假设apache日志格式为:118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)” 问题1:在apachelog中找出访问次数最多的10个IP.awk '{print $1}

linux下编译原理分析

linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就可以运行:在这个简单的命令后面隐藏了许多复杂的过程,这个过程包括了下面的步骤: ====================================================================================== 预处理: 宏定义展开,所有的#define 在这个阶段都会被展开 预编译命令的处理,包括#if #ifdef 一类的命令 展开#include 的文件,像上面h

Linux 下 apache 日志分析与状态查看[转]

假设apache日志格式为: 118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)” 问题1:在apachelog中找出访问次数最多的10个IP. awk '{print $

文件编程之Linux下系统调用

说明: linux下文件编程可使用两种方法: ****linux系统调用 ****C语言库函数 前者依赖于linux系统,后者与操作系统是独立的. 在任何操作系统下,使用C语言库函数操作文件的方法都是相同的. 这里首先记录下Linux下系统调用操作文件编程的学习过程.函数原型: 1.系统调用--创建: int create(const char *filename, mode_t mode); filename为要创建的文件名(包含路径,缺省为当前路径): mode为创建模式. 模式可用数字来表

linux下系统调用、API、系统命令,内核函数的区别与联系

1.系统调用: 应用程序和内核间的桥梁,是应用程序访问内核的入口点;但通常情况下,应用程序通过操作系统提供的API进行编程而不是使用系统调用直接编程; linux的全部系统调用加起来大约只有250个左右. 2.API: API常以c库(libc)的形式提供,c库提供了绝大部分API,每个系统调用在c库中都有对应的封装函数(通常封装函数与系统调用的名称相同).系统调用与c库函数并不是一一对应的,有些c库函数可能使用多个系统调用来实现,也有可能多个c库函数使用同一个系统调用来实现,也有些c库函数不使

Linux 下系统调用的三种方法

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数.下面介绍Linux 下三种发生系统调用的方法: 通过 glibc 提供的库函数 glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库.glibc 为程序员提供丰富的 API(Application Programming Interfac

将javaweb项目部署到linux下的详细分析

以下是对将javaweb项目部署到linux下的方法进行了详细的分析介绍,需要的朋友可以过来参考下一般都在windows下开发的,现在部署到linux下:1,将项目达成war包(用eclipse,项目右键–>Export–>选择war file)2,将tomcat(用winSCP当然你也可以用secureCRT,用securCRT需要建立sftp(即上传文件的目录),用put tomcat命令)考到ilunx对应的目录下3,然后将项目的war包放到tomcat的webapps目录下4,启动to

Linux下栈帧分析

我们知道C语言中,每个栈帧对应着一个未运行完的函数.栈帧中保存了该函数的返回地址和局部变量.栈帧也叫过程活动记录,是编译器用来实现函数调用的一种数据结构.那么在Linux下gcc编译器栈帧是怎么实现的呢? 首先来看下面这段代码: 这段代码的运行结果是会导致虚拟机重启.通过代码可以看到我们在fun函数中写了让系统重启的代码然而我们在main函数中并没有调用fun函数,却仍旧导致了系统重启. 首先要我们知道栈是从高地址向低地址生长的,每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需

Linux 下蓝牙bluez分析及使用 (1)

蓝牙耳机的使用 由于Linux下蓝牙使用不及Windows下直观,致使使用时会出现一些小问题.虽然是小问题,但是由于普通的操作都具有顺序性,前面的中断了,后面的哪怕再简单,也无法继续了.正好近期工作与蓝牙与网络都有关,可以有时间和目标好好学习一下.闲话少说,进入正题.我使用的Fedora 9, bluez的版本是 |-- bluez-gnome-0.26-1.fc9.i386.rpm|-- bluez-gnome-analyzer-0.26-1.fc9.i386.rpm|-- bluez-gno