中断处理有三个阶段

进入阶段:栈保存(带出错码的中断、不带出错码的中断)

处理阶段:中断处理

退出阶段:恢复栈

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(中断处理函数)相关推荐

  1. ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011

    然后我们再去看,es6中的函数参数的默认值的设置. 可以看到上面我写了个函数,然后 我们调用一下这个函数,并且打印了结果. 然后我们去看,如果我们调用这个函数的时候不写第3个参数 那么,可以看到得到的 ...

  2. python中list作为函数参数_在python中list作函数形参,防止被实参修改的实现方法

    0.摘要 我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变.本文将主要介绍这种错误的现象.原因和解决方法. 1.代码示例 def fun(inner_lst): inner_lst ...

  3. Day04:函数参数、对象、嵌套、闭包函数和装饰器

    上节课复习:     1.什么是函数         函数就是具备某一功能的工具     2.为何用函数         1.程序的组织结构和可读性         2.减少代码冗余         ...

  4. 封装成vla函数_第四章:Python之函数

    第一节:函数入门与定义函数 理解函数 所谓函数,就是为一段实现特定功能的代码"取"个名字,以后即可通过该名字来执行(调用)这段代码 从逻辑上看,函数相当于一个黑匣子 定义函数的语法 ...

  5. c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?

    看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...

  6. Python基础(可变数据类型不能做函数参数、装饰器、剥皮函数、时间间隔)

    1.可变数据类型不能做函数参数: 参数会动态改变 def func(a, l=[]):l.append(a)print(id(l))return lf1 = func(1) print(f1) # [ ...

  7. c语言main函数参数详解,c/c++程序main函数参数解析,以及参数传递的不同方法

    1. 程序运行时传递参数的不同方法: 1)通过命令参数传递参数: 2) 通过txt文件读取参数. 2. 方法举例 1)通过命令参数传递参数,即解析main函数的参数. main函数可以不带参数,也可以 ...

  8. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  9. 手机拍照打卡活动制作方案,通过拍照不聚集活动,函数参数(Function parameters)是在函数定义中所列的名称。

    <p>本例调用了一个执行计算的函数,然后返回结果:</p><p id="demo"></p><script> funct ...

最新文章

  1. html5 data url,HTML5 / Javascript – DataURL到Blob和Blob到DataURL
  2. 需求分析读书笔记(一)
  3. @noi.ac - 488@ cleaner
  4. 【JS】执行上下文(ExcecutionContext)
  5. 282. Expression Add Operators
  6. asp.net core 依赖注入问题
  7. Dell Inspiron 6400上安装Fedora 5后使声卡义务正常的方法
  8. TCP慢开始与拥塞避免
  9. jQuery 学习-样式篇(九):jQuery 存储和删除元素私有数据的方法
  10. Office groove系统的术语
  11. 一般python程序员的工资_【Python程序员工资|Python程序员待遇怎么样】-看准网
  12. 两数之和——python
  13. CMD连接MySQL,本地phpAdmin登陆
  14. 头歌 初识Redis
  15. GROUP BY clause and contains nonaggregated 报错处理
  16. originPro2021(8)在图中加直线方便查看数据
  17. 小云路由器mysql地址_小云OS3.0,极简操作,让小白玩转离线下载和NAS(转发)
  18. 国产FPGA市场分析 该如何破局
  19. uni-app中兴趣标签选择
  20. C语言学习1:从下载编译软件开始!DEV-C++、VC6.0、VS2010、VS2017等编译器的下载(Windows系统)

热门文章

  1. php memcached get,PHP Memcached操作类
  2. CentOS 环境下配置MySQL8.0
  3. sqlite3 c语言编程,SQLite教程(十三):C语言编程实例代码(1)
  4. linux怎么添加工作组,linux 用户与工作组
  5. 计算机网络-基本概念(7)【网络层】-多协议标记交换MPLS
  6. 马赛克,克星,真来了!
  7. 啥,不懂Docker 和 K8s 是原罪?
  8. shutil模块,为什么说它是os模块的兄弟模块?
  9. 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?
  10. list(map(list,zip(*a)))