`
xitong
  • 浏览: 6179300 次
文章分类
社区版块
存档分类
最新评论

linux 中断相关的几个问题

 
阅读更多

一 linux实现的几个门

intel 提供了三种类型的中断描述符:任务门,中断门,陷阱门。linux稍有不同,根据intel的定义,实现了一下几类门。

1 中断门

用户态的进程不能访问的一个intel中断门,DPL = 0。

2 系统门

用户态的进程可以访问的一个intel陷阱门,DPL = 3, 通过系统门可以激活linux下的三个异常:4,5,128(即0x80)。

3 系统中断门

用户态的进程可以访问的一个intel中断门,DPL = 3,中断异常就属于系统中断门,int 0x03。

4 陷阱门

用户态的进程不能够访问的intel陷阱门,DPL = 0.

5 任务门

不能被用户态进程访问的intel任务门, DPL = 0。

二 中断处理函数数组 interrupt[i]

在entry_32.S中的下面的汇编代码,声明和初始化了interrupt数组,有几个细节值得分析。

/*interrupt数组的声明和初始化,里面存储中断处理函数的地址*/

/*interrupt数组就像c语言的数组一样,属于数据段的东西,因此在数据段声明。但是对数组的初始化就是代码段的内容了,这里需要注意*/
.data
ENTRY(interrupt)
.text

ENTRY(irq_entries_start)
RING0_INT_FRAME
vector=0
.rept NR_IRQS
ALIGN
.if vector
CFI_ADJUST_CFA_OFFSET -4
.endif
1:pushl $~(vector)
CFI_ADJUST_CFA_OFFSET 4
jmp common_interrupt
.previous/*previous 知名下面内容上接上一个段,即data段*/
.long 1b
.text
vector=vector+1
.endr
END(irq_entries_start)

.previous
END(interrupt) /*这句是数据段的内容*/
.previous

可以总结为:

上面一段汇编首先在数据段声明了一个interrupt数组,如下面代码:

.data
ENTRY(interrupt)

.long 1b

END(interrupt)

数组中每个元素的初始值是标号1的地址。因此访问数组中的元素时,都会跳到标号1处,执行相应的指令。

还有一个细节问题:在i8259_32.c中调用函数set_intr_gate(vector, interrupt[i]);

这里引用了在entry_32.S中数据段中定义的全局的interrupt数组,但是,数据段中定义的这个intterrupt数组只能用在连接的时候,这个符号是已经定义过得,至于它的类型和大小等c编译器无法确定,因此,在hw_irq_32.h中重新声明了extern void (*interrupt[NR_IRQS])(void),这样c编译器才会确定这个数组的类型和大小。

分享到:
评论

相关推荐

    基于ARM Linux的中断、异常的处理分析

    本文是基于ARM S3C2410X系统的Linux 2.6中断、异常和系统...主要有以下几个部分: 1. ARM的硬件中断机制 2. Linux 2.6对ARM中断向量表的初始化 3. Linux 2.6对ARM中断、异常的处理(从汇编-->C语言函数;asm_do_IRQ)

    linux实现软中断通信和管道通信报告(含代码)

    使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17...

    LINUX内核经典面试题

    LINUX内核经典面试题 ,20) 如何加载、卸载一个模块? 21) 模块和应用程序分别运行在什么空间? 22) Linux中的浮点运算由应用程序实现还是内核实现? 23) 模块程序能否使用可链接的库函数? 24) TLB中缓存的是什么...

    修复Linux异常自动重启问题

    这几天训网络最困扰我的问题就是服务器总是莫名其妙自动重启,一旦重启,训练的各种网络就都中断了,之后又得一个一个断点续训练,很费劲 两天之内重启了3次之后我实在忍不了了,决定查一下问题的根源 cd /var/log ...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 ...

    linux内核源代码情景分析

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射...

    深入分析Linux内核源码

    11.3.3 块设备驱动程序的几个函数 11.3.4 RAM 盘驱动程序的实现 11.3.5 硬盘驱动程序的实现 11.4 字符设备驱动程序 11.4.1 简单字符设备驱动程序 11.4.2 字符设备驱动程序的注册 11.4.3 一个字符设备驱动程序...

    Linux编程从入门到精通

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    LINUX编程白皮书 (全集)

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    linux编程白皮书

    6.2.5 关于半双工管道需要注意的几个 问题 233 6.3 命名管道 234 6.3.1 基本概念 234 6.3.2 创建FIFO 234 6.3.3 FIFO操作 235 6.3.4 FIFO上的阻塞动作 236 6.3.5 SIGPIPE信号 237 6.4 系统V IPC 237 6.4.1 基本概念...

    linux 内核源代码分析

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2. 9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间...

    嵌入式Linux应用程序开发标准教程(第2版全)

    《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初学者能快速入门提供了保证。...

    LINUX内核源代码情景分析

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2. 9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间...

    深入理解linux内核(第三版.中文)【有目录】

    几年前,当我们拿到Linux 内核代码开始研究时,可以说茫然无措。其规模之大,叫“覆 压三百余里,隔离天日”似乎不为过;其关系错综复杂,叫"廊腰线回,檐牙高啄,各 抱地势,勾心斗角”也非言过其实。阿房宫在规模...

    linux网卡工作原理

    除去对CPU、内存以及其他少数几个物理实体的操作之外,系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作...

    Linux内核情景分析

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2. 9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址...

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    Linux内核情景分析(二级标题).pdf

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射...

    LINUX内核源代码情景分析(上).part1.rar

    2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2. 9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间...

Global site tag (gtag.js) - Google Analytics