【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://www.mfbz.cn/a/378347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE——数组(1/2)-数组的定义和访问(静态初始化数组、动态初始化数组、案例练习)

目录 数组的定义和访问 静态初始化数组 数组的访问 数组的遍历 案例练习 动态初始化数组 案例练习 数组是什么 数组就是一个容器&#xff0c;用来存储一批同种类型的数据。 例子&#xff1a; 20&#xff0c;10&#xff0c;80&#xff0c;60&#xff0c;90 int[ ] arr …

STM32/C51开发环境搭建(KeilV5安装)

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统&#xff0c;与汇编相比&#xff0c;C语言在功能上、结构性、可读性、可维护性上有明显的优势&#xff0c;因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等…

第59讲订单数据下拉实现

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…

【C++基础入门】七、指针(定义和使用、所占内存空间、空指针和野指针、const关键字修饰指针、指针和数组、指针和函数)

七、指针 7.1 指针的基本概念 指针的作用&#xff1a; 可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 7.2 指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名&#xff1b; 示例&…

统一身份认证系统架构设计与实践总结

随着互联网的快速发展和应用的普及&#xff0c;人们在各个网站和应用上需要不同的账号和密码进行身份认证。为了解决这个问题&#xff0c;统一身份认证系统应运而生。本文将总结统一身份认证系统的架构设计与实践经验&#xff0c;帮助读者了解如何设计和实现一个高效、安全的统…

一、OpenAI API介绍

Open AI API可以应用到任何的业务场景。 文本生成 创造助理 嵌入数据 语音转化 图片生成 图片输入 1. 核心概念 1.1 Text generation models OpenAI 的文本生成模型(通常被称为generative pre-trained transformers 模型简称&#xff1a;GPT),有GPT-4和G…

《学成在线》微服务实战项目实操笔记系列(P1~P83)【上】

史上最详细《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 一、前期准备 1.1 项目介绍 P2 To C面向…

Eclipse 安装使用ABAPGit

Eclipse->Help->Install New software 添加地址 https://eclipse.abapgit.org/updatesite/ 安装完成打开 选择abapGit repositories,先添加仓库 点下图添加自己仓库 如图添加仓库地址 添加完仓库后&#xff0c;点击我的仓库 右键选中行&#xff0c;可以进行push和pu…

代码随想录算法训练营第42天 | 01背包理论基础 416.分割等和子集

01背包理论基础 问题定义&#xff1a;有n件物品和一个能装重量为w的背包&#xff0c;第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i]。每件物品只能用一次&#xff0c;求解将哪些物品装入背包获得的总价值最大。dp数组含义&#xff1a;dp[i][j] 表示从下标为 [0…

springboot基础案例(二)

文章目录 前言一.需求分析: 分析这个项目含有哪些功能模块二.库表设计(概要设计): 1.分析系统有哪些表 2.分析表与表关系 3.确定表中字段(显性字段 隐性字段(业务字段))2.1 创建一个库: ems-thymeleaf2.2 创建 2张表三.编码(环境搭建)1.创建一个springboot项目 项目名字: ems-t…

Ubuntu环境下安装部署Nginx(有网)

本文档适用于在Ubuntu20.04系统下部署nginx 一、使用apt-get命令安装nginx 注&#xff1a;以下命令都是在root用户下使用 1. 检查是否存在apt命令 apt –version 说明&#xff1a;出现版本号就说明当前环境存在apt 2. 更新apt命令 apt update 3. 安装nginx apt-get in…

【保姆级教程|YOLOv8改进】【7】多尺度空洞注意力(MSDA),DilateFormer实现暴力涨点

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Minecraft 上 An Existing Connection Was Forcibly Closed by the Remote Host 错误

本篇文章介绍了使用 Minecraft 时出现远程主机错误强制关闭现有连接的原因和解决方案。 Minecraft 上 Java.IO.IOException: An Existing Connection Was Forcibly Closed by the Remote Host 原因 Minecraft 是一款使用 Java 开发的流行游戏。 由于其流行&#xff0c;服务器…

jxls 2.4.5 —— 动态导出excel 表头与数据

文章目录 前言依赖引入制作导出模板测试类导出效果注意事项 前言 再之前的博客中&#xff0c;介绍了jxls的基础使用。但导出表头属于写死的&#xff0c;并未采取动态渲染。 本次进行动态渲染操作&#xff0c;动态渲染表头和填充数据。 依赖引入 springboot测试项目中&#…

AdaBoost算法

Boosting是一种集成学习方法&#xff0c;AdaBoost是Boosting算法中的一种具体实现。 Boosting方法的核心思想在于将多个弱分类器组合成一个强分类器。这些弱分类器通常是简单的模型&#xff0c;比如决策树&#xff0c;它们在训练过程中的错误会被后续的弱分类器所修正。Boosti…

多元回归分析:理论与应用

多元回归分析是一种统计方法&#xff0c;用于研究两个或多个自变量&#xff08;解释变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关系。这种分析允许研究者评估多个因素对结果变量的影响&#xff0c;是社会科学、经济学、生物医学和工程等多个领域中常…

SolidWorks学习笔记——入门知识1

目录 1、固定最近文档 2、根据需要自定义菜单栏 3、根据需要增添选项卡 4、命令搜索框 5、鼠标右键长按快速切换视图 6、鼠标笔势 自定义鼠标笔势 1、固定最近文档 图1 固定最近文档 2、根据需要自定义菜单栏 图2 根据需要自定义菜单栏 3、根据需要增添选项卡 图3 根据…

Linux介绍和命令使用

目录 目录 一、Linux简介 1.1 主流操作系统 1.2 Linux 发展历史 1.3 Linux系统版本 二、Linux安装 三、Linux 目录结构 四、Linux常用命令 4.1 基础常用命令说明 4.2 Linux 命令使用技巧 4.3 Linux 命令格式 4.4 进阶重点常用命令 4.4.1 拷贝移动命令 4.4.2 打包…

09 AB 10串口通信发送原理

通用异步收发传输器&#xff08; Universal Asynchronous Receiver/Transmitter&#xff0c; UART&#xff09;是一种异步收发传输器&#xff0c;其在数据发送时将并行数据转换成串行数据来传输&#xff0c; 在数据接收时将接收到的串行数据转换成并行数据&#xff0c; 可以实现…

springboot项目热部署实现(Spring Boot DevTools方式)

文章目录 Spring Boot DevTools简介Spring Boot DevTools原理spring Boot Devtools优缺点Spring Boot DevTools集成步骤第一步&#xff1a;添加maven依赖第二步&#xff1a;IDEA热部署配置 Spring Boot DevTools简介 Spring Boot DevTools是Spring Boot提供的一个开发工具&…
最新文章