linux系统调用分析

ARM Linux系统调用详细分析 文件: linux-2.6.30.4/arch/arm/kernel/entry-common.S linux-2.6.30.4/arch/arm/kernel/calls.S 在entry-common.S中包含了上次calls.S,这里简单分析前两次: 第一次: 在entry-common.S中: .equ NR_syscalls,0 #define CALL(x) .equ 阅读详情

1. 什么是系统调用

简单来说,系统调用就是用户程序和硬件设备之间的桥梁。

用户程序在需要的时候,通过系统调用来使用硬件设备。

系统调用的存在,有以下重要的意义:

1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发。

    比如:用户程序通过write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上。

2)系统调用使得用户程序有更好的可移植性。只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,从一个系统迁移到另一个操作系统。

3)系统调用使得内核能更好的管理用户程序,增强了系统的稳定性。

    因为系统调用是内核实现的,内核通过系统调用来控制开放什么功能及什么权限给用户程序。

    这样可以避免用户程序不正确的使用硬件设备,从而破坏了其他程序。

4)系统调用有效的分离了用户程序和内核的开发。

    用户程序只需关心系统调用API,通过这些API来开发自己的应用,不用关心API的具体实现。

    内核则只要关心系统调用API的实现,而不必管它们是被如何调用的。

 

用户程序,系统调用,内核,硬件设备的调用关系如下图:

image

 

2. Linux上的系统调用实现原理

要想实现系统调用,主要实现以下几个方面:

  1. 通知内核调用一个哪个系统调用
  2. 用户程序把系统调用的参数传递给内核
  3. 用户程序获取内核返回的系统调用返回值

下面看看Linux是如何实现上面3个功能的。

2.1 通知内核调用一个哪个系统调用

每个系统调用都有一个系统调用号,系统调用发生时,内核就是根据传入的系统调用号来知道是哪个系统调用的。

在x86架构中,用户空间将系统调用号是放在eax中的,系统调用处理程序通过eax取得系统调用号。

系统调用号定义在内核代码:arch/alpha/include/asm/unistd.h 中,可以看出linux的系统调用不是很多。

2.2 用户程序把系统调用的参数传递给内核

系统调用的参数也是通过寄存器传给内核的,在x86系统上,系统调用的前5个参数放在ebx,ecx,edx,esi和edi中,如果参数多的话,还需要用个单独的寄存器存放指向所有参数在用户空间地址的指针。

一般的系统调用都是通过C库(最常用的是glibc库)来访问的,Linux内核提供一个从用户程序直接访问系统调用的方法。

参见内核代码:arch/cris/include/arch-v10/arch/unistd.h

里面定义了6个宏,分别可以调用参数个数为0~6的系统调用

_syscall0(type,name)
_syscall1(type,name,type1,arg1)
_syscall2(type,name,type1,arg1,type2,arg2)
_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)
_syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)
_syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)
_syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)

超过6个参数的系统调用很罕见,所以这里只定义了6个。

2.3 用户程序获取内核返回的系统调用返回值

获取系统调用的返回值也是通过寄存器,在x86系统上,返回值放在eax中。

基于arm的linux系统调用分析 1系统调用的作用linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,最简单的如read,write,open等等。用户可以通过系统调用命令在自己的应用程序上调用他们,从某种角度来看,系统调用和普通函数调用非常相似。区别在于系统调用由操作系统核心提供,运行在内核态,而普通函数调用由函数库或用户自己提供,运行于用户态。实际上,很多已经被我们习以为常的C语言标准函数,在linux平台上的 阅读详情

相关推荐

Linux Kernel系统调用分析

学号118 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 实验过程 内核编译 下载Linux Kernel 5.0.1 source code,然后设置编译选项 make i386_defconfig make manuconfig 然后在menuconfig中选择编译内核时添加调试信息 然后执行 qemu-system-i38...

weixin_41943030的博客 576

《Linux内核设计与实现》读书笔记(五)- 系统调用

主要内容: 什么是系统调用 Linux上的系统调用实现原理 一个简单的系统调用的实现 1. 什么是系统调用 简单来说,系统调用就是用户程序和硬件设备之间的桥梁。 用户程序在需要的时候,通过系统调用来使用硬件设备。 系统调用的存在,有以下重要的意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发。     比如:用户程序通过wr...

weixin_34266504的博客 250

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

【粉丝问答18】linux下查看函数被那些函数调用过?

一、问题 有个打印log的函数,想知道该函数执行的时候,之前执行了哪些函数? 二、分析 在应用程序打印函数栈需要通过函数backtrace(),该函数对应头文件如下: #include <execinfo.h> 1、三个与打印调用栈相关的函数 打印函数栈需要使用到以下3个函数 int backtrace(void** buffer, int size); 函数功能: 用于获取当前线程的调用堆栈。 参数: buffer: 它是一个指针数组,函数获取的当前线程的调用堆栈将会被存放在buf

一口Linux的专栏 1296

学习STM32的无人机控制

下面是一个基于STM32的无人机控制的简单示例代码,包括四旋翼的PID控制、遥控器信号解析和电机控制。本示例以STM32F103系列为例,使用Keil C编译器进行开发。

qq_67153941的博客 706

kettle从入门到精通 第九十二课 ETL之kettle 使用Kettle的Carte对外发布读写接口

场景:使用kettle实现将查询结果返回给客户端,也就是说kettle暴露查询接口供外围系统调用。前提必须是使用carte服务才可以提供接口供外部系统调用。具体实操方法如下:1、设计转换根据具体需求设计转换,主要用到的步骤有获取变量(从请求参数中获取变量)、json输入(解析入参),json 输出将结果转换为json格式输出到客户端。如下图所示:2、接收参数使用获取变量步骤来接收接口请求参数,变量通过${}方法进行获取,如下图${PARAM}则是获取PARAM参数,将参数赋值为req字段。

zhangjin1222的博客 954

dump_stack()查看函数的调用关系。

内核驱动调试

nabody的博客 510

FOC电机控制中电流采样延迟补偿的原理和方法

摘要: FOC电机控制中,电流采样、计算与PWM更新存在固有延迟(约1.5个PWM周期),导致相位滞后,限制电流环带宽。主流补偿方法包括: 一阶前向预测法:基于历史电流值预测未来电流,抵消延迟,工程应用广泛; 相位超前补偿:通过s/z域校正器设计实现等效预测; 状态观测器法(如龙伯格观测器):通过电机模型闭环估计状态,兼具噪声抑制和参数辨识能力,但复杂度高。实际需注意参数敏感性、离散化精度及延迟时间校准,避免过补偿风险。一阶预测法因平衡效果与复杂度成为工业首选。

jifengzhiling的博客 2232

Linux Kernel中的系统调用分析

文章目录1、系统调用在Linux Kernel中的map表(系统调用的数组)2、系统调用的函数在Kernel中的实现3、系统调用的流程4、总结 1、系统调用在Linux Kernel中的map表(系统调用的数组) 在sys.c中定义了__SYSCALL宏 (kernel-4.19/arch/arm64/kernel/sys.c) #define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *); 例如: _

baron-周贺贺-代码改变世界ctw 2115

SAP-FICO LSMW实战:批量导入财务凭证与固定资产主数据(AS91)的完整指南

本文详细介绍了SAP-FICO中LSMW工具在批量导入财务凭证与固定资产主数据(AS91)的完整流程与实战技巧。从基础概念、环境准备到财务凭证导入全流程,特别针对AS91历史资产导入的日期逻辑和关键字段映射提供了专项指南,并分享了常见错误排查与性能优化建议,帮助用户高效完成SAP数据迁移任务。

weixin_29230649的博客 505

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 910

【Linux】Linux系统调用

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

半生瓜のblog 4623

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法

摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。

559

Linux系统调用跟踪分析

林弋力 224 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/添加链接描述

futureflash的博客 409

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

syscall 系统调用陷入_Linux系统调用过程分析

背景为了安全,Linux 中分为用户态和内核态两种运行状态。对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力。当进行一些敏感操作,比如说要打开文件(open)然后进行写入(write)、分配内存(malloc)时,就会切换到内核态。内核态进行相应的检查,如果通过了,则按照进程的要求执行相应的操作,分配相应的资源。这种机制被称为系统调用,用户态进程发起调用,切换到内核态,内核态完成,返回用...

weixin_35631730的博客 1690

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

在linux4 系统调用,linux 3.5.4 系统调用分析

1、概述系统调用时用户空间程序访问内核的唯一方式,glibc(c库)除了实现标准c规范所需的库函数之外,还提供了一套封装例程,将系统调用封装后供用户编程使用。所以,系统调用也属于一种API。那么,用户空间程序访问系统调用的方法有哪些呢?a、使用封装函数#include......getpid();......getpid正是glibc库对系统调用sys_getpid提供的封装函数,具体定义位于/u...

weixin_39644021的博客 215

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux内核系统调用分析

学号531 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ ” 1.下载内核 2.解压内核 3.内核编译 4.文件系统制作

changgex的博客 225

Linux系统调用追踪与性能分析实战

程序跑得慢,但不知道慢在哪。CPU不高、内存够用、磁盘IO也正常,可就是响应慢。这时候需要看系统调用(syscall):程序到底在做什么?是频繁读写文件、网络IO阻塞,还是系统调用本身开销太大?Linux提供了straceperfftrace等工具,可以追踪系统调用、分析性能瓶颈。这篇文章从实战出发,先讲怎么用工具定位问题,再讲怎么优化。问题类型排查工具关键指标优化方向文件IO慢openatread耗时批量操作、缓存、异步IO网络IO慢connectrecvfrom耗时连接复用、异步IO。

在代码的世界里,每天进步1% 1223

Linux之kernel(7)系统调用源码分析

系统调用是指内核提供给用户线程,用于和内核自身进行交互的一组接口。这些接口可以让应用程序受限的访问硬件设备,创建新线程并于已有进程进行通信的机制,以及申请操作系统其他资源的能力。为用户空间提供一种硬件的抽象接口。系统调用保证了系统的稳定和安全。进程运行在虚拟的系统中,由系统提供访问内核的手段。系统调用是除了异常和陷入外,内核唯一的合法入口。Linux的系统调用比大部分操作系统都少得多,重点强调Linux系统调用的规则和实现方法。

梅花香自苦寒来,宝剑锋从磨砺出。 1323

Linux ARM系统调用过程分析(二)——Linux系统调用流程分析

Linux ARM系统调用过程分析(二)——Linux系统调用流程分析 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1)arm-linux 系统调用流程   (2)ARM Linux上的系统调用代码分析 文章目录Linux ARM系统调用过程分析(二)——Linux系统调用流程分析前言EABI和OABI系统调用的初始化syscall_table_startNATIVEsyscall_table_end系统调用的产生glib

枫潇潇 1815

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

Linux系统调用分析

学号372,原创作品转载请注明出处 参考:Linux Kernel 实验环境 内核代码:Linux Kernel Ubuntu虚拟机:运行环境,本次使用VM Ware安装的Ubuntu18 QEMU:本次使用的模拟器,运行内核代码 gdb断点调试工具 实验过程 1.编译内核 https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.ta...

weixin_30371469的博客 110

Linux内核学习之 -- epoll()一族系统调用分析笔记

linux 4.19epoll()也是一种I/O多路复用的技术,但是完全不同于select()/poll()。更加高效,高效的原因其他博客也都提到了,这篇笔记主要是从源码的角度来分析一下实现过程。作为自己的学习笔记,分析都在代码注释中,后续回顾的时候看注释好一点。对于epoll()的分析建立在《Linux内核学习之 – 系统调用open()和write()的实现笔记》 + 《Linux内核学习之 – 系统调用poll()分析笔记》的基础上,因为有很多通用的步骤和环节。

xi_xix_i的博客 1417

Linux系统调用open函数分析

走马观花: Linux 系统调用 open 七日游(一)-qh997-ChinaUnix博客 走马观花: Linux 系统调用 open 七日游(二)-qh997-ChinaUnix博客 走马观花: Linux 系统调用 open 七日游(三)-qh997-ChinaUnix博客

ask_true的博客 703

Linux5.0系统调用过程分析实验

学号085 原创作品转载请注明出处 本实验来源 https://github.com/mengning/linuxkernel/ 实验简介 本实验要求举例跟踪分析Linux内核5.0系统调用处理过程,编译内核5.0,选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析,给出相关关键源代码及实验截图,仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程,阐明自己对系统调用工作机...

weixin_42956878的博客 520
上一篇: linux内核中断处理
下一篇: linux 虚拟文件系统实现
LinuxWorking
博客等级 码龄10年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值