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

news/2025/2/3 20:59:07/

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 <-> %eaxxchgl %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_debugjmp no_error_code

nmi

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

nmi:pushl $do_nmijmp no_error_code

int3

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

int3:pushl $do_int3jmp no_error_code

overflow

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

overflow:pushl $do_overflowjmp no_error_code

bounds

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

bounds:pushl $do_boundsjmp no_error_code

invalid_op

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

invalid_op:pushl $do_invalid_opjmp no_error_code

coprocessor_segment_overrun

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

coprocessor_segment_overrun:pushl $do_coprocessor_segment_overrunjmp no_error_code

reserved

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

reserved:pushl $do_reservedjmp 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_TSSjmp error_code

segment_not_present

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

segment_not_present:pushl $do_segment_not_presentjmp error_code

stack_segment

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

stack_segment:pushl $do_stack_segmentjmp error_code

general_protection

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

general_protection:pushl $do_general_protectionjmp error_code

Q & A


http://www.ppmy.cn/news/101133.html

相关文章

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

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

国内免费可用的ChatGPT网站【实时更新】

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展7.国内免费ChatGPT镜像写在最后 ChatGPT国内能用吗&#xff1a;ChatGPT在国内是无法使用的。你肯定要问我怎样才能体验到ChatGPT的神奇魔力呢&#xff1f;文…

小型流水线模型的制作

1. 功能说明 本文示例将实现R327a样机——一款5工序的小型流水线模型&#xff0c;包含铸锭送料、传送、搬运、模拟加工、码垛5个工序。 2. 结构说明 小型流水线主要是由铸锭送料结构、传送机构、搬运机构、模拟加工机构、码垛机构5部分组成。 3. 电子硬件 在这个示例中&#xf…

算法能力-数据安全复合治理框架和模型解读(5)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地数据安全治理科技水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理…

flex布局总结

flex布局总结 总结自&#xff1a;https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 内容&#xff1a; flex意思是-弹性布局&#xff0c;可以为盒型模型提供极大的灵活性&#xff0c;设置为flex布局后&#xff0c;子元素的fload clear vertical会失效 概念&#x…

人生苦短,我用Python:如何入门Python的世界

人生苦短&#xff0c;我用Python&#xff1a;如何入门Python的世界 Python是一门非常简洁、易读、高效的编程语言&#xff0c;适合初学者入门。自从1991年问世以来&#xff0c;Python已经在全球范围内成为了众多工程师、科研人员、数据分析师等人群的首选编程语言。本文将详细…

剑指 Offer 06. 从尾到头打印链表

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f681; 个人主页&#xff1a;不 良 &#x1f525; 系列专栏&#xff1a;&#x1f6f8;剑指 Offer &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0c;厚积而薄…

前端技术搭建贪吃蛇小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了井字游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个贪吃蛇游戏&#xff0c;功能也比较简单简单&#xff0c;也…