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中,内核空间和用户空间之间增加了一个中间层——系统调用层,如下图: 系统内调用层主要作用: 为用户空间程序提供一层硬件抽象接口。保证系统稳定…...
如何在Servlet容器中使用HttpServletResponse?
HttpServletResponse 是 Java Servlet API 中的一个接口,它代表了服务器对客户端的响应。通过 HttpServletResponse 对象,可以设置响应的状态码、发送数据到客户端(如 HTML 页面、文件等)、添加响应头信息等。下面是如何在 Servle…...
SpringCloud - Seata 分布式事务
前言 该博客为Sentinel学习笔记,主要目的是为了帮助后期快速复习使用 学习视频:7小快速通关SpringCloud 辅助文档:SpringCloud快速通关 源码地址:cloud-demo 一、简介 官网:https://seata.apache.org/zh-cn/ Seata …...
Ansible批量配置服务器免密登录步骤详解
一、准备工作 192.168.85.138 安装ansible,计划配置到139的免密 192.168.85.139 待配置免密 1. 生成SSH密钥对 在Ansible控制节点生成密钥对,用于后续免密认证: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa 全部回车默认,无…...
互联网大厂中面试的高频计算机网络问题及详解
前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 …...
人工智能时代下ai智能语音机器人如何以假乱真?
智能语音机器人若要达到以假乱真的效果,需要在以下几个关键方面不断提升: 一、语音合成技术 音色模拟 多维度采样 对大量真人语音样本进行多维度采样,包括不同年龄、性别、地域的人的语音。例如,采集不同年龄段男性从低沉到清亮…...
【橘子ES】Aggregations 聚合准备
一、聚合的概念 聚合文档 聚合区别于检索,检索是使用一系列条件把文档从es中搜索回来。但是聚合则是在搜索回来的文档的基础上进一步进行处理。 简单来说聚合就是将数据汇总为指标、统计数据或其他分析。聚合可以解决以下几类问题: 我的网站的平均加载…...
vue3读取webrtc-stream 视频流
一.首先下载webrtc-stream,方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后,启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…...
springcloud集成gateway
本篇文章只介绍gateway模块的搭建步骤,并无gateway详细介绍 gateway详解请查看:SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇: 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…...
2025常用的SEO工具有哪些?
在互联网时代,如何让自己的网站或内容脱颖而出,成为许多企业和个人站长们最关注的问题。而在这个过程中,SEO(搜索引擎优化)作为一种有效的提升网站曝光度和吸引流量的手段,已经成为了网站运营的核心之一。对…...
C++类和对象进阶:运算符重载深度详解
C类和对象进阶:运算符重载 前言引入运算符重载定义语法注意事项重载为全局函数重载为成员函数运算符重载的本质 默认赋值运算符重载(默认成员函数)编译器自己生成的赋值运算符重载函数需要自己实现的场景总结默认赋值运算符重载 拷贝构造函数和赋值重载的区分验证 总…...
Mybatisplus——Mybatisplus3.5.2版本使用Page分页插件查询,records有数据但是total显示0
目录 一、问题背景 debug 执行Mybatisplus使用Page分页插件查询时,发现 Page 里面的records有数据但是total显示0。 二、问题产生的原因 未配置MybatisPlus的分页插件拦截器导致的或者因mybatis-plus版本3.4或3.5版本导致原先的分页插件paginationInterceptor无法…...
C#(Winform)通过添加AForge添加并使用系统摄像机
先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...
AI使用场景简单测试
前言 今天来分享下AI的2个实用场景,我这里是使用的博主:小虚竹,搭建的AI服务,用的ChatGPT 4O模型,主要是试了3个场景,服装设计、直播带货话术、检验报告分析。 一、服装设计 对于最后需要的裁片设计上的尺寸…...
Linux 配置 MySQL 定时自动备份到另一台服务器
Linux 配置 MySQL 定时自动备份到另一台服务器 前言1、配置服务器通信1.1:配置过程 2、编写自动备份sh脚本文件3:设置定时自动执行 前言 此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件,然后将文件同步到另一…...
PostgreSQL 备库的延迟问题
目录标题 1. 查看主备状态计算方式:实际情况:举个例子: 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的在线车辆租赁信息管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的不断发展和人们生活水平的提高,汽车租赁行业迎来了前所未有的发展机遇。传统的汽车租赁方式往往存在流程繁琐、信息不透明等问题,难以满足现代消费者对于便捷、高效服务的需求。因此&…...
掌握 systemd:Linux 服务管理的核心工具
1. 什么是 systemd? 定义:systemd 是 Linux 系统的初始化系统(init system)和服务管理器,用于替代传统的 SysVinit。核心目标: 加速系统启动(并行化任务)。统一管理服务、日志、挂载…...
【信息系统项目管理师-案例真题】2019下半年案例分析答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题 1】(6 分)【问题 2 】(8 分)【问题 3 】(11 分)试题二【问题 1】(5分)【问题 2】 (14 分)【问题 3 】(6 分)试题三【问题 1】(8 分)【问题 2 】(6 分)【问题 3】 (8 分)【问题 4 …...
腾讯云主机部署Kali Linux:从零自制镜像到一键重装实战
1. 为什么要在腾讯云上部署Kali Linux? Kali Linux作为安全测试领域的瑞士军刀,集成了600渗透测试工具,从Wireshark到Metasploit应有尽有。但直接在物理机安装会面临驱动兼容性、系统稳定性等问题,而云主机部署既能保留完整功能&…...
MentalLLaMA:基于指令微调的可解释心理健康分析大模型实践
1. 项目概述:MentalLLaMA——一个面向社交媒体心理健康分析的指令微调大语言模型 如果你正在关注大语言模型在垂直领域的应用,特别是如何让AI模型在理解人类复杂情感和心理状态时,不仅能“判断”,还能“解释”,那么这个…...
Pangolin GUI实战:给你的C++机器人仿真程序加个带按钮和滑块的3D控制面板
Pangolin GUI实战:为C机器人仿真构建3D交互控制面板 在机器人算法开发过程中,仿真验证是不可或缺的环节。传统方式下,开发者往往需要反复修改代码参数或通过命令行调整变量,这种"编码-编译-运行"的循环效率低下…...
Efficient-KAN:突破传统神经网络瓶颈的Kolmogorov-Arnold网络实战指南
Efficient-KAN:突破传统神经网络瓶颈的Kolmogorov-Arnold网络实战指南 【免费下载链接】efficient-kan An efficient pure-PyTorch implementation of Kolmogorov-Arnold Network (KAN). 项目地址: https://gitcode.com/GitHub_Trending/ef/efficient-kan 深…...
自建S3兼容对象存储:Shebe部署、集成与运维全指南
1. 项目概述:一个面向开发者的开源文件存储与分发解决方案最近在折腾个人项目,需要处理用户上传的图片、文档,还要能快速分发到前端展示。自己搭存储服务吧,从对象存储到CDN,配置起来一堆事儿,用第三方云服…...
sed文本处理实战:从基础语法到高阶场景解析
1. 为什么你需要掌握sed? 第一次接触sed时,我也觉得这个命令行工具看起来晦涩难懂。直到有次需要处理一个500MB的日志文件,用文本编辑器直接打开卡死,用Excel根本加载不了,这时候sed只用一行命令就搞定了数据清洗&…...
告别ifconfig:用ubus命令玩转OpenWrt网络接口(netifd实战指南)
告别ifconfig:用ubus命令玩转OpenWrt网络接口(netifd实战指南) 在OpenWrt的世界里,网络接口管理一直是个既基础又关键的课题。传统Linux用户习惯使用ifconfig或ip命令来配置网络,但在OpenWrt环境下,这些工具…...
告别Surface“幽灵触控”:从现象溯源到一劳永逸的修复指南
1. 什么是Surface"幽灵触控"? 如果你正在使用Surface设备,突然发现屏幕某个区域莫名其妙地自动点击,或者部分触控功能完全失灵,恭喜你遇到了传说中的"幽灵触控"问题。这个现象最早在Surface Pro 4上被大量报告…...
BlueArchive-Cursors:为你的Windows桌面注入二次元灵魂
BlueArchive-Cursors:为你的Windows桌面注入二次元灵魂 【免费下载链接】BlueArchive-Cursors Custom mouse cursor theme based on the school RPG Blue Archive. 项目地址: https://gitcode.com/gh_mirrors/bl/BlueArchive-Cursors 还在使用Windows默认的单…...
AI智能体视觉(TVA)实战教程(1)
重磅预告:本专栏将独家连载新书《AI视觉技术:从入门到进阶》精华内容。本书是《AI视觉技术:从进阶到专家》的权威前导篇,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“AI教…...
