从本篇开始,我们将陆续对kernel目录进行分析和总结。linux/kernel文件夹中的程序主要完成进程调度和系统调用等功能。
从功能上来说,主要是以下三类:
1)中断处理程序文件
2)系统调用服务处理文件
3)进程调度等通用文件
由于kernel目录比较复杂,本篇先主要分析和介绍1)内核中断处理程序文件的实现。
一、中断处理的程序/文件
linux/kernel目录下的中断处理文件主要是两个:asm.s 和 traps.c。当然,像在system_call.s文件中,还包含了系统调用中断(int128), 时钟中断(int32),软盘中断(int38)等多个中断的处理过程。但是我们这里选择将system_call.s放在2)系统调用篇中进行介绍。
关于asm.s 和 traps.c 两个程序文件的关系:asm.s 是汇编文件,主要实现大部分硬件中断(异常)引起的中断处理过程;trap.c 是C语言源文件,内部是各种中断处理的C函数,这些函数在asm.s中进行调用。
所以总结一下:
1)中断处理程序主要指的是asm.s 和 traps.c。但是没有涵盖全部的中断处理。本篇只介绍asm.s 和 traps.c两个文件。
2)关于二者的关系:traps.c 负责声明和定义各种中断的C函数,然后asm.s 通过调用 trap.c 中的各种C函数,实现真正的中断处理。
二、中断基本知识
这里为了下面更好的理解源代码。先来回顾一下中断的基本内容。
中断分为硬件中断和软件中断。
中断范围:int0 ~ int255。
int0 ~ int31 : 软件中断,由Intel固定设置的。
int32 ~ int255: 可由用户自己设置。其中int32 ~ int47 对应8259A的IRQ0 ~ IRQ15中断。
特殊的一个:int128 为系统调用中断(system_call)。

三、中断发生时的堆栈变化情况

上图可以非常清楚的展示中断发生时堆栈的变化情况。即中断发生前,需要将图中的信息按照先后顺序,压入中断处理程序的堆栈中。下面进行具体的分析:

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函数原型。

六、篇尾总结
本篇主要是介绍内核中的中断处理过程和程序,介绍了中断的基本知识,特别是针对 int0 ~ int16 的各个中断,分析了两个关键文件 asm.s 和 traps.c 。重点说明了文件中的关键函数和实现过程。本篇主要进行总结和归纳,致力于能够最简便的理清内核中断处理的关系和过程,如果对细节感兴趣的同学可以继续阅读源代码,加强学习~

Linux内核学习篇三:中断处理 -- asm.s和traps.c相关推荐

  1. Linux内核学习(三):Bootloader的特种兵-Uboot(一)

    Linux内核学习(三):Bootloader的特种兵-Uboot(一) 内容全部来自–><嵌入式应用开发完全手册> 1.什么是U-Boot U-Boot,全称为Universal ...

  2. linux内核学习初级篇

    Linux内核获取地址 官网: https://www.kernel.org/ Linux操作系统的核心是模块化,可以使用lsmod命令查看内核模块,下面展示已载入系统的模块: Module Size ...

  3. Linux内核学习(三)之asm.s和trap.c的关联!

    前言: 大家好,今天给大家解析一下Linux中断处理流程里面asm.s和trap.c里面源码,对于Linux中断工作流程不清楚的朋友,可以看上篇文章,这里再提示一下asm.s和trap.c的源码目录: ...

  4. Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核

    Mastering Embedded Linux Programming 学习 (三)在百问网157开发板上,编译构建linux内核 一.下载内核源码 wget http://ftp.sjtu.edu ...

  5. Linux内核学习(七):linux kernel内核启动(一):概述篇

    Linux内核学习(七):linux kernel内核启动(一):概述篇 这一篇让我们来大致的了解一下Linux内核的启动过程 这篇文章不涉及源码,重在让你知道这个linux内核的启动过程,源码详细的 ...

  6. Linux疑难杂症解决方案100篇(十五)-万字长文带你深入Linux 内核学习:环境搭建和内核编译

    一.linux内核学习之一:环境搭建--安装Debian7.3 本系列文章假设读者已对linux有一定的了解,其实学习linux内核不需要有很深的关于linux的知识,只需要了解以下内容:linux基 ...

  7. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  8. Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)

    最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与算法.操作系统原理.计算机组成原理.计算机体系结构.在囫囵吞枣补完一些计算机基 ...

  9. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  10. 学做Linux内核,Linux内核学习(3) 最小系统制做2 busybox制做initrd.img和根文件系统...

    busybox制做initrd.img和根文件系统 (一)开发环境介绍 1.使用win7_64的笔记本安装Virtualbox虚拟机,笔记本cpu为i5-2450m.虚拟机上安装Ubuntu16.04 ...

最新文章

  1. “僵尸病毒”入侵全球电脑,7.5万部电脑中招(来源:广州日报)
  2. 记一下常用shell,防止自己忘了。。。记性不好
  3. 004 关于Java如何扫描指定package下所有的类
  4. 【项目管理】人力资源管理
  5. .NET常用工具类集锦
  6. 【2017年第4期】大数据平台的基础能力和性能测试
  7. Python Excel工具类封装, 实现excel表头加颜色
  8. BlackBerry 黑莓 7230 7290 快捷键
  9. Java类加载机制--类加载过程(加载)
  10. matlab 求信号频率响应,频率响应 - MATLAB Simulink - MathWorks 中国
  11. ffmpeg给视频加水印
  12. POJ:3276-Face The Right Way(线性反转)
  13. 公共数据库介绍~datahub
  14. 《管理长歌行》——乌龟的另一种能力
  15. 自动加载的iframe高度自适应
  16. 《计算机组成原理》期末习题讲解和重点复习内容
  17. UML类图以及常用集合
  18. 【推荐收藏】平面设计要求之印刷输出注意事项
  19. K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停
  20. DD-WRT 客户端模式设置 暨添加无线连接功能

热门文章

  1. Pico Neo3 VR Pro 开发新手入门有感(避坑与心得,新手学习必备,瞬移射线传送,移动,射线传送光圈效果,传送指定区域)
  2. html5彩盒插件画廊,jQuery轻量级响应式LightBox图片画廊插件
  3. 小小精彩的flash
  4. opencv的第一个lena图片显示
  5. [软件更新]影拓三代 PTZ系列 系列 驱动程序 V6.1.1-3{链接已修复}
  6. 38张史上最全的IT架构师技能图谱(高清版下载)
  7. apache commons-beanutils中BeanUtils和PropertyUtils区别
  8. DDR3:MIG控制器设计(vivado)
  9. java右移位_Java移位运算符详解实例
  10. opencv学习(二十四)之腐蚀与膨胀