linux系统调用原理分析

Linux中mmap系统调用的原理分析与实现 mmap系统调用是Linux中一个强大的内存映射机制,它允许进程将文件或设备映射到其地址空间,实现了文件和内存之间的高效交互。mmap系统调用是Linux操作系统中一个重要的内存映射机制,它允许进程将文件或设备映射到其地址空间,从而实现文件和内存之间的高效交互。mmap系统调用的目的是将一个文件或设备的内容映射到进程的虚拟地址空间中,使得进程可以像访问内存一样访问文件或设备。下面是一个简单的C语言示例代码,演示了如何使用mmap系统调用将文件映射到内存中,并通过指针访问文件的内容。 阅读详情

写这篇文章是看到一个as汇编器里编写的汇编代码,有一个指令int 80h没有搞懂,然后自己查资料发现不少东西,本文旨在浅显的分析linux的系统调用,主要是linux0.12内核来说!

目前操作系统内核的结构模式主要分为整体式的单内核和层次式的微内核模式。而0.12内核是单内核模式。在单内核模式的系统中,操作系统提供服务的流程:应用程序使用指定的参数值执行系统调用指令(int 80h),使CPU从用户态切换到内核态,然后操作系统根据具体的参数值调用特定的服务程序,而这些服务程序则根据需要再调用底层的一些支持函数以完成特定的功能。在完成了应用程序要求的服务之后,操作系统又降CPU从核心态切换回用户态,从而返回到应用程序中继续执行后面的指令。因此概要的讲,单内核模式的内核分为3个层次:调用服务的应用程序、执行系统调用的服务层、支持系统调用的底层函数。

1.系统调用接口

系统调用(通常称为syscalls)接口是Linux内核和上层应用程序进行交互通信的唯一接口。应用程序、库函数和内核系统调用的关系如下:

用户程序通过直接或间接(通过库函数)调用中断int 0x80,并在寄存器eax中指定系统调用功能号,即可使用内核资源,包括系统硬件资源。不过通常应用程序都是使用具有标准接口定义的C函数库中的函数间接地使用内核的系统调用。通常,系统调用使用函数形式进行调用,因此可以带有一个或者多个参数。对于系统调用执行的结果,它会在返回值中表示出来。

在Linux内核中,每个系统调用都有一个唯一的系统调用功能号。这些功能号定义在include/unistd.h。例如write系统调用的功能号是4,定义为符号__NR_write。这些系统调用功能号实际上对应于include/linux/sys.h中定义的系统调用处理程序指针数组表sys_call_table[]中项的索引。因此write系统调用用的处理程序指针就位于该数组的第四项。

当我们想在自己的程序中使用这些系统调用符号,需要像下面所示在包括文件<unistd.h>之前定义符号_LIBRARY。另外我们从sys_call_table[]中可以看出,内种中所有系统调用处理函数的名称基本上都是以符号sys_开始的。例如系统调用read在内核源码中实现函数是sys_read()。

2.系统调用处理过程

当应用程序经过库函数向内核发出一个中断调用int 0x80时,就开始一个系统调用。其中寄存器eax中存放着系统调用号(比如调用write,eax就存储4),而携带的参数一次放在寄存器ebx(第一个参数)、ecx(第二个参数)、edx(第二个参数)中,因此Linux0.12内核中用户程序可以向内核最多传递3个参数,当然也可以不带参数。处理系统调用中断0x80的过程是在程序kernel/system_call.s中的system_call。

为了方便执行系统调用,内核源码在include/unistd.h文件中定义了宏函数_syscalln(),其中n代表携带参数的个数,可以是0-3。

例如对于read()系统调用,其定义是int read(int fd,char *buf,int n)

若在用户程序中直接执行对应的系统调用,那么该系统调用的宏的形式如下:

#define _LIBRARY_

#include<unistd.h>

_syscall3(int,read,int,fd,char*,buf,int,n)

因此,我们可以在用户程序中直接使用上面的_syscall3()来执行一个系统调用read(),而不用通过C函数库作中介。实际上,C函数库中函数最终调用的形式和这里给出的完全一样。这里我们看到,每个系统调用宏都有2+2*n个参数,第一个参数对应返回值类型,第二个参数是系统调用的名称,随后是系统调用所携带参数的类型和名称,这个宏会被扩展成包含内嵌汇编的c函数,如下所示:

int read(int fd,char *buf,int n)
{
	long __res;
	__asm__ volatile(
		"int $0x80"
		:"=a" (__res)
		:"0" (__NR_read),"b" ((long)(fd),"c" ((long)(buf),"d" ((long)(n)));
		if(__res>=0)
			return int __res;
		errno=-__res;
		return -1;
}

可以看出这个宏经过展开就是一个读系统调用的具体实现。其中使用嵌入式汇编语法以功能号__NR_read(3)执行了Linux系统中断调用0x80。该中断调用在eax(__res)寄存器中返回了实际读取的字节数。

可以看出,这个宏经过展开就是一个读操作系统调用的具体实现。其中使用了嵌入式汇编语句以功能号_NR_read(3)执行了Linux的系统中断调用0x80,当进入内核中的系统调用处理程序kernel/sys_call.s后,system_call的代码会首先检查eax中的系统调用功能号是否在有效系统调用号范围内,然后根据sys_call_table[]函数指针表调用执行相应的系统调用处理程序。

call _sys_call_table(,%eax,4)

这句汇编操作数的意思是间接调用地址在_sys_call_table+%eax*4处的函数。由于sys_call_table[]指针每项4字节,因此这里需要给系统调用功能号乘以4。

华为Atlas200DK实战指南:从零搭建AI开发环境到人像语义分割模型部署 本文提供了一份详尽的华为Atlas 200DK AI开发环境搭建与模型部署实战指南。文章采用合设环境方案,从SD卡准备、系统镜像烧录、网络配置到必备工具安装,逐步引导开发者完成环境搭建。核心部分详细讲解了如何利用华为ATC工具将TensorFlow模型转换为昇腾专用格式,并最终成功编译和运行人像语义分割模型,实现实时人像识别效果。 阅读详情

相关推荐

【数字图像相关-OpenCorr学习笔记】Epipolar search原理+代码解析

OpenCorr是一个开源C++库,用于研究和开发数字图像相关(DIC)技术它提供了2D和立体声DIC的全功能模块,以及数字体积相关(DVC)。最近正在学习OpenCorr,为了更深层次地理解ICGN,我打算浅浅剖析Opencorr的代码,学习的过程中写下这篇学习笔记,以后忘记了还能回来看看。同时,作为一名在读研究生,希望能得到社区大佬的指点,以及跟同学们一起学习进步。这一期主要讲解Eipipolar search的原理,并且附上部分代码解析。

ywyywyy的博客 1356

linux系统调用的来龙去脉(下)

1.LINUX系统调用实现 linux系统调用分为3个部分:调用请求 ,响应请求 ,功能实现。 linux系统调用流程图如下: 系统调用提供给应用程序的接口为调用请求,调用请求中包含触发软中断的指令,应用程序使用调用请求后,处理器会产生一个中断,中断服务得到执行,中断服务根据调用号选择特定的功能函数去执行。 1.1调用请求 linux系统调用的第一部分是调用请求,调用请求作为系统调用提供给应用程序的接口,在linux系统调用的3部分中,应用程序只

li_man_man_man的博客 1686

Excel数据清洗实战:8个必学函数搞定90%的脏数据问题(附案例)

本文通过一个完整的销售数据清洗案例,详细讲解了如何组合使用TRIM、CLEAN、SUBSTITUTE等8个核心Excel函数,构建自动化清洗流水线,高效解决日常办公中90%的脏数据问题,从而将时间留给更有价值的分析工作。

weixin_29215391的博客 583

linux系统调用的来龙去脉(上)

《linux系统调用的来龙去脉》分为上下两篇,本文为上篇。 1.前言 开始正题前先讲两个生活小案例来引出系统调用的意义。 案例一:图书馆 安居不用架高堂,书中自有黄金屋。娶妻莫恨无良媒,书中自有颜如玉。 图书馆是我喜欢去的一个地方,相信大家也都去过。在图书馆我们可以自由阅读任何书,广泛的汲取各种知识。正是由于所有人都可以自由的阅读任意书籍,所以经常就会出现书籍位置出现错乱,书籍页面出现损坏,甚至还会出现书籍遗失的情况。 实例二:收藏馆 价值连城的艺术品往往存放在特定温度和湿度的存储柜中,为了确保艺术品

li_man_man_man的博客 3245

InfiniBand(IB)实战指南:从硬件配置到性能优化

本文是一份详尽的InfiniBand实战指南,涵盖从硬件选型、部署到驱动配置、性能优化的全流程。重点解析了InfiniBand作为AI训练与高性能计算(HPC)核心网络的优势,特别是其支持的RDMA技术如何实现微秒级低延迟。文章提供了硬件匹配、NCCL压测、内核参数调优及在PyTorch分布式训练中启用IB的实操步骤,旨在帮助工程师构建和优化高性能计算集群。

mqtt6iot的博客 578

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 5 6

第5关:注销个人信息。

m0_62222486的博客 2119

系统调用来龙去脉

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。“系统调用”是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序调用的,应用程序可以通过系统调用来请求获得操作系统内核的服务。系统调用按功能分类有设备管理、文件管理、进程控制、进程通信、内存管理。

cdz2470的博客 420

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 808

【Linux】Linux系统调用

>- **操作系统**——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。 >- **操作系统内核**——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如Linux。 >- **Linux操作系统**——基于Linux内核的操作系统。通常由Linux内核、shell(特殊的应用程序,提供运行其他程序的接口)、文件系统和应用程序组成。常见的有:Redhat、Fedora、Centos、Ubuntu和Androi

半生瓜のblog 4622

Python 爬虫实战:爬虫与 ECharts 结合 —— 前端可视化展示

本文介绍了爬虫技术与ECharts可视化结合的完整实现流程。首先使用Python爬取京东商品数据(价格、评价数等),通过BeautifulSoup解析和pandas处理转换为JSON格式。然后构建前端页面,利用ECharts实现价格分布柱状图、价格-评价数散点图和店铺占比饼图三种可视化效果。文章详细解析了爬虫数据提取、格式转换和前端图表配置等关键技术点,并提供了完整的代码示例。最后提出了基于API接口、数据库存储等扩展方向,为数据采集到可视化展示提供了完整的解决方案。

2503_91057718的博客 631

RK3568平台YOLOv11模型部署全流程实战:环境搭建、模型转换与性能优化解析

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

LXY_LOVE36的博客 120

【Linux】Linux系统调用函数(300多个)

一、初级I/O函数二、文件管理操作函数三、标准I/O函数四、格式化输入输出函数五、进程控制六、进程间通信函数七、信号函数八、用户、组函数及环境变量函数九、错误处理与内存分配函数十、日志函数、动态函数与正则表达式函数十一、时间函数十二、socket相关函数十三、字符测试函数十四、数据转换函数十五、字符串处理函数十六、数学计算函数十七、随机数及数据加密函数十八、数据结构函数十九、其他函数

crr411422的博客 6113

基于非接触式微波雷达设计的跌倒检测预警系统【短信报警】

本项目选择基于非接触式微波雷达的跌倒检测预警装置作为技术核心,采用云帆瑞达的R60AFD1跌倒检测模组。这一模组能够根据人体的运动变化,如速度、距离和姿态等特征,判断是否发生跌倒,并可以持续监控老年人是否处于危险状态。此外,本项目还结合4G通信技术,通过Air724UG模块实现短信报警功能,一旦检测到跌倒事故,系统将自动通过4G网络向紧急联系人发送短信报警,及时通知亲属或医护人员进行救援。

1751

Linux ARM系统调用过程分析(三)——Linux中open系统调用实现原理

Linux ARM系统调用过程分析(三)——Linux中open系统调用实现原理 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1)arm-linux 系统调用流程   (2)ARM Linux上的系统调用代码分析 文章目录Linux ARM系统调用过程分析(三)——Linux中open系统调用实现原理sys_open的定义SYSCALL_DEFINEx宏定义SYSCALL_METADATA宏定义__SYSCALL_DEFI

枫潇潇 1088

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux下的系统调用原理分析

分析Linux0.11源码,探究系统调用的本质

qq_43651585的博客 491

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux中mmap系统调用原理分析与实现

1、mmap系统调用(功能)       void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset )       内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间, 通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。

2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux .so mmap,linux中mmap系统调用原理分析与实现

1、mmap系统调用(功能)void* mmap ( void * addr , size_t len , int prot , int flags ,intfd , off_t offset )内存映射函数mmap, 负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。2、mmap系统调用(参数)1)addr: ...

weixin_42500156的博客 909
上一篇: x86 32位机的特权保护
下一篇: 宏和函数
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值