跟踪分析Linux5.0内核处理系统调用的过程

跟踪分析Linux内核5.0系统调用处理过程 - 1 #define __NR_pipe 42 阅读详情

跟踪分析Linux5.0内核处理系统调用的过程

416原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/


实验要求

  • 下载并编译Linux5.0内核
  • 选择一个系统调用进行跟踪

实验步骤

一. 编译Linux5.0内核
1. tar -xvf linux-5.0.tar
2. cd linux-5.0
3. make menuconfig
4. make -j 8  //据说速度很快

出现以下字样说明编译成功在这里插入图片描述

二. 制作根目录
1. mkdir rootfs
2. git clone https://github.com/mengning/menu.git
3. cd menu
4. sudo apt install gcc-multilib
5. gcc -pthread -o init linktable.c menu.c test.c -m32 -static
6. cd ../rootfs
7. cp ../menu/init ./
8. find . | cpio -o -Hnewc | gzip -9 > ../rootfs.img

在这里插入图片描述

cd /usr/include/asm/unistd_64.h

在这里插入图片描述
我学号对应的系统调用是lchown,lchown是更改符号链接本身的所有者,而不是符号链接所指向的实际文件。不同的系统规定不一样:
1、BSD系统:规定只有超级用户才能更改一个文件的所有者。
2、System V:允许任意用户更改他们所拥有的所有者。
3、POSIX.1标准:取决于具体文件系统,需要用_POSIX_CHOWN_RESTRICTED调用pathconf或fpathconf函数来判断具体要操作的文件是否有限制,也就是该文件只允许超级用户更改还是允许任意用户更改他们所拥有的文件的所有者。
即使是允许更改也有以下严格规定:
(1)只有超级用户进程才能更改该文件的用户ID。
(2)满足系列条件,一个非超级用户进程就可以更改该文件的组ID:
(a)进程拥有此文件(其有效用户ID等于该文件的用户ID)。
(b)参数owner等于-1或者文件的用户ID,并且参数group等于进程的有效组ID或者进程的附加组ID之一。也就是说,你不能更改其他用户的用户ID,只能更改你所拥有的文件的组ID,并且只能更改到你所属的组。

现在要跟踪lchown,需要将以下内容加在test.c中。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
 
int main (int argc, char *argv[])
{
   if ( argc != 2 )
    {
       printf("Usage: %s filename\n", argv[0]);
       return (1);
   }  
   if ( chown(argv[1], 0, 0) < 0 )
    {
       perror("Cannot change the owner!");
       return (1);
   }   
   return (0);
}

在menuOS中调用封装了chown的自定义函数。
在这里插入图片描述

实验截图

在这里插入图片描述

总结

系统调用概念

是操作系统为用户态运行的进程和硬件设备之间进行交互提供了一组接口,编程人员通过向内核发出系统调用,向操作系统提出服务请求,由操作系统代为完成。
系统调用是用户态进入内核态的唯一接口,本身并非内核函数,但是由内核函数实现。进入内核之后,不同的系统调用会找到各自对应的内核处理函数,这些内核函数称为系统调用的“服务例程”。例如系统调用creat实际调用的服务例程为sys_creat(),或者说系统调用creat是服务例程sys_creat()的封装例程。
在这里插入图片描述
使用系统调用的优点是:首先使得编程更加容易,把用户从学习硬件设备的低级编程特性之中解放了出来;其次,极大地提高了系统的安全性,使得内核在满足用户的某个服务请求之前,能够事先检查用户请求的准确性。
保护现场就是进入中断服务程序之前,保存需要用到的寄存器数据; 恢复现场就是进入中断服务程序之前,恢复之前保存的寄存器数据。
应用编程接口(API)只是一个函数定义,说明了如何获得一个给定的服务;而系统调用是通过软中断向内核态发出一个明确的服务请求。通常情况下,每个系统调用对应一个封装例程,而封装例程定义了应用程序所使用的API。

Int $0x80指令

Linux中实现系统调用利用了i386体系结构中的软件中断,即通过int $0x80这条汇编指令来发出系统调用。这条汇编指令将用户态的执行模式转变为内核态,并且把控制权交给系统调用处理程序的入口:system_call()处理函数。

system_call()函数

首先将系统调用号(eax)和可能用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL来完成)。对用户态进程传递过来的系统调用号进行有效性检查(eax是系统调用号)。
如果是合法的系统调用,根据eax中的系统调用号,内核进程查看系统调用表(sys_call_table),并且找到相应的服务例程。服务例程结束以后,从eax获得系统调用的返回值,并且把这个返回值存放在曾经保存用户态eax寄存器栈单元的那个位置上。跳转到ret_from_sys_call(),终止系统调用程序的执行。当进程恢复它在用户态的执行之前,RESTORE_ALL宏定义会恢复用户进入内核前被保存到堆栈中的寄存器的值。

20242808《Linux内核原理与分析》第6周作业 通过本次实验对函数的汇编代码和工作流程的分析,深入理解了 Linux 内核处理系统调用的机制。用户态请求系统调用:通过int 0x80中断指令,用户态进程发起系统调用请求,切换到内核态并进入系统调用处理程序。保护现场和获取线程信息函数中使用SAVE_ALL宏将当前寄存器状态压入堆栈,保护用户态上下文。接着,通过宏获取当前进程的线程信息。检查系统调用号合法性:从eax寄存器中获取系统调用号,通过查找系统调用处理函数。如果系统调用号无效,进入错误处理流程。执行系统调用函数:在系统调用号合法的情况下,跳转到。 阅读详情

相关推荐

printf函数在Linux中的完整执行路径与内核交互机制分析

系统调用是操作系统为用户程序提供服务的核心机制,它构建了用户空间与内核空间的安全边界。在Linux系统中,当程序需要执行特权操作时,必须通过系统调用接口进入内核模式。printf作为最常用的C库函数,其底层通过write系统调用实现输出功能,涉及从glibc库函数到内核系统调用处理、虚拟文件系统(VFS)、设备驱动等多个子系统的协作。理解printf的完整执行路径有助于掌握Linux系统调用工作原理,为性能优化和系统编程奠定基础。本文基于glibc和Linux内核源码,详细分析printf如何通过系统调用机

weixin_30410119的博客 392

“Linux内核分析”实验报告(三)跟踪分析Linux内核的启动过程

代码分析 asmlinkage__visiblevoid__initstart_kernel(void) { char*command_line; char*after_dashes; /* *Needtorunasearly...

chijiankao3210的博客 307

深入解析printf系统调用:从用户空间到内核的完整执行链路

系统调用是操作系统为用户程序提供服务的核心机制,它建立了用户空间与内核空间的安全通信桥梁。其工作原理基于CPU的特权级切换,通过特定的指令触发从用户态到内核态的转换,确保系统资源的安全访问。这一机制的技术价值在于实现了操作系统的安全隔离和资源统一管理,避免了用户程序直接操作硬件可能带来的安全风险。在应用场景上,系统调用广泛应用于文件操作、进程管理、网络通信等各个领域。以printf函数为例,这个看似简单的输出操作实际上涉及glibc库函数封装、write系统调用触发、内核空间处理等多个环节,完整展现了Lin

weixin_34146805的博客 418

举例gdb,Linux跟踪分析系统调用

举例gdb,Linux跟踪分析系统调用 学号143原创作品转载请注明出处 +https://github.com/mengning/linuxkernel/ 前言 该博客基于《Linux系统分析》课程的实验,实验要求举例跟踪分析Linux内核5.0系统调用处理过程 1.编译5.0内核 2.选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 Linux 5.0内核代码链...

m0_37901780的博客 584

雾化器硬件设计:从N155驱动到PCB可量产实现

雾化器是典型的机电一体化嵌入式终端,其硬件设计本质是电源完整性、信号完整性与热-机械协同的系统工程。核心在于理解高压脉冲驱动原理(如2.4MHz固定频率匹配压电谐振)、电源域隔离机制(AGND/DGND/PGND分域设计)及约束驱动的PCB转化逻辑。技术价值体现在电气可靠性(如OTP/OLP保护)、生产可制造性(DFM合规焊盘与钢网)与环境鲁棒性(三防漆、散热过孔)。典型应用场景覆盖加湿器、医疗雾化仪与工业微流控设备。本文聚焦超声波雾化控制板的硬线实现路径,深入解析N155驱动芯片选型、网络标签工程误用陷阱

weixin_35649491的博客 618

对接萤石平台调用播放

萤石api 管理 · 萤石开放平台API文档 httpclient pom <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> package com.ruoyi...

u011799016的博客 1773

Linux内核分析——系统调用(上)

pianogirl 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000一、用户态、内核态、中断处理机制intel x86 CPU有四个权限分级,0-3。Linux只取两种,0是内核态,3是用户态。区分权限级别使得系统更加稳定。1.内核态 高执行级别,代码可以执行特权指令,访问任意的物理地址。

pianogirl123的博客 1025

探索热阻测试仪在半导体器件热管理中的应用与前景

T3Ster是MicReD研发的热测试仪,运用JEDEC稳态实时测试方法,专业测试分离或集成的双极型晶体管、MOS晶体管、常见的三极管、LED封装和半导体闸流管等器件的热特性。利用瞬态温升技术,可测得器件稳态热阻和温升,不但可以测得半导体器件稳态热阻和温升,而且可以直接测量各部分对于温升的贡献,计算芯片热流路径上的纵向热阻构成,对器件热可靠性设计、散热问题解决、产品性能提升和长期可靠性至关重要。关键词:T3ster,Micred,功率循环,结温测试,热阻测试,结温热阻测试,半导体热特性测试;

anscos_Olivia的博客 896

Linux实验:跟踪分析Linux5.0.1内核处理系统调用的过程

学号后3位:403 原创作品转载请注明出处,本实验来源 https://github.com/mengning/linuxkernel/ 实验要求 编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 https://github.com/m...

qq_30417071的博客 316

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果

官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。

qianxin1234的博客 2017

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

Linux操作系统分析与设计——跟踪分析Linux5.0内核处理系统调用的过程

实验要求 编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 https://github.com/mengning/menu 给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请...

ThereIsNoCode 399

Python爬虫实战:抓取CVE安全漏洞数据库

在网络安全领域,CVE(Common Vulnerabilities and Exposures)是一个非常重要的安全漏洞字典,它为每个安全漏洞提供了唯一的标识符。安全研究人员、开发人员和系统管理员都需要及时了解最新的CVE信息,以便采取相应的防护措施。本文将详细介绍如何使用Python爬虫技术从专业CVE网站抓取漏洞数据,并构建一个完整的CVE信息采集系统。本文详细介绍了如何使用Python爬虫技术从专业CVE网站抓取安全漏洞数据。多种爬虫技术反爬虫策略:User-Agent轮换、代理IP、请求延迟。

2201_76125261的博客 367

举例跟踪分析Linux内核5.0系统调用处理过程

使用Ubuntu编译Linux内核5.0

BYF_694042的博客 382

基于STM32设计的消防小车

当前基于STM32单片机设计了一款智能消防小车;当前小车支持烟雾浓度检测、可燃气体检测,环境温度湿度检测、火焰源检测、能支持远程遥控,方便消防员远程操控进行灭火。小车也支持自动消防,在行驶过程中,消防智能小车通过火焰传感器感应火源以检测火焰具体位置,可以利用算法设计进行循迹灭火,该模式下驱动电机水泵喷水,可以有效控制火源的第二次发生,从而完成消防作业。小车本身带了超声波测距模块,红外壁障模块,在自动或者手动控制行驶过程中可以防止碰到障碍物损伤小车。

7377

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击以结束路径。出现一个带有剖面的对话框,允许您设置视线分析或优化端点。

智慧空间实验室 2048

Linux 内核系统调用深度解析

用户空间:应用程序运行的空间内核空间:操作系统内核运行的空间特权级:用户空间运行在低特权级,内核空间运行在高特权级// 系统调用表// ... 其他系统调用Linux 内核的系统调用机制是一个复杂而精细的系统,它不仅为用户空间程序提供了访问内核服务的接口,还影响着系统的整体性能和安全性。作为创业者,深入理解系统调用机制,不仅可以帮助我们开发更好的产品,还可以为技术选型和成本控制提供依据。正如我的口头禅所说:"工作也要流程化",系统调用的使用也需要建立一套系统化的流程和方法。

jiang_style的博客 4443

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【linux内核分析与应用-陈莉君】系统调用机制

1.系统调用 系统调用是内核的出口,说的是操作系统提供给用户程序调用的一组特殊接口,从逻辑上来说, 系统调用可以被看做是内核与用户空间交互的接口,好比一个中间人,将用户的请求传达给内核, 当内核处理完了以后再将处理的结果返回给用户,下图是open系统调用与内核交互的一个过程. 2.跟踪进程所调用的系统调用 strace可以看所有的程序的系统调用,不同子系统的系统调用可以用不同的命令查看. 3.中断异常和系统调用的比较 ...

Edidaughter的博客 463

假人有限元模型

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux内核中的系统调用详解

系统调用是用户空间程序通过软中断或其他机制向内核请求服务的过程。

jiang_style的博客 3631

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

linux 应用程序socket()怎么调用系统socket,Socket与系统调用深度分析

一、Socket接口在用户态通过系统调用机制进入内核;内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。此时处理器处于特权级最高的(0级)内核代码中执行。用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源。此时处理器在特权级最低的(3级)用户代码中运行。系统调用:为了使上层应用能够访问到这些资源,内核为上层应用提供访问的接口。三者之间的关系:用户态下的应用程序,通过系...

weixin_39540426的博客 516

Linux内核分析(调度类和调度实体)

调度是操作系统内核的一个关键职责,它涉及到如何合理分配CPU时间给不同的进程或线程。在Linux内核中,调度不仅仅是一个简单的任务切换过程,而是一个精细化管理的过程,涉及多个层次和多种策略。理解调度类(Scheduler Classes)和调度实体(Scheduling Entities)的工作机制,对于系统开发者和性能调优工程师来说,都是至关重要的。每个调度类在Linux内核中扮演着不同的角色,从处理实时任务到公平分配CPU时间,再到处理系统空闲任务。

m0_49476241的博客 1486
上一篇: Linux系统分析实验(一):时间片轮转多道程序内核
Terminator1937
博客等级 码龄12年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值