Linux内核学习(三)之asm.s和trap.c的关联!
前言:
大家好,今天给大家解析一下Linux中断处理流程里面asm.s和trap.c里面源码,对于Linux中断工作流程不清楚的朋友,可以看上篇文章,这里再提示一下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的关联!相关推荐
- (笔记)Linux内核学习(三)之进程调度
进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...
- Linux内核学习(三):Bootloader的特种兵-Uboot(一)
Linux内核学习(三):Bootloader的特种兵-Uboot(一) 内容全部来自–><嵌入式应用开发完全手册> 1.什么是U-Boot U-Boot,全称为Universal ...
- linux内核学习之三:linux中的32位与64位
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- 我的Linux内核学习笔记
在开始今天的内容之前,其实有一些题外话可以和大家分享一下.自从工作以来,我个人一直都有一个观点.那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问.有些道理看上去 ...
- linux内核调度,Linux内核的三种调度策略
一 Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 ...
- linux网卡配子接口,linux 内核学习(2).
linux 内核学习(2). (2011-07-18 01:45:46) 标签: 杂谈 linux内核源码树基本构造 由于linux的原代码继续在改变,因而不可能给出太翔实的内容,只能指出一个特异的驱 ...
- linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......
课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...
- linux 内核学习11-内核模块参数
linux 内核学习11-内核模块参数 内核模块作为一个可拓展的动态模块,为Linux内核提供灵活性,所以需要依据不同的场景来传递不同的参数,实现不同的功能 1. 准备工作 #define modul ...
- 深入理解Linux内核 学习Linux内核的一些建议及书记推荐
深入理解Linux内核 学习Linux内核的一些建议_华清远见教育集团 经典书籍 待到山花烂漫时,还是那些经典在微笑. 有关内核的书籍可以用汗牛充栋来形容,不过只有一些经典的神作经住了考验.首先是5本 ...
最新文章
- 什么时候应该在内部联接上使用交叉应用?
- 10月15日云栖精选夜读 | 阿里巴巴 Apache Dubbo 布道师谈 Service Mesh
- 【Linux】11.将ubuntu电脑设置为一台可远程ssh或sftp访问的服务器
- php 提交表单跳转页面,form表单页面跳转方式提交练习
- Spring5的集成兼容
- 5类6类7类网线对比_孩子们长高的黄金时期是从3月到5月,这阶段多吃6类食物长得快...
- 关于Django中的数据库操作API之distinct去重的一个误传
- 自定义 Spark item 的渲染器
- Python统计多个Powerpoint文件中幻灯片总数量
- 一条语句引发的思考:装箱和拆箱,空指针的类型转换
- 嵌入式DM(data matrix)码检测
- Windows下常见的SQLite管理工具
- 史上最强Js流程控制三大结构
- 怎么把ogg音频格式转换为mp3
- 计算机科学与探索、计算机工程与应用投稿经验分享
- 中国超高清视频产业发展白皮书(2018)
- AOTF偏振光谱成像仪的原理及构造
- 语音广播Jenkins任务状态
- 文本溢出显示省略号时展示‘查看更多’按钮
- 玻尔兹曼分布详细推导、softmax 及 Energy Based Model