LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1163|回复: 6

中断入口点的问题

[复制链接]
发表于 2005-3-7 16:41:30 | 显示全部楼层 |阅读模式
这两天看linux内核中断机制部分有以下几个问题想请教各位:
1.内核关于中断的入口点在哪里?我只知道系统调用的中断调用入口点在entry.S中
2.不同硬件的中断号是在哪里指定的?
3.中断上下文与进程上下文有何区别?当硬件异步中断了用户进程,中断处理例程是否直接进入内核空间处理?也就是中断处理例程处理的内存区域处于哪部分空间
发表于 2005-3-7 19:16:45 | 显示全部楼层
1,看arch\i386\kernel\irq.c函数void init_IRQ(void)初始化IDT中的中断项,全局函数指针数组
static void (*interrupt[NR_IRQS])(void) = {
        IRQ0_interrupt, IRQ1_interrupt,………………分别指向对应中断号的处理程序。
其中IRQ0_interrupt ,IRQ1_interrupt,等是由BUILD_IRQ宏生成的,你仔细看下就明白了。
所以中断0则从IRQ0_interrupt处执行,即如下:
#define BUILD_IRQ(nr) \
asmlinkage void IRQ_NAME(nr); \
__asm__( \
"\n"__ALIGN_STR"\n" \
SYMBOL_NAME_STR(IRQ) #nr "_interrupt:\n\t" \   //中断后从这里执行.
        "pushl $"#nr"-256\n\t" \
        "jmp common_interrupt");


2,至于硬件自己在哪指定中断号应该和具体硬件相关,可能有的硬件有寄存器存其需要的中断号(硬件驱动方面还不太了解,不知道对不对),然后其驱动程序通过request_irq向内核申请使用该中断.

3.,中断处理例程是直接进入内核空间处理
不太懂什么叫上下文
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-8 13:39:11 | 显示全部楼层
xdkui :
根据你的指点看了一下,终于明白了中断是如何加载的,多谢
但驱动也应该知道硬件的中断号才行啊,总不能乱分配吧
我是在看《linux kernel development》的中文版,对于中断上下文他说中断一般直接进入被中断进程的内核栈,若没有其他进程,则进入idle进程的内核栈,但系统里不是只有一个内核栈吗,为何区分哪个进程的内核栈?
回复 支持 反对

使用道具 举报

发表于 2005-3-8 19:18:04 | 显示全部楼层
linux内核提供了一套机制,让驱动程序可以检测到其设备的中断向量,<<Linux Device Driver>>书中中断部分有介绍,你可以看下,网上有该书第2版的电子版。

系统不是只有一个内核堆栈。每个进程都有一个用户态堆栈和内核态堆栈。进程进入内核后就使用其内核态堆栈。fork进程的时候不是为每个进程分配了8K的内存吗(i386),其中大概1K存储该进程的task结构,另外的就是其内核态堆栈。你看下内核中的current宏,用来取当前进程的task结构,就是利用的与esp相与,即内核态堆栈的栈顶指针,而得到的(2.4及以前的内核)。

不知我说的是不是你想问的
回复 支持 反对

使用道具 举报

发表于 2005-4-9 23:34:01 | 显示全部楼层
进程上下文其实就是说当前在执行的是进程,当前跑的代码是为进程而跑,可能是进程本身的代码,也可能是进程调用的内核调用。中断上下文是说当前在跑的代码是中断的代码,和任何进程都没有关系,事实上,中断并不能预期自己打断的是什么进程。
      因此区别就出来了,在进程上下文中,current这个task struct结构是有效地,你可以将当前的进程挂起,可以调度,因此当前进程中的代码是可以睡眠的,最多挂起来就完了。但是在中断上下文中,current是无意义的,他和当前的中断没有任何关系,因此这个中断没有task struct,也就不能挂起,不能调度,因此他也不能睡眠
回复 支持 反对

使用道具 举报

发表于 2005-4-9 23:42:42 | 显示全部楼层
device driver的中断是在驱动程序里面注册的,你可以用register的函数将一个中断处理函数注册到一个中断号上面,当这个中断发生的时候,系统就会调用你的驱动程序里面注册的中断处理函数了,当然这样的话,你在写驱动的时候,要知道你的设备的中断号,这些是硬件做好的,可以查到,当然,PCI设备有些特殊,是动态分配的,具体不太清楚
回复 支持 反对

使用道具 举报

发表于 2005-4-10 08:57:39 | 显示全部楼层
Post by xieweiyi
device driver的中断是在驱动程序里面注册的,你可以用register的函数将一个中断处理函数注册到一个中断号上面,当这个中断发生的时候,系统就会调用你的驱动程序里面注册的中断处理函数了,当然这样的话,你在写驱动的时候,要知道你的设备的中断号,这些是硬件做好的,可以查到,当然,PCI设备有些特殊,是动态分配的,具体不太清楚

关于pci的动态检测设备及为其分配中断号可以参看<linux内核源代码情景分析>
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表