【C语言】通过socket看系统调用过程

一、通过socket看系统调用过程

在Linux操作系统中,系统调用是用户空间与内核空间之间交互的一种方式。当一个应用程序需要执行操作系统级别的任务时,比如创建一个网络套接字(socket),它必须通过系统调用请求内核来执行这些操作。下面是通过`socket`系统调用从用户空间到内核空间再映射到内核源码的详细过程:

1. 用户空间的API调用:

   用户程序通常会调用glibc(GNU C库,Linux系统上的C标准库)提供的`socket`函数。这个函数定义通常在`<sys/socket.h>`头文件中。

 int sockfd = socket(AF_INET, SOCK_STREAM, 0);

2. 封装成系统调用:

   在glibc中,`socket`函数会封装成一个系统调用。系统调用是通知操作系统核心执行任务的一种机制。每个系统调用都有一个唯一的数字标识符。

   // glibc层面的封装,实际上会经过一些复杂的宏定义和内联函数处理int socket(int domain, int type, int protocol) {return syscall(SYS_socket, domain, type, protocol);}

3. 从用户空间到内核空间的切换:

   根据计算机的体系结构,在用户程序发起系统调用后,会通过一些机制(比如软件中断、陷阱指令或特定的系统调用指令)将控制权转移给内核。这通常涉及到一些寄存器设置系统调用号和参数,然后执行一个中断指令,例如在x86架构中的`int 0x80`或`syscall`指令。

4. 系统调用处理程序:

   内核内部有一个系统调用处理程序,这个处理程序根据传入的系统调用编号识别并分派对应的内核函数进行处理。在x86架构Linux系统中,系统调用入口点通常在`entry_64.s`汇编文件中找到。

5. 内核空间中的函数调用:

   内核将对应的系统调用号映射到具体的内核函数。在内核源码中,这个过程通过一张系统调用表完成,这张表把系统调用号映射到对应的处理函数。`socket`系统调用会最终映射到内核中的`sys_socket`函数。

   // 系统调用号到处理函数的映射可能在一个类似下面的结构中:// sys_socket函数可能在net/socket.c文件中定义SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) {return __sys_socket(family, type, protocol);}

6. 内核函数执行和返回:

   sys_socket会执行必要的操作来创建一个新的socket,这包括分配一个socket结构体并初始化它,以及任何与协议相关的设置。执行完毕后,系统调用处理程序将把结果(比如新创建的socket文件描述符或错误码)返回到用户程序。
以上描述了`socket`函数从用户空间到内核空间的调用过程。需要注意的是,在不同的操作系统、不同的体系结构和不同的内核版本中,这一过程的具体细节可能会有所不同。 

二、EXPORT_SYMBOL(sock_create)/EXPORT_SYMBOL(sock_create_kern)

int sock_create(int family, int type, int protocol, struct socket **res)
{return __sock_create(current->nsproxy->net_ns, family, type, protocol, res, 0);
}
EXPORT_SYMBOL(sock_create);
int sock_create_kern(struct net *net, int family, int type, int protocol, struct socket **res)
{return __sock_create(net, family, type, protocol, res, 1);
}
EXPORT_SYMBOL(sock_create_kern);

在Linux内核中,`sock_create`和`sock_create_kern`函数是用于创建一个新的socket的函数。虽然一个是专为用户空间设计(sock_create),而另一个是专为内核空间设计(sock_create_kern),但它们都最终调用`__sock_create`函数来执行创建socket的实际工作。
下面是每个函数的目的:
1. sock_create:这个函数主要用于用户空间的请求来创建一个新的socket。它接受参数`family`(例如,AF_INET表示IPv4协议),`type`(例如,SOCK_STREAM表示流式套接字),和`protocol`(具体的协议,如TCP或UDP),它还需要一个指向socket结构体指针的指针`res`来存储新创建的socket。`sock_create`通过进程的`nsproxy`字段中的网络命名空间(net_ns)来调用`__sock_create`,并且将 user 标志设置为0,表示这一创建操作来自用户空间。
2. sock_create_kern:与`sock_create`相似,`sock_create_kern`被用于内核空间的socket创建。它也需要相同类型的参数,但是不同的是它接收一个网络命名空间`net`的指针作为其第一个参数,表示socket将属于该网络命名空间,还将`user`标志设置为1,表示这一创建操作来自内核空间。
3. EXPORT_SYMBOL宏:它用于将函数导出,以便这些函数可以被内核的其他模块调用。例如,如果一个内核模块想要创建一个socket,它可以调用`sock_create`或者`sock_create_kern`,前提是这个模块与这些函数定义在同一个内核编译范围内。
最终的创建工作是通过调用`__sock_create`来完成的,它是一个内部函数,不直接暴露给用户空间或其他内核模块。`__sock_create`实际上负责在给定的网络命名空间、地址族、socket类型和协议下分配和初始化一个新的socket。
这是一个非常简化的说明,真正的socket创建过程涉及更多的步骤,例如,分配内存给新的socket,初始化socket结构,以及可能将socket与某些数据结构相关联等等。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2775713.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

dddddddddddddddddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

Linux 36.2@Jetson Orin Nano基础环境构建

Linux 36.2Jetson Orin Nano基础环境构建 1. 源由2. 步骤2.1 安装NVIDIA Jetson Linux 36.2系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 现在流行什么&#xff0c;也跟风来么一个一篇。当然&…

一起玩儿Proteus仿真(C51)——04. 直流电机的启停、加减速和正反转仿真(L298)(二)

摘要&#xff1a;本文介绍PWM信号的产生办法和直流电机的启停、加减速和正反转的仿真程序的编写方法 前边已经介绍了2中生成PWM信号的方法了。那么怎样才能节省一下资源&#xff0c;只使用一个定时器呢&#xff1f;这就是介绍的第三种方法&#xff0c;单定时器中断法生成PWM信号…

多线程JUC:等待唤醒机制(生产者消费者模式)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;多线程&JUC&#xff1a;解决线程安全问题——synchronized同步代码块、Lock锁 &#x1f4da;订阅专栏&#xff1a;多线程&am…

伯克利研究院推出Ghostbuster用于检测由LLM代笔的文本

Ghostbuster的架构&#xff0c;用于检测人工智能生成文本的最先进的新方法 像 ChatGPT 这样的大型语言模型写得非常好&#xff0c;但事实上&#xff0c;它们已经成为一个棘手的问题。学生们已经开始使用这些模型代写作业&#xff0c;导致一些学校禁止 ChatGPT。此外&#xff0c…

RocketMQ客户端实现多种功能

目录 RocketMQ客户端基本流程 消息确认机制 1、消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ 单向发送 同步发送 异步发送 2、消息消费者端采用状态确认机制保证消费者一定能正常处理对应的消息 3、消费者也可以自行指定起始消费位点 广播消息 …

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库&#xff0c;按照以下步骤操作&#xff1a; 构建或安装OSG库 下载OpenSceneGraph源代码&#xff08;如3.0版本&#xff09;并解压。使用CMake配置项目&#xff0c;为Visual Studio生成解决方案文件。通常您需要设置CMake中的…

UE4运用C++和框架开发坦克大战教程笔记(十八)(第55~57集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十八&#xff09;&#xff08;第55~57集&#xff09; 55. UI 进入退出动画HideOther 面板出现时隐藏其他面板添加面板出现和收起的动画效果编写遮罩管理器前的准备 56. 弹窗进入界面57. UI 显示隐藏与遮罩转移完善遮罩管理器 55…

包装效果图为何要用云渲染100?渲染100邀请码1a12

包装效果图能吸引用户注意力&#xff0c;提升销量&#xff0c;随着技术的发展&#xff0c;越来越多的设计师开始使用云渲染来处理效果图&#xff0c;云渲染有什么优势呢&#xff1f;以渲染100为例我来说下。 1、节省时间和成本 渲染100拥有超过10万台的高性能渲染节点&#x…

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候&#xff0c;发现了一个有趣的样本&#xff0c;该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包&#xff0c;对安全研究人员进行窃密与勒索双重攻击&#xff0c;这种双重攻击的方式也是勒索病毒黑客组织常用的…

关节点检测

https://www.bilibili.com/video/BV19g4y1777q/?p2&spm_id_frompageDriver 关节点检测全流程 YOLO:单阶段&#xff0c;快&#xff1b; MMPose&#xff1a;双阶段&#xff0c;准&#xff1b; 标注工具Labelme 用Labelme标注样本数据集

停车场|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)

停车场管理系统目录 目录 基于Springboot的停车场管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;1&#xff09;车位管理 &#xff08;2&#xff09;车位预订管理 &#xff08;3&#xff09;公告管理 &#xff08;4&#…

AVR 328pb ADC基本介绍和使用

AVR 328pb ADC基本介绍和使用 &#x1f4cd;结合参考同架构lgt8f328p中文文档&#xff1a;http://www.prodesign.com.cn/wp-content/uploads/2023/03/LGT8FX8P_databook_v1.0.4.pdf &#x1f4d8;328pb ADC特性 • 10-bit Resolution 10位分辨率 • 0.5 LSB Integral Non-lin…

Java stream 流的基本使用

Java stream 的基本使用 package com.zhong.streamdemo.usestreamdemo;import jdk.jfr.DataAmount; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.ArrayList; import java.util.Comparator; import java.util.Li…

LabVIEW网络测控系统

LabVIEW网络测控系统 介绍了基于LabVIEW的网络测控系统的开发与应用&#xff0c;通过网络技术实现了远程的数据采集、监控和控制。系统采用LabVIEW软件与网络通信技术相结合&#xff0c;提高了系统的灵活性和扩展性&#xff0c;适用于各种工业和科研领域的远程测控需求。 随着…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Linux】Shell编程

Shell编程 目录 Shell编程1.shell基础1.输入重定向 & 输出重定向2.管道3.特殊字符(3.1)通配符(3.2)引号(3.3)注释符(#) 4.别名5.命令历史history 2.Shell脚本Shell脚本的执行方式(1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。(2)sh shell脚本名(…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

深度优先搜索(DFS)与广度优先搜索(BFS):探索图与树的算法

一、引言 在图论和树形结构中&#xff0c;搜索算法是寻找从起点到终点的路径的关键。其中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;是最常用且最基础的两种搜索算法。本文将详细介绍广度优先搜索&#xff08;BFS&#xf…

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信&#xff0c;也可以在以太网通信&#xff0c;有A-1E和Qna-3E两种模式&#xff0c;这两种都是三菱PLC通信协议中比较常用的两种&#xff0c;一般我们使用比较多的是以太网通信&#xff0c;对于FX5U系列/Q系列/Qna系列/L系列的PLC&#xff0c;…