[fW]中断处理函数数组interrupt[]初始化
分类: LINUX
- 410 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
- 411 int vector = FIRST_EXTERNAL_VECTOR + i;
- 412 if (i >= NR_IRQS)
- 413 break;
- 414 if (vector != SYSCALL_VECTOR)
- 415 set_intr_gate(vector, interrupt[i]);
- 416 }
- 540 .data
- 541 ENTRY(interrupt)
- 542 .text
- 543
- 544 vector=0
- 545 ENTRY(irq_entries_start)
- 546 RING0_INT_FRAME
- 547 .rept NR_IRQS
- 548 ALIGN
- 549 .if vector
- 550 CFI_ADJUST_CFA_OFFSET -4
- 551 .endif
- 552 1: pushl $~(vector)
- 553 CFI_ADJUST_CFA_OFFSET 4
- 554 jmp common_interrupt
- 555 .data
- 556 .long 1b
- 557 .text
- 558 vector=vector+1
- 559 .endr
上面的代码开起来很乱,我们整理一下,使其更加易读,但是又不失其本质。
- .data
- ENTRY(interrupt)
- .long 1b //注意 如果把数据段放在这里那么1b要改为1f了,而且失去循环执行NR_IRQS次的功能。
//我们只能人为的把他们想象成被循环执行了NR_IRQS次 :)
- .text
- vector=0
- ENTRY(irq_entries_start)
- .rept NR_IRQS
- 1: pushl $~(vector)
- jmp common_interrupt
- vector=vector+1
我们把数据段放在一起,代码段放在一起。注意这里的代码段是用来初始化数据段的。
我们看到:interrupt作为一个内存标签,其内容为代码段标号1所表示的地址。同时我们也注意到这个interrupt数组的所有项的内容都是一样的:全部为“标号1”的符号地址。
每次外部中断来临时,硬件自动根据PIC或者APIC送出来的中断类型码(中断向量号)去查找中断描述符表的相应项,然后得到interrupt[n]的内容,继而转去执行标号1地址的代码,而标号1的代码仅将中断号取反后压入栈中,后立马跳到common_interupt标号处去执行。至于为什么要把中断向量号取反后压栈,则是由于内核用正的相应号去表示系统调用号,用负号来表示中断号。
细心的你有可能发现了一个问题:上述代码片段只是向interrupt表示的内存地址处存入大量重复的4字节数据,却没有象C语言定义数组那样定义interrupt[NR_IRQS-1],那么set_intr_gate这样的函数是如何确切的指导interrupt是一个数组呢,而且数组的内容是函数指针?
例如:set_intr_gate(vector,interrupt[i]);是如何取interrupt[i]内容呢?
啰嗦了这么半天...
如下一个声明就搞定了。
extern void (*interrupt[NR_IRQS])(void);//函数指针数组
- 566 common_interrupt:
- 567 SAVE_ALL
- 568 TRACE_IRQS_OFF
- 569 movl %esp,%eax
- 570 call do_IRQ
- 571 jmp ret_from_intr
- 572 CFI_ENDPROC
common_interrupt首先执行宏SAVE_ALL保存中断处理程序可能用到的寄存器(注意:cs eip ss esp由硬件自动保存)然后把栈顶指针传给eax寄存器后(eax寄存器内容将作为do_IRQ函数的参数)调用do_IRQ进行中断处理,返回后
执行ret_from_intr从中断返回。
[fW]中断处理函数数组interrupt[]初始化的更多相关文章
- C函数数组元素初始化
		初始化时,可随意指定初始化的元素或者元素的范围. 附gnu c 手册. http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html 代码: t ... 
- [fw]LINUX中断描述符初始化
		LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ... 
- 关于数组的初始化memset函数
		关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度. 
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
		1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ... 
- bootloader启动代码init.s解析----IRQ中断处理函数
		bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ... 
- 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程
		大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是以i.MXRT的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程. 在痞子衡旧文 <串口(UART)自动波特率识 ... 
- Linux驱动实践:中断处理函数如何【发送信号】给应用层?
		作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ... 
- 【转】中断处理函数中不用disable_irq而用disable_irq_nosync原因
		原文网址:http://blog.csdn.net/skyflying2012/article/details/8265869 今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现 ... 
- -1-1 java 基础语法     java关键字 java 注释 常量 语句 运算符 函数  数组定义
		Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ... 
随机推荐
- 【JAVA】 03-Java中的异常和包的使用
			链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: 异常 异常和错误的发生和区别 异常:java运行期间发 ... 
- Vue小白篇 - Vue介绍
			Vue ?啥是Vue?能干嘛? vue 的介绍 Vue 是一套用于构建用户界面的 渐进式框架 ,与其它大型框架不同的是, Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层 前端三大框 ... 
- 4.ireport基本使用
			转自:https://wenku.baidu.com/view/104156f9770bf78a65295462.html 第一部分,下载与安装 Ireport官网:http:// jasperfor ... 
- vue开发 - 根据vue-router的meta动态设置html里title标签内容
			1.路由文件 :router/index.js 添加 meta属性配置: import Vue from 'vue' import Router from 'vue-router' import in ... 
- mpvue 微信小程序半屏弹框(half-screen-dialog)
			<template> <div> <a @click="isShow">half-screen-dialog</a> <!-- ... 
- vscode编写代码快速生成html模板
			!(英文)+tab 自动生成HTML模板 
- 解决java compiler level does not match the version of the installed java project facet问题
			在编写项目的时候是,后来有改java写法,将工程改成了jdk1.7,后来工程就有了一个红叉,但是代码,文件里没有任何问题,也可以运行,不知道是什么原因,后来在problems里才知道是:java co ... 
- shell 函数传递参数的几种方式
			1.最近总结了 shell 中 function 的传递变量的几种方式 1.传递单个变量 2.传递数组变量 #!/bin/bash #trying to pass an variable. ... 
- 1、pip不是内部运行程序 解决方法
			一.方式一 1.切换到pip所在路径: shit+ 右键. 再此处打开运行窗口 2.执行 pip install pytest 脚本即可. 二.方式二,添加环境变量 1.将pip所在的文件路径 添加到 ... 
- ElasticSearch 单台服务器部署多个节点
			转载:https://www.cnblogs.com/wxw16/p/6160186.html 一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要 ... 
