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

Linux 利用 ftrace 分析内核调用 在 Linux 中,ftrace是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。ftrace提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。ftrace使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。 阅读详情

实验要求

编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd
rootfs.img 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析
https://github.com/mengning/menu
给出相关关键源代码及实验截图,撰写一篇博客(署真实姓名或学号最后3位编号),并在博客文章中注明“原创作品转载请注明出处 +
https://github.com/mengning/linuxkernel/ ”,博客内容的具体要求如下:
题目自拟,内容围绕系统调用进行; 博客中需要使用实验截图 博客内容中需要仔细分析系统调用、保护现场与恢复现场、系统调用号及参数传递过程
总结部分需要阐明自己对系统调用工作机制的理解。

实验环境

  • 内核代码:Linux Kernel Ubuntu虚拟机:
  • 运行环境,本次使用VM Ware安装的Ubuntu14
  • QEMU:本次使用的模拟器,
  • 运行内核代码 gdb断点调试工具

实验过程

1.编译内核

git clone https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz
xz -d linux-5.0.1.tar.xz
tar -xvf linux-5.0.1.tar //得到内核文件
cd linux-5.0.1
sudo apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev //安装依赖工具
sudo apt install libssl-dev //安装依赖
make i386_defconfig //这部很关键,我使用的是32位的qemu,因此kernel需要同为32位的
make menuconfig //然后kernel hacking,->Compile-time checks and compiler options,选择 [*]compile the kernel with debug info

效果如下图
在这里插入图片描述

sudo make -j8

编译完成会在arch/x86/boot/下产生bzImage

2.制作根文件系统

在linux-5.0文件夹下:

sudo mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
sudo gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
sudo cp ../menu/init ./
sudo su
find . | cpio -o -Hnewc |gzip -9 > ../../rootfs.img
cd ../../
qemu -kernel linux-5.0/arch/x86/boot/bzImage -initrd rootfs.img

这里运行的是老师的demo,测试可以启动MenuOS。
在这里插入图片描述

3.编写自己的系统调用

我的学号后两位是57,查询系统调用表,看到对应的系统调用是getpgid //获取指定进程组标识号
在这里插入图片描述
进入menu文件夹下修改test.c文件,增加系统调用。
在test.c文件中增加函数:

int SetPgid(int argc,int *argv[] ){
	printf("Excute No.57 System Call\n");
	int current_pid =  getpgrp();
	printf("current pid=%d\n",current_pid);
	current_pid = 225357;//my student number
	printf("modify to %d",current_pid);
	return 0;
}

同时修改help菜单项增加一条:

MenuConfig("set_pgid","Set Progress Group id",SetPgid);

再次执行步骤3中的制作根文件系统的过程:

sudo mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
sudo gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
sudo cp ../menu/init ./
sudo su
find . | cpio -o -Hnewc |gzip -9 > ../../rootfs.img
cd ../../
qemu -kernel linux-5.0/arch/x86/boot/bzImage -initrd rootfs.img

执行结果是:在这里插入图片描述

4.使用gdb打断点追踪系统调用过程

让qemu启动时暂停

qemu -kernel linux-5.0/arch/x86/boot/bzImage -initrd rootfs.img -S -s

另开一个窗口

gdb
file linux-5.0/vmlinux
target remote:1234
//设置个三个断点
b start_kernel
b sys_getpgrp
b sys_setpgid
c//继续执行
list//查看代码
i r//查看寄存器的值

在这里插入图片描述
在这里插入图片描述
可以发现,在获取进程组号PGID确实调用了sys_getpgrp这个函数,但是由于我写的修改代码是在函数内部修改了局部变量,并没有实际达到修改group id的效果,这一点有待改善。相当于追踪了sys_getpgrp这个函数调用,从寄存器的值可以看到sys_getpgrp函数的指令的地址,确实进行了系统调用。

实验总结

发生系统调用时,int 0x80触发中断,系统保存现场后进入内核态,根据调用号寻找到相应的处理程序完成中断处理,结束后再返回。
系统调用的工作机制是:当用户态进程调用一个系统调用时,CPU切换到内核态并执行对应的内核函数,内核函数由操作系统预先定义并分配了编号,调用过程中系统通过eax寄存器传递调用函数的编号,通过编号寻找相应的中断处理程序完成所需的功能,完成后通过已保存的现场返回并继续往下执行。

当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数。
在Linux中是通过执行int $0x80来执行系统调用的, 这条汇编指令产生向量为128的编程异常。
整个系统调用过程如下:

1.用户应用程序填充系统调用的寄存器
2.进程从用户态切换到内核态, 并执行系统调用 entry_SYSCALL_32
3.entry_SYSCALL_32切换到内核栈, 保存现场(通用寄存器, 旧的栈. flags)
4.entry_SYSCALL_32 调用 sys_call_table 中的函数, 如果正确调用对应的函数, 如果错误退出.
5.系统调用完成, 恢复现场(通用寄存器, 旧的栈. flags).

参考文献及鸣谢

  1. https://blog.youkuaiyun.com/qq_33559519/article/details/88626484
  2. https://blog.youkuaiyun.com/u010006102/article/details/39960201
  3. https://blog.youkuaiyun.com/weixin_43822397/article/details/88641162
跟踪分析Linux内核5.0系统调用reboot处理过程分析 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 学号 088 实验要求 编译内核5.0 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪分析 实验环境 Ubuntu18 内核:Linux Kernel 5.0.1 qemu:运行内核代码的模拟器 gdb:断点调试工具 编译内核5.0 1.下载内核5.0压缩包,配置编... 阅读详情

相关推荐

Linux5.0内核系统调用分析

原创作品转载请注明出处 +https://github.com/mengning/linuxkernel/” 学号:SA18225163 目录 一、内核编译 1.安装必备的软件编译工具 2.下载Linux5.0内核代码 3.配置内核 二.启动QEMU 一、内核编译 Linux内核是操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功...

kyhquite的博客 862

Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方法进行完善。 今天我们会分析到以下内容: 1. 字符设备控制方法实现 2. 揭秘系统调用本质 在昨天我们实现的字符设备中有open、read、write等方法,由于这些方法我们在以前编写应用程序的时候,相信大家已经有所涉及所以就没单独列出来分...

weixin_30376323的博客 179

Delphi 12.3 精简绿色版下载

Delphi精简绿色版基于原版安装,去掉了InterBase、法语、德语、日语,只保留了Delphi Windows 32和Delphi Windows 64桌面开发,其余部分未做任何修改。Delphi精简绿色版不含任何破解,仅供学习和研究,24小时后请自行删除,如需继续使用Delphi,请购买正版。绿色版基于原版安装,未做任何精简和修改。绿色版不含任何破解,仅供学习和研究,24小时后请自行删除,如需继续使用RAD Studio,请购买正版。

全粘工程师 4300

linux笔记5.0

命令hexdump 查看二进制文件-n 只格式化输出文件的前多少字节-C 输出规范的十六进制和ASCII码lsblk 查看块设备fdisk 创建MBR分区gdisk 创建GPT分区parted 高级分区操作partprobe 同步内存和硬盘分区表信息(centos7)partx 同步分区信息(centos6)mkfs 创建文件系统mke2fs 针对ext系列创建文件系统bki...

weixin_34185560的博客 231

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收

weixin_43864631的博客 1万+

保姆级教程:用STM8S207R6和FD6288T自制BLDC驱动板,从原理图到代码框架搭建

本文提供了一份详细的STM8S207R6和FD6288T自制BLDC驱动板教程,涵盖从原理图设计到代码框架搭建的全过程。通过硬件选型、电源电路设计、PWM定时器配置等关键步骤解析,帮助开发者快速掌握无刷直流电机驱动技术,实现高效稳定的电机控制方案。

weixin_28729205的博客 488

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

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

weixin_42956878的博客 520

审稿人看了直呼内行:多组学整合分析——科研小白进阶之路

多组学,多平台分析解决方案

pysonger的博客 3944

Linux1.0系统调用列表

以下为linux1.0支持的系统调用sys_setup, sys_exit, sys_fork, sys_read, sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link, sys_unlink, sys_execve, sys_chdir, sys_time, sys_mknod, sys_chm

pk_20140716的专栏 573

微信小程序PC端兼容性实战:如何绕过限制在电脑上运行手机端小程序

本文详细解析了微信小程序在PC端的兼容性问题及解决方案,重点介绍了如何利用`wx.getSystemInfo`API检测运行环境,并通过修改User-Agent、动态环境检测与适配等技术手段实现手机端小程序在PC端的顺畅运行。文章还提供了常见兼容性问题的解决方法和调试工具推荐,帮助开发者高效应对多端适配挑战。

weixin_28366053的博客 865

SPI协议详解(图文并茂+超详细)

先说串口 因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。 如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步; 双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。 传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示; 如果您注意到

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 33万+

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

跟踪分析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...

Terminator1937的博客 606

在 Fiori Elements Object Page 的表格中用 UI.Hidden 隐藏列:语义、边界与落地实践全解析

摘要: Fiori Elements的Object Page表格中,UI.Hidden注解支持静态和动态隐藏列。动态隐藏分为两种:基于父实体属性隐藏整列,或基于子实体属性按行隐藏单元格。关键约束包括:支持服务端操作的列禁止使用动态隐藏,否则会导致UX不一致。ABAP CDS不支持路径式UI.Hidden,需改用XML注解。该功能需与UI.Importance、个性化等机制明确区分,避免混淆。对于可能参与排序/过滤的列,建议仅使用静态隐藏。实际应用中需注意注解位置(整列或单元格级)和业务场景的匹配。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 204

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

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

Poor_Tony的博客 1174

服务器取证——服务器基础知识

服务器基础知识

记录并分享学习安全的知识点.. 2481

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

linux操作系统分析实验二之跟踪分析Linux内核的启动过程

陈三县+SA18225041+原创作品转载请注明出处 +https://github.com/mengning/linuxkernel/ 一、编译内核5.0 下载Linux内核源代码 在源代码压缩包的目录下执行以下命令: xz -d linux-5.0.1.tar.xz tar -xvf linux-5.0.1.tar cd linux-5.0.1 安装内核编译工具 ...

Chensanxian的博客 1025

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

举例跟踪分析Linux内核5.0系统调用处理过程 学号后三位029 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 1.实验目标 1.编译内核5.0 2.选择系统调用进行跟踪分析 2.实验环境 VMware Workstation Pro Ubuntu 18.04 虚拟机 3.编译内核5.0 下载linux5.0 wget htt...

weixin_41875227的博客 380

假人有限元模型

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

OV9734 DATASHEET,完整规格书

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

Linux5.0内核的启动过程, 跟踪分析Linux内核的启动过程

学号后三位:426。原创作品转来自:https://github.com/mengning/linuxkernel/”   举例跟踪分析Linux内核5.0系统调用处理过程 编译内核5.0 qemu -kernel linux-5.0.1/arch/x86/boot/bzImage -initrd rootfs.img 选择系统调用号后两位与您的学号后两位相同的系统调用进行跟踪...

weixin_30814319的博客 295

Linux内核分析之跟踪分析Linux内核的启动过程

实验过程 一、下载linux-5.0内核并编译 cd linux_os/linux-5.0 make i386_defconfig make -j8 编译完成会在arch/x86/boot/下产生bzImage 二、制作根文件系统

张涛磊的博客 924

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

跟踪分析Linux内核5.0系统86号调用处理过程 实验背景实验步骤1.安装配置Linux5.0.1内核2.跟踪系统调用致谢 学号末位:186 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 实验背景 跟踪分析Linux内核5.0系统调用处理过程 选择系统调用号后两位与学号后两位相同的系统调用进行跟踪分析 分析系统调用、保护现场与恢复现...

qq_34650478的博客 689
上一篇: 切割钢条最大利润问题
下一篇: 数据结构之——堆结构的实现
There Is No Code
博客等级 码龄10年 254粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

There Is No Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值