[Fw]中断的初始化
要使用中断肯定得初始化,这些初始化在系统启动时已经为你做好了,但是我们还是来看看怎样初始化的,这样就能更好的理解中断机制了。
先看下面函数:
362 init_8259A(0); |
上面的函数分为两个部分,一 个是init_8259A(0),另一个就是for循环了。从名字上我们就可以看出init_8259A()是干什么的了,它是用来初始化8259A的, 设置它的相关寄存器,指明了它的工作方式。下面的for循环,一共循环了NR_IRQS(224)次,将刚才所讲的irq_desc[]初始化,初始化了 status,action,depth字段,然后如果是前16个调用set_irq_chip_and_handler_name(),再往下看如果大 于16,那么给字段chip赋no_irq_chiq这个定义如下 (kernel/irq/handle.c):
|
也就是说大于16是不需要中断控制器的。
然后再来看函数set_irq_chip_and_handler_name(),设置irq_desc[]数组中的chip和handle_irq字段,其函数定义如下:
|
函数set_irq_chip()中的主要代码为(kernel/irq/chip.c):
desc->chip = chip; |
函数__set_irq_handler()定义如下(kernel/irq/chip.c):
desc->name = name; |
也就是说执行 set_irq_chip_and_handler_name(i, &i8259A_chip,handle_level_irq, "XT")后给数组irq_desc[]的第i个字段chip,handle_irq,name分别赋值 i8259A_chip,handle_level_irq,XT。而其中handle_level_irq是一个函数指针,定义在kernel/irq /chip.c重要代码如下:
|
至此init_ISA_irqs (void)到这里结束,那么谁来调用它了?看下面代码:
392 pre_intr_init_hook(); 399 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { |
其中将392行的函数pre_intr_init_hook()展开后就会发现:
|
也就是在函数 native_init_IRQ()里调用了init_ISA_irqs (void)。接着看native_init_IRQ()中的for循环,循环了224次(NR_VECTORS - FIRST_EXTERNAL_VECTOR),vector从0x20(FIRST_EXTERNAL_VECTOR)开始。且不等于 0x80(vector != SYSCALL_VECTOR),即系统调用,循环执行set_intr_gate(vector, interrupt[i]),这个函数就是设置IDT中的中断门描述符(前面讲了,占8字节,主要保存中断处理程序的如够函数地址),将中断处理函数入口 函数地址设置为interrupt[i],当第i个中断发生后跳转到此地址执行。那么interrupt[]数组又是怎么实现的了?
|
先看79行,这个就是函数指针数组interrupt[],注意这个数组共224项,定义了从0x2到0xf的14个IRQLIST_16(),而每一个IRQLIST_16()又是16个IRQ(x,y),也就是说一共有224个IRQ(x,y)。
接着再看宏#define IRQ(x,y) IRQ##x##y##_interrupt
## 表示将字符串连接起来,比如IRQ(0x2,0)就是IRQ0x20_interrupt,这样以来就会生成224个这样的函数,从 IRQ0x20_interrupt一直到IRQ0xff_interupt。那么这些函数是如何定义的了?往下看include/asm-x86_64 /hw_irq.h:
163 #define BUILD_IRQ(nr) \ |
根据156和157两行的宏 定义可以知道IRQ_NAME(nr)是一个函数IRQnr_interrupt()就是我们刚才上面所提到的函数数组中interrupt[]的一个, 至于是哪一个就看nr是多少了。这个函数将nr取反(正数留给系统调用)压入堆栈中,后面用到的时候再取反就可以知道中断号了,然后跳转到 common_interrupt,这是一个公共的程序,暂且不说。
这样我们就定义了一个interrupt[]数组中的一个函数,这只是一个函数,通过以下的宏就可以定义224个了arch/x86_64/kernel/i8259.c:
|
这样以后就定义整个interrupt[]中的每一函数。
至此set_intr_gate(vector, interrupt[i]);执行结束。这样我们就对IDT初始化成功。
From https://sites.google.com/site/xylinuxkernel/Home/interrupt
[Fw]中断的初始化的更多相关文章
- [fw]LINUX中断描述符初始化
LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...
- 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)
1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...
- Linux x86_64内核中断初始化
Linux x86_64内核中断初始化 [TOC] 中断分类 Linux系统中,中断分为: 硬中断:由外部设备或者执行异常产生的需要快速处理的中断.如缺页中断.定时器硬件中断. 根据内部产生还是外部产 ...
- linux中断源码分析 - 初始化(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 本篇文章主要讲述源码中是如何对中断进行一系列的初始化的. 回顾 在上一篇概述中,介绍了几个对于中断来说非常重要的 ...
- linux中断子系统:中断号的映射与维护初始化mmap过程
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前沿: 好久好久没有静下心来整理一些东西了 ...
- [fW]中断处理函数数组interrupt[]初始化
中断处理函数数组interrupt[]初始化 2011-05-13 15:51:40 分类: LINUX 在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是 ...
- [Fw]初探linux中断系统(2)
初探linux中断系统(2) 中断系统初始化的过程 用来初始化中断系统的函数位于arch/x86/kernel/irqinit.c,定义如下 void __init init_IRQ(void){ i ...
- [fw]IDT表的初始化
IDT表的初始化 linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为: struct desc_struct idt_table[256] __attribute__((_ ...
- Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
随机推荐
- 认识Mybatis
什么是Mybatis? MyBatis 是一款优秀的基于Java的持久层框架(来源于“internet”和“abatis”的组合),它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了 ...
- TensorFlow学习——入门篇
本文主要通过一个简单的 Demo 介绍 TensorFlow 初级 API 的使用方法,因为自己也是初学者,因此本文的目的主要是引导刚接触 TensorFlow 或者 机器学习的同学,能够从第一步开始 ...
- Kotlin 的 Array 转 List
Kotlin 的 Array 转 List array.toList() as List<T> 1 Kotlin 的 Array 转 ArrayList array.toList() as ...
- 用Matlab的.m脚本文件处理实验室数据
找到相应的文件 findfile %1 打开文件夹 %2 拷贝第一个文件 %3 关闭当前文件,再次拷贝新的文件,直到文件末尾结束 clc clear DST_PATH_t = 'C:\Users\Ma ...
- Vue--事件处理(逐个学习事件修饰符)
.capture .self .once 主要学习这三个事件修饰符的用法先来看看capture capture即是给元素添加一个监听器,当元素发生冒泡时,先触发带有该修饰符的元素.若有多个该修饰符,则 ...
- windows平台搭建Mongo数据库复制集(类似集群)(三)
在本篇里面,咱们重点总结一下复制集,以及分析一下它的工作原理 一.常见场景 应用程序和数据库之间的网络连接丢失 计划停机.断电.数据库服务硬盘故障等等 复制可以进行故障转移,复制能让你在副本间均衡读负 ...
- [Luogu2170]选学霸
这一道题,由于他说,"如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议."而要求"既不让同学们抗议,又与原来的M尽可能接近".因此,我们要对实力相 ...
- Gene Ontology (GO) 注释
Gene Ontology (GO) 注释 Posted on 2017-06-11 | In 生信 相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因 ...
- SQL笔试
一.题目 二.练习数据 SELECT VERSION(); create table CDM_AGENT(ano VARCHAR(6),aname VARCHAR(8)); create table ...
- UITableViewCell的移动
看到Metro大都会 这个App中扣款顺序有个cell可以移动,于是觉得是时候回忆一下UITableView的基本使用了.其实他这个移动cell的功能是系统自带的. 代码主要是这样: // // Vi ...