前言:

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

asm.s和trap.c的源码路径

然后asm.s主要是干嘛的:

/** asm.s contains the low-level code for most hardware faults.* page_exception is handled by the mm, so that isn't here. This* file also handles (hopefully) fpu-exceptions due to TS-bit, as* the fpu must be properly saved/resored. This hasn't been tested.*/

asm.s包含大多数硬件故障的低级代码。页异常由mm处理,所以这里没有。这 个文件还处理(希望)由于TS位导致的fpu(浮点运算器)异常,如必须正确保存/解析fpu。这里还没有经过测试。

asm.s和trap.c解析:

在解读这两个文件的源码之前,我先从Linux内核的main函数开始:

没错这里有一个异常初始化接口:

trap_init();

我为什么先讲这个呢,主要是让大家明白主线,然后后面要让asm.s和trap.c里面的c函数接口关联起来;我们来看一下trap_init()接口里面主要干了啥:

这里提示一下这个接口:

//idt就是中断描述表,这里就是往表里填中断号和中断程序的地址
#define set_trap_gate(n,addr) \_set_gate(&idt[n],15,0,addr)

这个时期的内核中断号范围是:0~16,后期的中断号作为扩展保留使用,这个我们可以从这段代码看出来。关于这个中断号的具体含义可以参考下面这个:

我们再来追一下真正_set_gate代码实现:

#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \"movw %0,%%dx\n\t" \"movl %%eax,%1\n\t" \"movl %%edx,%2" \: \: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \"o" (*((char *) (gate_addr))), \"o" (*(4+(char *) (gate_addr))), \"d" ((char *) (addr)),"a" (0x00080000))

这段汇编代码,您可以不用关注里面的细节,当然这个我会在后面详细展开解析,这里您只要知道这个在Linux内核里面是一种典型嵌入式汇编代码书写的形式,因为内核里面有很多这种写法。

在开始正式分析源码之前,等下您需要结合下面的这副思维框架图去看asm.s的汇编代码:

好了,下面来看asm.s里面的汇编代码,具体的汇编代码语法,你不用过多去关注,大概结合刚才的思维图,过一下整个过程:

我这里举个无错误码的代码来分析,有错误码的,您可以参考这个来分析:

_divide_error:pushl $_do_divide_error//把一个c语言函数入栈
no_error_code://无错误断码中断xchgl %eax,(%esp) //我这里举个例子,通过堆栈指针esp1所指的位置,把do_divide_error函数的地址通过交换汇编指令xchg存放到eax寄存器中去pushl %ebxpushl %ecxpushl %edxpushl %edipushl %esipushl %ebppush %dspush %espush %fspushl $0  # "error code"lea 44(%esp),%edxpushl %edxmovl $0x10,%edxmov %dx,%dsmov %dx,%esmov %dx,%fscall *%eax  //调用对应的c函数接口addl $8,%esppop %fspop %espop %dspopl %ebppopl %esipopl %edipopl %edxpopl %ecxpopl %ebxpopl %eaxiret_debug://这是一个中断pushl $_do_int3  # _do_debugjmp no_error_code//跳转

上面的push是把寄存器ebx等压入栈中去,pop则进行出栈,位置刚好相反!这里刚好结合上篇的中断工作流程来看,在进行执行中断服务函数之前,就准备我们上面的压栈操作,然后等中断服务函数执行完毕后,出栈,回到中断之前的位置!

同时这里我们可以看到在执行单步中断调试时,就会跳转到no_error_code这里,而:

pushl $_do_int3

是把函数地址压入栈,这一切都是在为执行c语言函数do_int3做准备,我们可以来这个接口在哪里被定义:

没错,它是在trap.c里面进行定义的,那么我们就可以看出:asm.s最终执行的中断服务函数,都在trap.c里面找到它的定义,这就是asm.s和trap.c的关系。

总结:

今天的内容就分享到这里,我们下期见!大家有空可以多多看看上面的源码!加以理解。

文章资料相关参考:

  • Linux内核0.11完全注释

  • https://www.bilibili.com/video/BV1tQ4y1d7mospm_id_from=333.337.search-card.all.click

往期文章:

Linux内核学习(一)

Linux内核学习之Linux中断工作流程框架!

对了,个人朋友圈,已经开放,坑位有限,时常分享一些非技术性的东西,感兴趣的,可以来唠唠嗑,交个朋友;技术方面的也行,大家相互学习,共同进步:三人行,必有我师焉!

我扫你,还是你扫我?

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

  1. (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

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

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

  3. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  4. 我的Linux内核学习笔记

    在开始今天的内容之前,其实有一些题外话可以和大家分享一下.自从工作以来,我个人一直都有一个观点.那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问.有些道理看上去 ...

  5. linux内核调度,Linux内核的三种调度策略

    一 Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 ...

  6. linux网卡配子接口,linux 内核学习(2).

    linux 内核学习(2). (2011-07-18 01:45:46) 标签: 杂谈 linux内核源码树基本构造 由于linux的原代码继续在改变,因而不可能给出太翔实的内容,只能指出一个特异的驱 ...

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

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

  8. linux 内核学习11-内核模块参数

    linux 内核学习11-内核模块参数 内核模块作为一个可拓展的动态模块,为Linux内核提供灵活性,所以需要依据不同的场景来传递不同的参数,实现不同的功能 1. 准备工作 #define modul ...

  9. 深入理解Linux内核 学习Linux内核的一些建议及书记推荐

    深入理解Linux内核 学习Linux内核的一些建议_华清远见教育集团 经典书籍 待到山花烂漫时,还是那些经典在微笑. 有关内核的书籍可以用汗牛充栋来形容,不过只有一些经典的神作经住了考验.首先是5本 ...

最新文章

  1. 什么时候应该在内部联接上使用交叉应用?
  2. 10月15日云栖精选夜读 | 阿里巴巴 Apache Dubbo 布道师谈 Service Mesh
  3. 【Linux】11.将ubuntu电脑设置为一台可远程ssh或sftp访问的服务器
  4. php 提交表单跳转页面,form表单页面跳转方式提交练习
  5. Spring5的集成兼容
  6. 5类6类7类网线对比_孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快...
  7. 关于Django中的数据库操作API之distinct去重的一个误传
  8. 自定义 Spark item 的渲染器
  9. Python统计多个Powerpoint文件中幻灯片总数量
  10. 一条语句引发的思考:装箱和拆箱,空指针的类型转换
  11. 嵌入式DM(data matrix)码检测
  12. Windows下常见的SQLite管理工具
  13. 史上最强Js流程控制三大结构
  14. 怎么把ogg音频格式转换为mp3
  15. 计算机科学与探索、计算机工程与应用投稿经验分享
  16. 中国超高清视频产业发展白皮书(2018)
  17. AOTF偏振光谱成像仪的原理及构造
  18. 语音广播Jenkins任务状态
  19. 文本溢出显示省略号时展示‘查看更多’按钮
  20. 玻尔兹曼分布详细推导、softmax 及 Energy Based Model

热门文章

  1. 交直流双电源无缝切换
  2. URL编码原理及对照表
  3. 联发科c语言笔试,联发科面试
  4. Hololens第三人称视角Spectator View!
  5. TV线/AV线/S端子线的使用方法
  6. 无线蓝牙耳机什么牌子的比较好?防水蓝牙耳机推荐
  7. clipboard.js,点击复制到系统剪切板,适合移动端、PC端复制
  8. 单纯形表的简单方法。
  9. 玩转ChatGPT:Excel操作初探
  10. 深入研究池化技术——对象池