linux中断处理函数参数,第9章 设置ISR(中断处理函数)
中断处理有三个阶段
进入阶段:栈保存(带出错码的中断、不带出错码的中断)
处理阶段:中断处理
退出阶段:恢复栈
80×86中有特权级的概念,不同的特权级有不同的栈,所以中断发生时要保存中断前的栈地址。
查看intel使用手册
interrupt.s源代码文件(参考linux 0.11源代码)
.global divide_error,debug_exception,nmi,breakpoint,overflow,bound,invalid_opcode
.global coprocessor_not_available,double_fault,coprocessor_segment_overrun,invalid_tss
.global segment_not_present,stack_exception,protection_exception,page_fault
.global intel_reserved,coprecessor_error,default_isr,timer
.include "kernel.inc"
divide_error:
pushl $do_divide_error
no_error_code:
xchgl %eax, (%esp) # &function-> %eax, 原%eax放到栈中
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs
pushl $0 # 填充错误码,作为中断处理函数的参数
lea 52(%esp), %edx #当前堆栈地址加上52后,放到edx中
pushl %edx #压edx入栈,这样中断处理函数就能获取到被压入栈的寄存器的值
movl $DATA_SEL, %edx
mov %dx, %ds
mov %dx, %es
mov %dx, %fs
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
invalid_tss:
pushl $do_invalid_tss
error_code:
xchgl %eax, 4(%esp) # error code -> %eax, 原eax放到栈中
xchgl %ebx, (%esp) # &function -> %ebx,原ebx放到栈中
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
pushl %ds
pushl %es
pushl %fs
pushl %eax # 压入错误码,作为中断处理函数的参数
lea 52(%esp), %eax # 当前堆栈地址加上52后,放到eax中
pushl %eax # 压eax入栈,这样中断处理函数就能获取到被压入栈的寄存器的值
movl $DATA_SEL, %eax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
call *%ebx
addl $8, %esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret
debug_exception:
pushl $do_debug_exception
jmp no_error_code
nmi:
pushl $do_nmi
jmp no_error_code
breakpoint:
pushl $do_breakpoint
jmp no_error_code
overflow:
pushl $do_overflow
jmp no_error_code
bound:
pushl $do_bound
jmp no_error_code
invalid_opcode:
pushl $do_invalid_opcode
jmp no_error_code
coprocessor_not_available:
pushl $do_coprocessor_not_available
jmp no_error_code
coprocessor_segment_overrun:
pushl $do_coprocessor_segment_overrun
jmp no_error_code
intel_reserved:
pushl $do_intel_reserved
jmp no_error_code
coprecessor_error:
pushl $do_coprocessor_error
jmp no_error_code
timer:
pushl $do_timer
jmp no_error_code
double_fault:
pushl $do_double_fault
jmp error_code
invaild_tss:
pushl $do_invalid_tss
jmp error_code
segment_not_present:
pushl $do_segment_not_present
jmp error_code
stack_exception:
pushl $do_stack_exception
jmp error_code
protection_exception:
pushl $do_protection_exception
jmp error_code
page_fault:
pushl $do_page_fault
jmp error_code
default_isr:
pushl $do_default_isr
jmp no_error_code
interrupt.h源代码文件
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
//在中断处理函数中,每个寄存器在栈中的下标
#define OLD_SS_REG 2
#define OLD_ESP_REG 1
#define OLD_EFLAGS_REG 0
#define OLD_CS_REG -1
#define OLD_EIP_REG -2
#define EAX_REG -3
#define EBX_REG -4
#define ECX_REG -5
#define EDX_REG -6
#define EDI_REG -7
#define ESI_REG -8
#define EBP_REG -9
#define DS_REG -10
#define ES_REG -11
#define FS_REG -12
extern void default_isr(void); //该函数定义在idt.c文件中
extern void divide_error(void);
extern void debug_exception(void);
extern void nmi(void);
extern void breakpoint(void);
extern void overflow(void);
extern void bound(void);
extern void invalid_opcode(void);
extern void coprocessor_not_available(void);
extern void double_fault(void);
extern void coprocessor_segment_overrun(void);
extern void invalid_tss(void);
extern void segment_not_present(void);
extern void stack_exception(void);
extern void protection_exception(void);
extern void page_fault(void);
extern void intel_reserved(void);
extern void coprecessor_error(void);
extern void timer(void);
extern void sys_call(void);
#endif
linux中断处理函数参数,第9章 设置ISR(中断处理函数)相关推荐
- ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011
然后我们再去看,es6中的函数参数的默认值的设置. 可以看到上面我写了个函数,然后 我们调用一下这个函数,并且打印了结果. 然后我们去看,如果我们调用这个函数的时候不写第3个参数 那么,可以看到得到的 ...
- python中list作为函数参数_在python中list作函数形参,防止被实参修改的实现方法
0.摘要 我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变.本文将主要介绍这种错误的现象.原因和解决方法. 1.代码示例 def fun(inner_lst): inner_lst ...
- Day04:函数参数、对象、嵌套、闭包函数和装饰器
上节课复习: 1.什么是函数 函数就是具备某一功能的工具 2.为何用函数 1.程序的组织结构和可读性 2.减少代码冗余 ...
- 封装成vla函数_第四章:Python之函数
第一节:函数入门与定义函数 理解函数 所谓函数,就是为一段实现特定功能的代码"取"个名字,以后即可通过该名字来执行(调用)这段代码 从逻辑上看,函数相当于一个黑匣子 定义函数的语法 ...
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...
- Python基础(可变数据类型不能做函数参数、装饰器、剥皮函数、时间间隔)
1.可变数据类型不能做函数参数: 参数会动态改变 def func(a, l=[]):l.append(a)print(id(l))return lf1 = func(1) print(f1) # [ ...
- c语言main函数参数详解,c/c++程序main函数参数解析,以及参数传递的不同方法
1. 程序运行时传递参数的不同方法: 1)通过命令参数传递参数: 2) 通过txt文件读取参数. 2. 方法举例 1)通过命令参数传递参数,即解析main函数的参数. main函数可以不带参数,也可以 ...
- java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?
1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...
- 手机拍照打卡活动制作方案,通过拍照不聚集活动,函数参数(Function parameters)是在函数定义中所列的名称。
<p>本例调用了一个执行计算的函数,然后返回结果:</p><p id="demo"></p><script> funct ...
最新文章
- html5 data url,HTML5 / Javascript – DataURL到Blob和Blob到DataURL
- 需求分析读书笔记(一)
- @noi.ac - 488@ cleaner
- 【JS】执行上下文(ExcecutionContext)
- 282. Expression Add Operators
- asp.net core 依赖注入问题
- Dell Inspiron 6400上安装Fedora 5后使声卡义务正常的方法
- TCP慢开始与拥塞避免
- jQuery 学习-样式篇(九):jQuery 存储和删除元素私有数据的方法
- Office groove系统的术语
- 一般python程序员的工资_【Python程序员工资|Python程序员待遇怎么样】-看准网
- 两数之和——python
- CMD连接MySQL,本地phpAdmin登陆
- 头歌 初识Redis
- GROUP BY clause and contains nonaggregated 报错处理
- originPro2021(8)在图中加直线方便查看数据
- 小云路由器mysql地址_小云OS3.0,极简操作,让小白玩转离线下载和NAS(转发)
- 国产FPGA市场分析 该如何破局
- uni-app中兴趣标签选择
- C语言学习1:从下载编译软件开始!DEV-C++、VC6.0、VS2010、VS2017等编译器的下载(Windows系统)
热门文章
- php memcached get,PHP Memcached操作类
- CentOS 环境下配置MySQL8.0
- sqlite3 c语言编程,SQLite教程(十三):C语言编程实例代码(1)
- linux怎么添加工作组,linux 用户与工作组
- 计算机网络-基本概念(7)【网络层】-多协议标记交换MPLS
- 马赛克,克星,真来了!
- 啥,不懂Docker 和 K8s 是原罪?
- shutil模块,为什么说它是os模块的兄弟模块?
- 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?
- list(map(list,zip(*a)))