Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...

2023-05-16

@

实验环境

OS

Linux cj-virtual-machine 5.3.0-51-generic

虚拟机

QEMU

内核版本

5.3.4

调式方法

GDB

PS:调试环境安装请看上一篇博客汇编级理解Linux系统调用

fork系统调用过程

和普通系统系统调用对比

正常的⼀个系统调⽤都是陷⼊内核态,再返回到⽤户态,然后继续执⾏系统调⽤后的下⼀条指令。

fork和其他系统调⽤不同之处是它在陷⼊内核态之后有两次返回,第⼀次返回到原来的⽗进程的位置继续向下执⾏,这和其他的系统调⽤是⼀样的。

在⼦进程中fork也返回了⼀次,会返回到⼀个特 定的点——ret_from_fork,通过内核构造的堆栈环境,它可以正常系统调⽤返回到⽤户态

_do_fork系统调用流程概述

源码在/linux/kernel/fork.c目录下,由于代码太多,只是大概了解

long _do_fork(struct kernel_clone_args *args) {

.....

//复制进程描述符和执⾏时所需的其他数据结构

p = copy_process(NULL, trace, NUMA_NO_NODE, args);

......

wake_up_new_task(p);//将⼦进程添加到就绪队列

.......

return nr;//返回⼦进程pid(⽗进程中fork返回值为⼦进程的pid)

}

_do_fork

copy_process 复制进程描述符和执⾏时所需的其他数据结构

dup_task_struct 复制进程描述符task_struct、创建内核堆栈等

copy_thread_tls 初始化⼦进程内核栈和thread

wake_up_new_task 将⼦进程添加到就绪队列

系统调用返回

总的来说,进程的创建过程⼤致是⽗进程通过fork系统调⽤进⼊内核_do_fork函数,如图所示复制进程描述符及相关进程 资源(采⽤写时复制技术)、分配⼦进程的内核堆栈并对内核堆栈和thread等进程关键上下⽂进⾏初始化,最后将⼦进程 放⼊就绪队列,fork系统调⽤返回;⽽⼦进程则在被调度执⾏时根据设置的内核堆栈和thread等进程关键上下⽂开始执⾏。

普通系统调用和fork子进程内核堆栈对比

fork系统调用子进程的内核堆栈和普通系统调用堆栈相比多了一个,inactive_task_frame,该结构主要用于进程切换过程。

fork系统调用实验

编写程序,使用fork() 函数

#include

#include

#include

#include

#include

int main(int argc, char* argv[])

{

int pid;

pid = fork();

if(pid<0)

{

//error

fprintf(stderr,"For Failed");

exit(-1);

}

else if(pid==0)

{

//child

printf("this is child process \n");

}

else

{

//parent

printf("this is Parent process \n");

wait(NULL);

printf("child complete \n");

}

return 0;

}

编译后执行

gcc -o fork fork.c -static

./fork

反汇编objdump -S fork -o fork.s,查看fock.s中使用的系统调用为56号,查/linux-5.4.34/arch/x86/entry/syscalls/syscall_64.tbl表得到内核函数__x64_sys_clone

在 /linux/kernel/fork.c中,发现,__x64_sys_clone是调用了内核中的_do_fork函数。

开启虚拟机,在__x64_sys_clone ,_do_fork,cpoy_process,dup_task_struct,copy_thread_tls下断点,shell下运行fork可执行文件,查看此时函数栈

结果

execve系统调用

图示

和普通系统系统调用对比

当前的可执⾏程序在执⾏,执⾏到execve系统调⽤时陷⼊内核态,在内核⾥⾯⽤do_execve加载可执⾏⽂件,把当前进程的可执⾏程序给覆盖掉。当execve系统调⽤返回 时,返回的已经不是原来的那个可执⾏程序了,⽽是新的可执⾏程序。

execve返回的是新的可执⾏程序执⾏的起点,静态链接的可执⾏⽂件也就是main函数的⼤致位置,动态链接的可执⾏⽂件还需 要ld链接好动态链接库再从main函数开始执⾏。

Linux系统⼀般会提供了execl、execlp、execle、execv、execvp和execve等6个⽤以加载执⾏ ⼀个可执⾏⽂件的库函数,这些库函数统称为exec函数,差异在于对命令⾏参数和环境变量参数 的传递⽅式不同。

exec函数都是通过execve系统调⽤进⼊内核,对应的系统调⽤内核处理函数为sys_execve或__x64_sys_execve,它们都是通过调⽤do_execve来具体执⾏加载可执⾏⽂件的 ⼯作。

整体的调⽤的递进关系为:

sys_execve()或__x64_sys_execve -> // 内核处理函数

do_execve() –> // 系统调用函数

do_execveat_common() -> // 系统调用函数

__do_execve_file ->

exec_binprm()-> // 根据读入文件头部,寻找该文件的处理函数

search_binary_handler() ->

load_elf_binary() -> // 加载elf文件到内存中

start_thread() // 开始新进程

进程切换

进程切换时机

⽤户进程上下⽂中主动调⽤特定的系统调⽤进⼊中断上下⽂,系统调⽤返回 ⽤户态之前进⾏进程调度。

内核线程或可中断的中断处理程序,执⾏过程中发⽣中断进⼊中断上下⽂, 在中断返回前进⾏进程调度。

内核线程主动调⽤schedule函数进⾏进程调度

进程上下⽂

⽤户地址空间:包括程序代码、数据、⽤户堆栈等。 (CR3寄存器代表进程⻚⽬录表,即地址空间、数据)

控制信息:进程描述符(thread)、内核堆栈(sp寄存器)等。

进程的CPU上下⽂,相关寄存器的值(指令指针寄存器ip代表进程的CPU上下⽂)。

进程切换过过程

切换⻚全局⽬录(CR3)以安装⼀个新的地址空间,这样不同进程的虚拟地 址如0x8048400(32位x86)就会经过不同的⻚表转换为不同的物理地址。

切换内核态堆栈和进程的CPU上下⽂,因为进程的CPU上下⽂提供了内核执 ⾏新进程所需要的所有信息,包含所有CPU寄存器状态。

核心代码

((last) = __switch_to_asm((prev), (next)));

ENTRY(__switch_to_asm)

pushq %rbp

pushq %rbx

pushq %r12

pushq %r13

pushq %r14

pushq %r15

/* switch stack */

movq %rsp, TASK_threadsp(%rdi)

movq TASK_threadsp(%rsi), %rsp

popq %r15

popq %r14

popq %r13

popq %r12

popq %rbx

popq %rbp

jmp __switch_to END(__switch_to)

__switch_to_asm是在C代码中调⽤的,也就是使⽤call指令,⽽这段汇编的结尾是jmp __switch_to, __switch_to函数是C代码最后有个return,也就是ret指令。将__switch_to_asm和__switch_to结合起来,正好是call指令和ret指令的配对出现。

call指令压栈RIP寄存器到进程切换前的prev进程内核堆栈;⽽ret指令出栈存⼊RIP 寄存器的是进程切换之后的next进程的内核堆栈栈顶数据。

由此完成了进程的切换。

中断上下文和进程上下文对比

中断上下文的切换

中断是由CPU实现的,所以中断上下⽂切换过程中最关键的栈顶寄存器sp和指令指针寄存器 ip 是由CPU协助完成的。

进程上下文的切换

进程切换是由内核实现的(且一般情况下,进程上下文切换嵌套在中断中),所以进程上下⽂切换过程最关键的栈顶寄存器sp切换是通过进程描述符的thread.sp实现的,指令指针 寄存器ip的切换是在内核堆栈切换的基础上巧妙利⽤call/ret指令实现的。

Linux系统的一般执行过程(含中断与进程切换)

一般函数调用框架

(1)正在运⾏的⽤户态进程X。

(2)发⽣中断(包括异常、系统调⽤等),CPU完成load cs:rip(entry of a specific ISR),即跳转到中断处理程序⼊⼝。

(3)中断上下⽂切换,具体包括如下⼏点:

swapgs指令保存现场,可以理解CPU通过swapgs指令给当前CPU寄存器状态做了⼀个快照。

rsp point to kernel stack,加载当前进程内核堆栈栈顶地址到RSP寄存器。快速系统调⽤是由系统调⽤⼊⼝处的汇编代码实现⽤户堆栈和内核堆栈的切换。

save cs:rip/ss:rsp/rflags:将当前CPU关键上下⽂压⼊进程X的内核堆栈,快速系统调⽤是由系统调⽤⼊⼝处的汇编代码实现的。

此时完成了中断上下⽂切换,即从进程X的⽤户态到进程X的内核态。

(4)中断处理过程中或中断返回前调⽤了schedule函数,其中完成了进程调度算法选择next进程、进程地址空间切换、以及switch_to关键的进程上下⽂切换等。

(5)switch_to调⽤了__switch_to_asm汇编代码做了关键的进程上下⽂切换。将当前进程X的内核堆栈切换到进程调度算法选出来的next进程(本例假定为进程Y)的内核堆栈,并完成了进程上下⽂所需的指令指针寄存器状态切换。之后开始运⾏进程Y(这⾥进程Y曾经通过以上步骤被切换出去,因此可以从switch_to下⼀⾏代码继续执⾏)。

(6)中断上下⽂恢复,与(3)中断上下⽂切换相对应。注意这⾥是进程Y的中断处理过程中,⽽(3)中断上下⽂切换是在进程X的中断处理过程中,因为内核堆栈从进程X 切换到进程Y了。

(7)为了对应起⻅,中断上下⽂恢复的最后⼀步单独拿出来(6的最后⼀步即是7)iret - pop cs:rip/ss:rsp/rflags,从Y进程的内核堆栈中弹出(3)中对应的压栈内容。此时完 成了中断上下⽂的切换,即从进程Y的内核态返回到进程Y的⽤户态。注意快速系统调⽤返回sysret与iret的处理略有不同。

(8)继续运⾏⽤户态进程Y。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程... 的相关文章

  • C++多态性的总结

    抽空总结下对一直以来对C 43 43 多态性的一点个人理解 1 什么叫早绑定和晚绑定 早绑定指在对象声明的时候就和它的类型建立了关联 晚绑定是指代码在运行时再检查对象是否提供了我们所需要的方法和属性 静态关联 早绑定 和动态关联 晚绑定 2
  • 解决不能正常访问workerman的问题

    问题描述 xff1a 在阿里云ECS上部署了workerman的应用 xff08 ECS是专有网络 xff09 xff0c 在ECS安全组里已经允许workerman需要的全部端口 xff0c 但是外网一直不能正常打开 xff08 注 xf
  • 谈谈技术面试

    只要是招一个技术人员 xff0c 不管是初级的程序员还是高级软件工程师 xff0c 技术上的考核都必不可少 很荣幸作为面试官参与过公司的一些技术面试 xff0c 从中也体会到了一些东西 首先 xff0c 我觉得技术面试是需要讲究技巧的 xf
  • H3C交换机配置详解

    一 用户配置 lt H3C gt system view H3C super password H3C 设置用户分级密码 H3C undo super password 删除用户分级密码 H3C localuser bigheap 1234
  • PCL—综述—三维图像处理

    点云模型与三维信息 三维图像是一种特殊的信息表达形式 xff0c 其特征是表达的空间中三个维度的数据 和二维图像相比 xff0c 三维图像借助第三个维度的信息 xff0c 可以实现天然的物体 背景解耦 除此之外 xff0c 对于视觉测量来说
  • yolo 多摄像头_45元的WIFI摄像头应用之YOLO人体识别联动智能家居

    如果大家对智能家居比较感兴趣的话 xff0c 一定知道阻碍智能家居自动化发展的一个大问题就是 xff0c 房间里有没有人 xff0c 如果有人 xff0c 那人究竟在做些什么 xff0c 系统又该如何调整环境的照明 xff0c 温度甚至安防
  • Up Board介绍及上手体验

    Up Board是Intel联合华硕制作的一块性能强悍的卡片电脑 外观如下 xff1a 性能参数如下 xff1a CPU为Intel 凌动z8350系列处理器 xff0c 最高频率可达1 92Ghz xff0c 内核GPU是400核心显卡
  • 卫语句 减少if else的层数

    概述 卫语句是一种写代码的经验 为了减少if else的层数 为了提高可读性 xff0c 进而利于维护 案例 现在做一个需求 xff0c 判断一个人是否满足招聘要求 xff0c 招聘要求 xff1a 30岁以下的中国男性 体重100kg以下
  • ROS自定义msg、srv, 编译时找不到相关头文件

    在我们拥有多个package的时候 xff0c 我们定义了一个消息或者服务 xff0c 并在代码中使用了这个消息或者服务 如果是单独编译这个包 xff0c 编译 通过 但是如果是多个包一起编译 xff0c 就会出现找不到相关头文件的错误 原
  • zz (2006- 11-30更新:ISWC2006论文集已上传)本 版 相 关 资 源 (入门指南,资料软件,网址列表,会议期刊)!...

    原文连接 http bbs w3china org dispbbs asp boardID 61 2 amp ID 61 25 入门材料 注 xff1a 没有链接的文件 xff0c 请前往论坛 FTP xff08 地址用户名密码请看全站置顶
  • 怎么安装winubuntu双系统_双系统中如何重装ubuntu系统图文教程

    今天Win7之家小编就给大家介绍一种双系统中如何重装ubuntu系统图文教程 xff0c 大家之前也是有问过小编双系统中如何重装ubuntu系统 xff0c 但是小编没有及时回答 xff0c 现在小编就给大家介绍双系统中如何重装ubuntu
  • 远程 sshd提示:Server unexpectedly closed network connection

    远程sshd提示 xff1a Server unexpectedly closed network connection 重启后服务器效果也一样 xff0c 经过一段时间连接后 xff0c 终于连上远程了 之后新建一个远程连接 xff0c
  • ubuntu如何跑arm程序

    1 首先确定一间配置好arm linux 交叉编译器 xff0c 可以使用arm linux gcc 2 看示例代码hello c include lt stdio h gt int add int a int b int c 61 a 4
  • 事件引入和本质

    前言 继上一篇委托后 xff0c 我们继续来探讨事件 xff0c 因为委托和事件有着不可分割的关系 通过本文 xff0c 相信你会对事件有更深刻的认识和理解 xff0c 不信 xff0c 你看 xff01 概念 用event 关键字使您可以
  • onlstm时间复杂度_CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型

    1 xff0c 不同模型的降水融合性能 表2 2001 2005年全国796个气象站不同降水校正模型的RMSE RB MAE和CC 如表2所示 xff0c 将4种模型结果与原TRMM数据进行了定量比较 xff0c RMSE和MAE值越小表明
  • app 后端技术

    app 后端技术 一直以来工作的方向是web server xff0c 对app server没有什么了解 虽然没有接触过移动app开发 xff0c 但对app后端技术还是挺有探索欲望的 xff0c app应用和web应用在前端的用户习惯不
  • GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站

    每次看到黑客在网上发布的那些GSM技术相关文章我都十分惊讶 然而在没有Software Defined Radios SDRs 之前 xff0c 玩GSM并不便宜 xff0c 除此之外想要好好玩你得下大功夫 拓展阅读 GSM BTS Hac
  • 开发新产品的三个验证阶段(EVT/DVT/PVT)

    1 EVT Engineering Validation Test 是针对工程原型机的验证 xff0c 对象很可能是一大块开发板 xff0c 或是很多块开发板 xff1b 关键是要有足够时间和样品 通常 xff0c 如果是新平台 xff0c
  • 大麦盒子显示服务器超时,大麦盒子卡顿怎么办?这几个方法可以快速解决

    原标题 xff1a 大麦盒子卡顿怎么办 xff1f 这几个方法可以快速解决 根据研究表明 xff0c 目前家庭当中电视的使用时间依然在缓慢上升 xff0c 很多家庭会选购一款电视盒子 xff0c 让看电视的体验得到提升 xff0c 但网上很
  • 【转载】跨域请求出现preflight request失败的问题的解决

    本文转载自 xff1a https developer aliyun com article 753657 简介 xff1a 问题出现 这两天在项目联调过程中突然前端同学报告出现CORS跨域问题无法访问 刚听到很奇怪 xff0c 因为已经在

随机推荐

  • 什么是FSK制式?什么是DTMF制式?

    目前国内来电显示制式有FSK DTMF xff08 双音频 xff09 两种 xff0c 普通推广的是FSK 来电显示 又称 主叫号码显示 xff08 Calling Identity Delivery xff09 分为两种 xff1a 一
  • 【IntelliJ IDEA】idea显示工具栏

    idea显示工具栏 在view gt 勾选对应按钮即可
  • Windows Server 2016 路由和远程访问

    本次实验是将Windows Server 2016 配置成一个路由器 xff0c 为此网络上的客户端和服务器启用多重协议LAN到LAN xff0c LAN到WAN xff0c 虚拟专用网络和网络地址转换路由服务 使用路由和远程访问需配置下列
  • 如何理解Apache License, Version 2.0(整理)

    如何理解Apache License Version 2 0 xff08 整理 xff09 问题 xff1a 最近看到apache发布了2 0版本的License 而且微软也以此发布了部分源代码 我对OpenSource不是特熟 xff0c
  • 网页视频流m3u8/ts视频下载

    现在很多视频网站播放流视频 xff0c 都不是采用mp4 xff0f flv文件直接播放 xff0c 而是采用m3u8 ts这种方式播放 简单说就是 xff0c 网站后台把视频切片成成百上千个xx ts文件 xff0c 一般10秒一个 xf
  • Windchill的JSP页面跳转到Ext页面的分析

    今天花了一天时间 xff0c 看了一块代码 xff0c 低效但是不得不看懂 具体内容是这样的 xff1a Windchill中按钮菜单栏嵌入了一个菜单项 xff0c 点击它会触发弹出一个新的浏览器页面 xff0c 相当于弹框 xff0c 让
  • C++类的定义和声明怎么写

    C 43 43 语言可以看成是C语言的扩展和改进 xff0c 相对于C语言 xff0c C 43 43 语言主要是增添了面向对象的特性 类 xff08 Class xff09 则是C 43 43 面向对象编程的实现方式 无论是何种编程语言
  • jmeter-常用性能指标分析

    概述 我们在用jmeter做性能测试的时候 xff0c 有一些关键性的性能指标需要去分析 但是由于开源工具本身的局限性 xff0c 这些指标在工具中的命名极易对我们造成混淆 所以我们需要对这些指标一一进行剖析 指标分析 响应时间 xff1a
  • 讨论76 怎么查一下我机器的内存?AIX环境

    oracle大型数据库系统在AIX unix上的实战详解 讨论76 怎么查一下我机器的内存 xff1f AIX环境 一个读者来信问勒令一个简单问题 xff1a 怎么查一下我机器的内存 xff1f AIX环境 问题 xff0c 我这里借用or
  • 数组

    数据类型 数组名 61 new 数据类型 元素个数或数组长度 数组中最小的索引是 0 xff0c 最大的索引是 数组的长度 1 获得数组的长度 xff0c 提供了一个 length属性 xff0c 在程序中可以通过 数组名 length 的
  • 静态方法不需要有对象,可以使用类名调用

    Public static void printData 表明此类方法为类方法 xff08 静态方法 xff09 静态方法不需要有对象 xff0c 可以使用类名调用 静态方法中不允许访问类的非静态成员 xff0c 包括成员的变量和方法 xf
  • matlab练习程序(曲面拟合)

    这里用到的还是最小二乘方法 xff0c 和上一次这篇文章原理差不多 就是首先构造最小二乘函数 xff0c 然后对每一个系数计算偏导 xff0c 构造矩阵乘法形式 xff0c 最后解方程组 比如有一个二次曲面 xff1a z 61 ax 2
  • 高铁在高速运行时的电力是如何提供的?

    高铁在高速运行时的电力是如何提供的 xff1f 铁路机车是个庞大的家族 xff0c 高铁只是这个大家庭的一个新成员 xff0c 如果要连篇累牍赘述其他车辆 xff0c 恐怕这个答案是写不下的 xff0c 故本文针对高速铁路进行讨论 一 高铁
  • RS232通信协议详解

    通信协议 所谓通信协议是指通信双方的一种约定 约定包括对数据格式 同步方式 传送速度 传送步骤 检纠错方式以及控制字符定义等问题做出统一规定 xff0c 通信双方必须共同遵守 因此 xff0c 也叫做通信控制规程 xff0c 或称传输控制规
  • 学习C/C++的电子书大全

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在 学习C 43 43 的经典书籍 这篇文章中 xff0c 列出了C C 43 43 的经典书籍 xff1a C 43 43 Primer 第 5 版 中文版 英文版 Ef
  • 做Android开发的你还为找工作迷茫吗?通过直观的年薪来调准你的方向

    最近仍然有不少同学在找工作 xff0c 跳槽 现在跳槽不是一个好时机 可以看到现在的岗位明显减少了 很多公司都在赶今年的项目交付 xff0c 新的项目还没有规划好 xff0c 新一轮的融资也还没有到时间 很多在职的同学都在等到拿到年终奖再跳
  • 协议栈是什么

    1 协议栈是什么 简介 协议栈 xff0c 英语名称为Protocol stack xff0c 又称协议堆叠 xff0c 是计算机网络协议套件的一个具体的软件实现 协议套件中的一个协议通常是只为一个目的而设计的 xff0c 这样可以使得设计
  • 给linux杀杀毒吧

    linux是非常先进的 xff0c 但是没有绝对的安全 所以来杀杀毒吧 xff1a ClamAV是一个在命令行下查毒软件 xff0c 因为它不将杀毒作为主要功能 xff0c 默认只能查出您计算机内的病毒 xff0c 但是无法清除 xff0c
  • 服务器编程的语言,服务器编程语言的配置与CMS系统

    做过 1 服务器编程函数禁用找到 disable functions 61 该选项可以设置哪些服务器编程函数是禁止使用的 服务器编程中有一些函数的风险性还是相当大的 可以直接执行一些CentOS系统级脚本命令 如果允许这些函数执行 当服务器
  • Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...

    64 实验环境 OS Linux cj virtual machine 5 3 0 51 generic 虚拟机 QEMU 内核版本 5 3 4 调式方法 GDB PS xff1a 调试环境安装请看上一篇博客汇编级理解Linux系统调用 f