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

news2024/11/15 20:09:56

一、通过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.coloradmin.cn/o/1439638.html

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

相关文章

SQL在云计算中的新角色:重新定义数据分析

文章目录 1. 云计算与数据分析的融合2. SQL在云计算中的新角色3. 分布式SQL查询引擎4. SQL-on-Hadoop解决方案5. SQL与其他数据分析工具的集成6. 实时数据分析与SQL7. SQL在云数据仓库中的角色8. 安全性与隐私保护9. SQL的未来展望《SQL数据分析实战&#xff08;第2版&#xff…

Snipaste使用

今天推荐一款好用的截图、贴图软件工具&#xff0c;名字叫Snipaste&#xff0c;以下是官方介绍的截图 软件官方下载地址&#xff1a; Snipaste 下载 1、截图功能 2、标注 3、开发中的使用 有时候在开发中需要临时把一些任务规则信息&#xff0c;放在代码编辑器旁边进行参考&am…

蓝桥杯每日一解

可以看看a的ascii码为6532 而A为ascii码为65&#xff0c;大小写相差32位 #include <iostream>using namespace std; int main(){int n;cin >> n;char a;for (int i 1;i<n;i){while(scanf("%c",&a) ! EOF){//无限输入直到输入到空格if(a a || a …

【多模态大模型】GLIP:零样本学习 + 目标检测 + 视觉语言大模型

GLIP 核心思想GLIP 对比 BLIP、BLIP-2、CLIP 主要问题: 如何构建一个能够在不同任务和领域中以零样本或少样本方式无缝迁移的预训练模型&#xff1f;统一的短语定位损失语言意识的深度融合预训练数据类型的结合语义丰富数据的扩展零样本和少样本迁移学习 效果 论文&#xff1a;…

OpenShift AI - 运行欺诈检测模型和流程

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 2.50 的环境中验证 文章目录 准备运行环境安装 OpenShift AI 环境安装 Minio 对象存储软件创建 Data Science Project创建 Data connection创建 Workbench配置 Model server创建 …

python调用golang中函数方法

一、原因说明&#xff1a;由于simhash方法有多种实现方式&#xff0c;现python中simhash方法与golang中的不一样&#xff0c;需要两者代码生成结果保持一致&#xff0c;故采用python中的代码调用golang编译的so文件来实现。 环境配置&#xff1a;①Windows10系统要有gcc环境&a…

【Git版本控制 03】远程操作

目录 一、克隆远程仓库 二、推送远程仓库 三、拉取远程仓库 四、忽略特殊文件 五、命令配置别名 一、克隆远程仓库 Git是分布式版本控制系统&#xff0c;同⼀个Git仓库&#xff0c;可以分布到不同的机器上。怎么分布呢&#xff1f; 找⼀台电脑充当服务器的⻆⾊&#xff…

幻方(Magic Square)

幻方&#xff08;Magic Square&#xff09; 幻方概述 什么是幻方呢&#xff1f;幻方&#xff08;Magic Square&#xff09;就是指在nn&#xff08;n行n列&#xff09;的方格里填上一些连续的数字&#xff0c;使任意一行、任意一列和对角线上的数字的和都相等。例如有33的3行3…

【操作系统】MacOS虚拟内存统计指标

目录 命令及其结果 参数解读 有趣的实验 在 macOS 系统中&#xff0c;虚拟内存统计指标提供了对系统内存使用情况和虚拟内存操作的重要洞察。通过分析这些指标&#xff0c;我们可以更好地了解系统的性能状况和内存管理情况。 命令及其结果 >>> vm_stat Mach Virtu…

电力负荷预测 | 基于TCN的电力负荷预测(Python)———数据预处理

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 基于TCN的电力负荷预测(Python) python3.8 keras2.6.0 matplotlib3.5.2 numpy1.19.4 pandas1.4.3 tensorflow==2.6.0

电赛相关——自制模块1

目录 一、双电源供电 原理图 PCB 仿真图 制板文件 二、单电源供电 原理图 PCB 仿真图 制板文件 该模块使用一个双运放&#xff0c;实现对输入信号改变幅度&#xff08;放大或衰减&#xff0c;可调节&#xff0c;索性叫它变幅器吧&#xff09;以及隔离缓存&#xff08…

一文读懂转融通

最近多家公司都在讲解关于转融通要求。今天我们就来详细聊聊&#xff01; 转融通是一种证券借贷机制&#xff0c;它允许机构投资者在融资融券交易中借入或借出证券。 具体来说&#xff0c;机构投资者可以向券商借入证券&#xff0c;或者将持有的证券借给券商&#xff0c;以扩大…

Golang 基础 Go Modules包管理

Golang 基础 Go Modules包管理 在 Go 项目开发中&#xff0c;依赖包管理是一个非常重要的内容&#xff0c;依赖包处理不好&#xff0c;就会导致编译失败&#xff0c;本文将系统介绍下 Go 的依赖包管理工具。 我会首先介绍下 Go 依赖包管理工具的历史&#xff0c;并详细介绍下…

EMQX Enterprise 5.3 发布:审计日志、Dashboard 访问权限控制与 SSO 一站登录

EMQX Enterprise 5.3.0 版本已正式发布&#xff01; 新版本带来多个企业特性的更新&#xff0c;包括审计日志&#xff0c;Dashboard RBAC 权限控制&#xff0c;以及基于 SSO&#xff08;单点登录&#xff09;的一站式登录&#xff0c;提升了企业级部署的安全性、管理性和治理能…

docker proxy 【docker 代理】

第一种 创建代理配置文件 mkdir -p /etc/systemd/system/docker.service.d/ cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf Environment"HTTP_PROXYhttp://192.168.21.101:7890" Environment"HTTPS_PROXYhttp://192.168.21.1…

IP定位技术助力打击网络欺诈

随着网络技术的飞速发展&#xff0c;网络欺诈行为也呈现出愈发猖獗的态势。然而&#xff0c;在这个数字化世界中&#xff0c;IP定位技术正逐渐崭露头角&#xff0c;成为打击网络欺诈的一大利器。本文将从多个方面探讨如何利用IP定位技术解决网络欺诈问题。 IP地址定位技术的基本…

寒假作业-day5

1>现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 代码&#xff1a; #include<stdio.h&g…

MPLS VPN功能组件

VPN实例 VPN实例即为VPN路由转发表VRF&#xff0c;不同VPN之间的路由隔离通过VPN实例实现&#xff0c;PE上存在多个路由转发表&#xff0c;包括一个公网路由转发表&#xff0c;以及一个或多个VPN路由转发表。 PE为每个直接相连的Site建立并维护专门的VPN实例&#xff0c;VPN实…

C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)

仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver&#xff0c;分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手&#xff0c;网络上有很多资源&#xff0c;我在这里采用的是微软商店中的TCP/UDP网络调试助手&#xff0…

Qt Windows和Android使用MuPDF预览PDF文件

文章目录 1. Windows MuPDF编译2. Android MuPDF编译3. 引用 MuPDF 库4. 解析本地PDF文件 1. Windows MuPDF编译 使用如下命令将MuPDF的源码克隆到本地 git clone --recursive git://git.ghostscript.com/mupdf.git直接用VS&#xff0c;打开 mupdf/platform/win32/mupdf.sln …