Linux内核学习篇三:中断处理 -- asm.s和traps.c
三、中断发生时的堆栈变化情况
上图可以非常清楚的展示中断发生时堆栈的变化情况。即中断发生前,需要将图中的信息按照先后顺序,压入中断处理程序的堆栈中。下面进行具体的分析:
SS(stack segment): 堆栈段
ESP(extended stack pointer): 堆栈指针
EFLAGS : 状态标志寄存器
CS(code segment): 代码段
EIP(extended instruction pointer) : 中断后要执行的下一条指令的地址
图中有四个图,分别代表 有/无 出错码, 有/无 优先级变化 的四种组合情况。
1)有/无 出错码:我们只需知道,对于某些中断,比如:int0 是不需要保存出错码的,而像int8等中断是需要保存出错码的。所以对于不同的中断,堆栈变化不同。需要保存出错码的,必须在堆栈最后压入出错码。
2)有/无 优先级变化:如果中断发生前处于用户态(优先级==3级),发生中断时需要变为内核态(优先级==0级),我们称其为中断时的优先级发生了变化。对于优先级变化的中断,需要在堆栈的一开始压入 SS 和 ESP , 它们分别代表用户态下的堆栈段和堆栈指针。这里的目的是为了保存上下文。
总结如下:
1)中断过程,实质上就是保存上下文的过程,所以体现在中断处理程序的堆栈发生变化。
2)对于不同类型的中断,要考虑是否保存出错码;对于优先级变化的中断,要考虑保存用户态的SS和ESP。
3)中断过程就是 “中断前,将当前数据压入堆栈” -> “asm.s 调用 traps.c 处理中断程序”-> “中断完成后,将数据压出堆栈,恢复状态”
四、中断处理文件 --- asm.s
了解了中断发生时的中断程序的堆栈变化情况,我们就可以分析程序了,因为程序就是按照上述堆栈的变化情况来编写的。
asm.s 涵盖了 int0 ~ int15 中除int7,int14之外的一共14个中断处理程序。还记得吗?这些中断在“二、中断基本知识”中提到过,它们都是Intel固定设置的软件中断。
asm.s 采用了AT&T汇编格式进行编写,首先在程序开始,声明了所有的中断函数名称。如下所示:
在“一、中断处理的程序/文件”中,我们提到过 asm.s 中调用的函数是在 traps.c 中定义的,所以看到这里大家明白了吗?由于traps.c 中定义的函数在 asm.s 中无法直接调用,所以需要先用“.globl”进行声明才能调用(相当于C语言中的extern声明)。另外,一个小插曲,比如这里的“_divide_error”是函数的入口地址,是 traps.c 中“void divide_error(void)”的入口地址,名称也是非常的相似~因为它们都是一一对应的。
asm.s 程序的核心是以下两个函数。
1)no_error_code: 此汇编函数负责编写了不需要出错码的入栈,处理,出栈的代码。
2)error_code: 此汇编函数负责编写了添加出错码的入栈,处理,出栈的代码。
五、中断处理文件 --- traps.c
之前也反复强调了,traps.c 程序包含了 asm.s 中所有中断函数的函数原型。中断发生时,asm.s 会 “call” 这些函数,处理中断。
问题:那 traps.c 中的这些函数到底是怎样处理中断的呢?
答案:打印错误信息,这可能会让你失望了,不过确实如此,对于Inter这些固定的软件中断(int0 ~ int16),当发生时,我们所做的也就是打印出中断的名称,出错号,寄存器信息,进程信息等等。
所有中断发生时打印中断信息,这个过程是通过 “die函数”实现的。下面给出die函数原型。
Linux内核学习篇三:中断处理 -- asm.s和traps.c相关推荐
- Linux内核学习(三):Bootloader的特种兵-Uboot(一)
Linux内核学习(三):Bootloader的特种兵-Uboot(一) 内容全部来自–><嵌入式应用开发完全手册> 1.什么是U-Boot U-Boot,全称为Universal ...
- linux内核学习初级篇
Linux内核获取地址 官网: https://www.kernel.org/ Linux操作系统的核心是模块化,可以使用lsmod命令查看内核模块,下面展示已载入系统的模块: Module Size ...
- Linux内核学习(三)之asm.s和trap.c的关联!
前言: 大家好,今天给大家解析一下Linux中断处理流程里面asm.s和trap.c里面源码,对于Linux中断工作流程不清楚的朋友,可以看上篇文章,这里再提示一下asm.s和trap.c的源码目录: ...
- Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核
Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核 一.下载内核源码 wget http://ftp.sjtu.edu ...
- Linux内核学习(七):linux kernel内核启动(一):概述篇
Linux内核学习(七):linux kernel内核启动(一):概述篇 这一篇让我们来大致的了解一下Linux内核的启动过程 这篇文章不涉及源码,重在让你知道这个linux内核的启动过程,源码详细的 ...
- Linux疑难杂症解决方案100篇(十五)-万字长文带你深入Linux 内核学习:环境搭建和内核编译
一.linux内核学习之一:环境搭建--安装Debian7.3 本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基 ...
- linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......
课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...
- Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)
最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与算法.操作系统原理.计算机组成原理.计算机体系结构.在囫囵吞枣补完一些计算机基 ...
- linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程
贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...
- 学做Linux内核,Linux内核学习(3) 最小系统制做2 busybox制做initrd.img和根文件系统...
busybox制做initrd.img和根文件系统 (一)开发环境介绍 1.使用win7_64的笔记本安装Virtualbox虚拟机,笔记本cpu为i5-2450m.虚拟机上安装Ubuntu16.04 ...
最新文章
- “僵尸病毒”入侵全球电脑,7.5万部电脑中招(来源:广州日报)
- 记一下常用shell,防止自己忘了。。。记性不好
- 004 关于Java如何扫描指定package下所有的类
- 【项目管理】人力资源管理
- .NET常用工具类集锦
- 【2017年第4期】大数据平台的基础能力和性能测试
- Python Excel工具类封装, 实现excel表头加颜色
- BlackBerry 黑莓 7230 7290 快捷键
- Java类加载机制--类加载过程(加载)
- matlab 求信号频率响应,频率响应
- MATLAB Simulink
- MathWorks 中国
- ffmpeg给视频加水印
- POJ:3276-Face The Right Way(线性反转)
- 公共数据库介绍~datahub
- 《管理长歌行》——乌龟的另一种能力
- 自动加载的iframe高度自适应
- 《计算机组成原理》期末习题讲解和重点复习内容
- UML类图以及常用集合
- 【推荐收藏】平面设计要求之印刷输出注意事项
- K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停
- DD-WRT 客户端模式设置 暨添加无线连接功能
热门文章
- Pico Neo3 VR Pro 开发新手入门有感(避坑与心得,新手学习必备,瞬移射线传送,移动,射线传送光圈效果,传送指定区域)
- html5彩盒插件画廊,jQuery轻量级响应式LightBox图片画廊插件
- 小小精彩的flash
- opencv的第一个lena图片显示
- [软件更新]影拓三代 PTZ系列 系列 驱动程序 V6.1.1-3{链接已修复}
- 38张史上最全的IT架构师技能图谱(高清版下载)
- apache commons-beanutils中BeanUtils和PropertyUtils区别
- DDR3:MIG控制器设计(vivado)
- java右移位_Java移位运算符详解实例
- opencv学习(二十四)之腐蚀与膨胀