当前位置: 首页 > news >正文

Linux系统调用

文章目录

    • 系统调用和POSIX标准
    • 系统调用表
    • 程序直接访问系统调用
    • 新增系统调用

在linux中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图:
在这里插入图片描述

系统内调用层主要作用:

  • 为用户空间程序提供一层硬件抽象接口。
  • 保证系统稳定和安全,应用陈续访问内核必须通过系统调用层,那么内核可以在系统调用层对应用的访问权限、用户类型和其他一些规则进行过滤。
  • 可移植性,可以让应用程序在不修改源代码的情况下,重新编辑便可在不同操作系统或不同架构系统上运行。

系统调用和POSIX标准

一般来说,应用程序调用用户空间实现的编程接口来编程,而不是直接调用系统调用。一个API接口函数可以由一个系统调用实现,也可以由多个系统调用实现,或者完全不由系统调用实现。因此,一个API接口和特定的系统调用之间并无对应关系。

在UNIX世界中,最通用的系统调用层接口是POSIX(Portable Operating System Interface of UNIX)标准。POSIX标准针对的是API而不是系统调用,判断一个系统是否与POSIX兼容,要看它是否提供一组合适的应用编程接口,而不是看它的系统调用是如何定义和实现的。

Linux操作系统中的API接口通常是以C 标准库的方式提供,比如libc库。C库中提供了POSIX的绝大部分的API实现,同时也为内核提供的系统调用封装了相应的函数。

系统调用表

Linux系统为每个系统调用赋予了一个系统调用号,系统调用号一旦分配之后就不会有任何变更,否则编译好的应用程序就不能运行了。
在x86_64上,其系统调用号定义在arch/x86/include/generated/uapi/asm/unistd_64.h:

#ifndef _UAPI_ASM_UNISTD_64_H
#define _UAPI_ASM_UNISTD_64_H#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
...
#define __NR_memfd_secret 447
#define __NR_process_mrelease 448
#define __NR_futex_waitv 449
#define __NR_set_mempolicy_home_node 450
#define __NR_cachestat 451
#define __NR_fchmodat2 452
#define __NR_map_shadow_stack 453#ifdef __KERNEL__
#define __NR_syscalls 454
#endif#endif /* _UAPI_ASM_UNISTD_64_H */

以open为例,其系统调用号为2,open函数最终的实现在fs/open.c

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{if (force_o_largefile())flags |= O_LARGEFILE;return do_sys_open(AT_FDCWD, filename, flags, mode);
}

SYSCALL_DEFINE*是一组专门用来定义系统调用的宏,其实现在include/linux/syscalls.h

#ifndef SYSCALL_DEFINE0
#define SYSCALL_DEFINE0(sname)					\SYSCALL_METADATA(_##sname, 0);				\asmlinkage long sys_##sname(void);			\ALLOW_ERROR_INJECTION(sys_##sname, ERRNO);		\asmlinkage long sys_##sname(void)
#endif /* SYSCALL_DEFINE0 */#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__)#define SYSCALL_DEFINE_MAXARGS	6#define SYSCALL_DEFINEx(x, sname, ...)				\SYSCALL_METADATA(sname, x, __VA_ARGS__)			\__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

__SYSCALL_DEFINEx宏最后会扩展成__do_sys_open函数(在6.6.69版本是这样,较早的版本则不是,这个不是固定的)。

程序直接访问系统调用

可以通过syscall函数来直接访问系统调用而不需要通过C 标准库函数。

#define _GNU_SOURCE         /* See feature_test_macros(7) */#include <unistd.h>#include <sys/syscall.h>   /* For SYS_xxx definitions */long syscall(long number, ...);

下面测试下用syscall直接调用open系统调用:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <fcntl.h>int main(int argc, char *argv[])
{int fd = syscall(SYS_open, "/tmp/call.log", O_CREAT);return 0;
}

运行程序后,可以看到成功创建了/tmp/call.log这个临时文件。

新增系统调用

Linux系统的系统调用必须由Linux社区来决定,并且和glibc社区同步,总之这个过程一般会很漫长。
为了实现用户程序和内核进行信息交互,除了系统调用,还可以使用下面的方法:

  • 设备节点。实现一个设备节点后,就可以对设备进行I/O操作了,也可以通过ioctl接口自定义一些操作
  • sysfs接口,可以让用户程序和内核直接通信,这种方式比较灵活,是linux内核推荐的方法

相关文章:

Linux系统调用

文章目录 系统调用和POSIX标准系统调用表程序直接访问系统调用新增系统调用 在linux中&#xff0c;内核空间和用户空间之间增加了一个中间层——系统调用层&#xff0c;如下图&#xff1a; 系统内调用层主要作用&#xff1a; 为用户空间程序提供一层硬件抽象接口。保证系统稳定…...

如何在Servlet容器中使用HttpServletResponse?

HttpServletResponse 是 Java Servlet API 中的一个接口&#xff0c;它代表了服务器对客户端的响应。通过 HttpServletResponse 对象&#xff0c;可以设置响应的状态码、发送数据到客户端&#xff08;如 HTML 页面、文件等&#xff09;、添加响应头信息等。下面是如何在 Servle…...

SpringCloud - Seata 分布式事务

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://seata.apache.org/zh-cn/ Seata …...

Ansible批量配置服务器免密登录步骤详解

一、准备工作 192.168.85.138 安装ansible&#xff0c;计划配置到139的免密 192.168.85.139 待配置免密 1. 生成SSH密钥对 在Ansible控制节点生成密钥对&#xff0c;用于后续免密认证&#xff1a; ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa 全部回车默认&#xff0c;无…...

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 …...

人工智能时代下ai智能语音机器人如何以假乱真?

智能语音机器人若要达到以假乱真的效果&#xff0c;需要在以下几个关键方面不断提升&#xff1a; 一、语音合成技术 音色模拟 多维度采样 对大量真人语音样本进行多维度采样&#xff0c;包括不同年龄、性别、地域的人的语音。例如&#xff0c;采集不同年龄段男性从低沉到清亮…...

【橘子ES】Aggregations 聚合准备

一、聚合的概念 聚合文档 聚合区别于检索&#xff0c;检索是使用一系列条件把文档从es中搜索回来。但是聚合则是在搜索回来的文档的基础上进一步进行处理。 简单来说聚合就是将数据汇总为指标、统计数据或其他分析。聚合可以解决以下几类问题&#xff1a; 我的网站的平均加载…...

vue3读取webrtc-stream 视频流

一.首先下载webrtc-stream&#xff0c;方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后&#xff0c;启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…...

springcloud集成gateway

本篇文章只介绍gateway模块的搭建步骤&#xff0c;并无gateway详细介绍 gateway详解请查看&#xff1a;SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇&#xff1a; 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…...

2025常用的SEO工具有哪些?

在互联网时代&#xff0c;如何让自己的网站或内容脱颖而出&#xff0c;成为许多企业和个人站长们最关注的问题。而在这个过程中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;作为一种有效的提升网站曝光度和吸引流量的手段&#xff0c;已经成为了网站运营的核心之一。对…...

C++类和对象进阶:运算符重载深度详解

C类和对象进阶&#xff1a;运算符重载 前言引入运算符重载定义语法注意事项重载为全局函数重载为成员函数运算符重载的本质 默认赋值运算符重载(默认成员函数)编译器自己生成的赋值运算符重载函数需要自己实现的场景总结默认赋值运算符重载 拷贝构造函数和赋值重载的区分验证 总…...

Mybatisplus——Mybatisplus3.5.2版本使用Page分页插件查询,records有数据但是total显示0

目录 一、问题背景 debug 执行Mybatisplus使用Page分页插件查询时&#xff0c;发现 Page 里面的records有数据但是total显示0。 二、问题产生的原因 未配置MybatisPlus的分页插件拦截器导致的或者因mybatis-plus版本3.4或3.5版本导致原先的分页插件paginationInterceptor无法…...

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...

AI使用场景简单测试

前言 今天来分享下AI的2个实用场景&#xff0c;我这里是使用的博主&#xff1a;小虚竹&#xff0c;搭建的AI服务&#xff0c;用的ChatGPT 4O模型&#xff0c;主要是试了3个场景&#xff0c;服装设计、直播带货话术、检验报告分析。 一、服装设计 对于最后需要的裁片设计上的尺寸…...

Linux 配置 MySQL 定时自动备份到另一台服务器

Linux 配置 MySQL 定时自动备份到另一台服务器 前言1、配置服务器通信1.1&#xff1a;配置过程 2、编写自动备份sh脚本文件3&#xff1a;设置定时自动执行 前言 此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件&#xff0c;然后将文件同步到另一…...

PostgreSQL 备库的延迟问题

目录标题 1. 查看主备状态计算方式&#xff1a;实际情况&#xff1a;举个例子&#xff1a; 2. 查看历史状态3. 分析日志文件4. 查看数据库层面的复制状态5. 检查活动事务6. 检查系统资源7. 检查网络状况8. 检查复制槽状态9. 检查未提交的两阶段事务 要排查 PostgreSQL 备库的延…...

力扣-二叉树-226 翻转二叉树

思路 利用递归的思路 代码 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(root nullptr){return root;}swap( root->right, root->left);invertTree(root->left);invertTree(root->right);return root;} };...

基于SpringBoot的在线车辆租赁信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的不断发展和人们生活水平的提高&#xff0c;汽车租赁行业迎来了前所未有的发展机遇。传统的汽车租赁方式往往存在流程繁琐、信息不透明等问题&#xff0c;难以满足现代消费者对于便捷、高效服务的需求。因此&…...

掌握 systemd:Linux 服务管理的核心工具

1. 什么是 systemd&#xff1f; 定义&#xff1a;systemd 是 Linux 系统的初始化系统&#xff08;init system&#xff09;和服务管理器&#xff0c;用于替代传统的 SysVinit。核心目标&#xff1a; 加速系统启动&#xff08;并行化任务&#xff09;。统一管理服务、日志、挂载…...

【信息系统项目管理师-案例真题】2019下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题 1】(6 分)【问题 2‍ 】(8 分)【问题 3‍ 】(11 分)试题二【问题 1】‍(5分)【问题 2】‍ (14 分)【问题 3‍ 】(6 分)试题三【问题 1】(8 分)【问题 2‍ 】(6 分)【问题 3】‍ (8 分)【问题 4‍ …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...