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

news2024/12/23 10:08:19

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Logisim 头歌 16位海明编码电路设计 图解及代码(计算机组成原理)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 急的同学请直接点击目录跳到下方解答处&#xff01;&#xff01; 目录 图解&#xff1a; 代码题解&#xff08;免费&#xff09;&#xff1a; 实…

SpringCloudConfigServer配置刷新优化方案

前一文章《SpringCloudConfigServer配置中心使用与刷新详解》 介绍了Spring Cloud原生配置中心的部署方案&#xff0c;以及配置变更时的刷新方案。 通过该文可以看到&#xff1a; 第一种方案无法同时刷新单个服务的所有实例第二种方案依赖于消息中间件&#xff08;RabbitMQ或k…

自动驾驶汽车的安全技术特点

“安全第一”是自动驾驶的核心理念和价值观。 自动驾驶车辆的整体系统安全设计是一项复杂的系统工程&#xff0c; 涉及车载自动驾驶系统的核心算法策略设计、 硬件和软件冗余安全设计、远程云代驾技术、 全流程测试验证技术等&#xff0c; 并遵循功能安全&#xff08;ISO 2626…

《数据库应用系统实践》------ 酒店客房管理系统

系列文章 《数据库应用系统实践》------ 酒店客房管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&…

品种小组2期—凯利公式在RFI策略中的运用

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;今天我们来聊一聊松鼠2期V2版本的阶段内容——凯利公式在RFI择时框架上的运用。 松鼠品种小组2期第1版策略、讲解视频已完结&#xff0c;该期小组我们分享了全新“普适性、自适应”择…

0基础学习VR全景平台篇第32章:场景功能-嵌入视频

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 一、本功能将用在哪里&#xff1f; 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四种不同类型内容&#xff1b; 本次主要带来视频类型的介绍&#xff0c;通过嵌入视频功能&#xff0c;…

python+django+vue关爱无主狗流浪狗动物领养公益网站

很多的家庭都开始有养个小宠物的习惯&#xff0c;平时可以排解寂寥。随着近些年来大家养宠物的数量逐日剧增,人类对自己行为的规范与责任感渐渐的缺失,从而造成社会上的流浪动物也越来越多。流浪狗的伤人的事件则更多的出现在了报纸&#xff0c;电视&#xff0c;网络上。国家社…

git 项目演练:007

接下来进行项目演练&#xff0c;这是一个项目提交到git一个完整过程 1. 创建一个项目&#xff0c; 如下&#xff0c;我创建了一个“测试项目” 2. 将项目添加到git管理仓库&#xff0c;打开Git Bash&#xff0c; cd到“测试项目”中 3. 使用git init 命令将项目添加&#xff0c…

python基于pygame库实现弹幕效果(多行显示,速度不同,颜色不同,循环显示)

一、实现目标 使用python实现类似弹幕的显示效果,弹幕文本存储在txt文件中,弹幕多行显示,弹幕颜色不同有区别,弹幕的速度不一,弹幕要循环显示。 弹幕文本数据:danmu.txt 永远的神 哥哥,好帅啊 啊啊啊啊 太好看啦 666 爱了爱了 啦啦啦啦啦啦 牛逼!牛逼!牛逼! 厉害啊…

5G的遮羞布又被撕了,只是这次是韩国,5G为何变成如此模样?

日前韩国公平交易委员会发布声明&#xff0c;对韩国三大运营商重罚336亿韩元&#xff0c;原因是韩国夸大5G网速&#xff0c;实际网速不到理论速率的十分之一&#xff0c;可以说韩国撕下了5G的遮羞布。 韩国公平交易委员会指出运营商宣传5G的时候强调5G的理论速度可以达到10Gbps…

JavaScrip练习

HTMLJS计算器 <!DOCTYPE html> <html> <head><title>Calculator</title> </head> <body> <!-- 计算器显示 --> <input type"text" id"display" disabled> <br><!--计算器按钮onclick &am…

数据偏度介绍和处理方法

偏度&#xff08;skewness&#xff09;是用来衡量概率分布或数据集中不对称程度的统计量。它描述了数据分布的尾部&#xff08;tail&#xff09;在平均值的哪一侧更重或更长。偏度可以帮助我们了解数据的偏斜性质&#xff0c;即数据相对于平均值的分布情况。 有时&#xff0c;正…

自主品牌份额持续提升!福特CEO表态,中国车企才是竞争对手

2023年1-4月&#xff0c;中国市场自主品牌乘用车新车交付275.13万辆&#xff0c;份额占比48.63%&#xff0c;两项数字分别比上年同期增长4.68%&#xff0c;以及提升约3个百分点。其中&#xff0c;新能源汽车继续成为主要推动因素。 “中国电动汽车制造商是我们的主要竞争对手&a…

使用Vuex进行状态管理

在Vue.js应用程序中&#xff0c;状态管理是一个重要的主题。当应用程序变得复杂&#xff0c;组件之间的状态共享和通信变得困难&#xff0c;这时候使用Vuex就会变得十分有用。Vuex是一个专门为Vue.js设计的状态管理库&#xff0c;它提供了一个集中式的状态管理方案&#xff0c;…

Logisim 头歌 偶校验编码设计图解及代码(计算机组成原理)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 急的同学请直接点击目录跳到下方解答处&#xff01;&#xff01; 目录 图解&#xff1a; 代码题解&#xff08;免费&#xff09;&#xff1a; 实…

PyTorch-Sequential

Cifar-10用的模型结构&#xff1a; 第一次卷积 (3,32,32) to (32,32,32) 卷积核&#xff08;55&#xff09;&#xff0c;我们需要进行一下计算&#xff0c;看看padding和stride是多少: 未引入Sequential前&#xff1a; import torch from torch import nn from torch.nn impo…

如何用chatGPT赚钱?

赚钱思路 1&#xff09;初级-账号 对于新事物的出现&#xff0c;很多人对此都是抱着一个看热闹的态度&#xff0c;大家对于这个东西的整体认知水平是很低的&#xff01; 所以这个时候的思路就是快速去抢占市场&#xff0c;去各个平台发一些和ChatGPT相关的视频和文章去抢占市…

速递:惠州学院生科院副院长谢海伟一行莅临易基因科技参观交流 | 校企合作

2023年05月26日上午&#xff0c;惠州学院生命科学学院副院长谢海伟教授、陈兆贵教授、陈勇智博士、龚浩博士及生科院本科毕业生陈佳良一行5人莅临深圳市易基因科技有限公司参观交流&#xff0c;并举行“惠州学院实践教学基地“挂牌仪式。易基因总经理王君文、副总经理丁振东等公…

vue项目中使用depcheck检查缺失的依赖项目

使用depcheck检查缺失的项目依赖 由来&#xff1a;今天在做地铁的时候&#xff0c;刷短视频发现一个非常好用的东西&#xff0c;分享一下 它可以帮助我们找出问题&#xff0c;在 package.json 中&#xff0c;每个依赖包如何被使用、哪些依赖包没有用处、哪些依赖包缺失。它是解…

EMC测试中放大器的线性度验证

在进行EMC抗扰度测试时&#xff0c;必须在所有适用的测试频率下检查所用射频功率放大器的线性度。检查方法如下&#xff1a; 确定产生测试电平所需的功率&#xff0c;包括调制。例如: 测试电平:10v /m 调制:80% AM, 1 kHz 所需场强包括调制:18 V/m 辐射抗干扰校准配置示例 在特…