donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1902回复:8

LINUX中断

楼主#
更多 发布于:2002-12-27 10:26
各位高手:我最近在看LINUX源代码中断部分。产生一个疑问。请高手们指点:在调用驱动写的ISR之前,如果SA_INTERRUPT为1时,就要调用_sti开中断。在处理软中断程序前也要调用_sti开中断。这我就产生疑问了:在汇编书里说,调用_sti只是置IF寄存器为1,允许INTF管角。但如果你在ISR中想要令比你低级或同级的中断得到响应,必须发EOI指令。但在LINUX中,底半软中断优先级不是应该比硬中断低吗?当执行底半程序时,如果有任一硬中断来信号不是应该CPU被硬中断抢占吗?但是只调用_sti开中断,怎么可以保正所有硬中断被响应呢?

最新喜欢:

wdy9927wdy992...
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-02 13:24
底半软中断优先级是比硬中断低。也就是说执行bh代码时,硬件会抢先,这也是分上,下半部的原因。我们必须让上半部尽快完成,以防止耽误下一个中断,也就是你说的保证所有硬中断被响应。
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-02 16:48
谢谢UNIX1998的回答。我想请教你的是LINUX的中断是否是不分级的?我记得WINDOWS NT下写驱动,中断是分等级的。当中断发生,进入系统态,执行相应ISR。这时,当更高级的中断来后,响应高级中断,但这时,当同级中断或低级中断来后,不会被抢先。在LINUX下是否也有这钟情况?
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-02 17:09
不知道你看过ucosii的代码,那是实时的,中断分64个等级,也就是你说的会抢先。但是我看linux代码,感觉没有分等级,下半部的代码会放在一个任务队列里,由任务调度完成优先级。中断响应都是一样的。
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-03 09:38
UNIX1998非常谢谢你的回答
我没有看过ucosii的代码。但我看LINUX的代码时,我总结为:当中断发生,进入IDT中相应的中断门。自动关中断,做一些压栈工作,跳到do_IRQ函数,当SA_INTERRUPT为1调用_sti置位IF寄存器开中断(这点我看不懂_sti的汇编宏,存疑)为0时不开中断,调用相应中断通道的所有ISR,关中断,完了,如有软中断(底半),开中断,调所有的BH。看需不需要进行线程调度,返回用户空间。
   我看汇编书,觉的中断分等级应该是由硬件决定的吧?象汇编书上就说,中断是否得到响应由两条件决定:一是IF寄存器,为0时,所有可屏蔽中断都不被响应。二是8259上的中断屏蔽寄存器,当其相应位为1,且IF寄存器为1时,中断才可以被响应。当ISR发生时,如果在ISR中不发出EOI指令只发出STI指令置位IF寄存器为1的话,同级或等级ISR是不被响应的。
  参照LINUX流程和汇编书,我就产生问题:在处理软中断时,LINUX只是调用了_sti开中断。这时还是处于系统态,怎么保证比相应中断同级、低级的中断得到响应?我在看代码时看不到任何类似EOI的指令。是不是LINUX中被重写的_sti宏用相应的功能?你能帮我看看这段汇编代码吗?__sti(void)
{
__asm__ __volatile__(
\".set\\tnoreorder\\n\\t\"
\".set\\tnoat\\n\\t\"
\"mfc0\\t$1,$12\\n\\t\"
\"ori\\t$1,0x1f\\n\\t\"
\"xori\\t$1,0x1e\\n\\t\"
\"mtc0\\t$1,$12\\n\\t\"
\".set\\tat\\n\\t\"
\".set\\treorder\"
: /* no outputs */
: /* no inputs */
: \"$1\", \"memory\");
}
象\".set\\tnoreorder\\n\\t\"
\".set\\tnoat\\n\\t\"
\"mfc0\\t$1,$12\\n\\t\"
\"ori\\t$1,0x1f\\n\\t\"
\"xori\\t$1,0x1e\\n\\t\"
\"mtc0\\t$1,$12\\n\\t\"
语句在一般的汇编中没有。我看不懂,你能不能帮帮我?
sunsetyang
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-03 14:37
UNIX1998非常谢谢你的回答
我没有看过ucosii的代码。但我看LINUX的代码时,我总结为:当中断发生,进入IDT中相应的中断门。自动关中断,做一些压栈工作,跳到do_IRQ函数,当SA_INTERRUPT为1调用_sti置位IF寄存器开中断(这点我看不懂_sti的汇编宏,存疑)为0时不开中断,调用相应中断通道的所有ISR,关中断,完了,如有软中断(底半),开中断,调所有的BH。看需不需要进行线程调度,返回用户空间。
   我看汇编书,觉的中断分等级应该是由硬件决定的吧?象汇编书上就说,中断是否得到响应由两条件决定:一是IF寄存器,为0时,所有可屏蔽中断都不被响应。二是8259上的中断屏蔽寄存器,当其相应位为1,且IF寄存器为1时,中断才可以被响应。当ISR发生时,如果在ISR中不发出EOI指令只发出STI指令置位IF寄存器为1的话,同级或等级ISR是不被响应的。
  参照LINUX流程和汇编书,我就产生问题:在处理软中断时,LINUX只是调用了_sti开中断。这时还是处于系统态,怎么保证比相应中断同级、低级的中断得到响应?我在看代码时看不到任何类似EOI的指令。是不是LINUX中被重写的_sti宏用相应的功能?你能帮我看看这段汇编代码吗?__sti(void)
{
__asm__ __volatile__(
\".set\\tnoreorder\\n\\t\"
\".set\\tnoat\\n\\t\"
\"mfc0\\t$1,$12\\n\\t\"
\"ori\\t$1,0x1f\\n\\t\"
\"xori\\t$1,0x1e\\n\\t\"
\"mtc0\\t$1,$12\\n\\t\"
\".set\\tat\\n\\t\"
\".set\\treorder\"
: /* no outputs */
: /* no inputs */
: \"$1\", \"memory\");
}
象\".set\\tnoreorder\\n\\t\"
\".set\\tnoat\\n\\t\"
\"mfc0\\t$1,$12\\n\\t\"
\"ori\\t$1,0x1f\\n\\t\"
\"xori\\t$1,0x1e\\n\\t\"
\"mtc0\\t$1,$12\\n\\t\"
语句在一般的汇编中没有。我看不懂,你能不能帮帮我?
 

noreoder/noat都是对汇编器作限定的,不允许编译器重新安排指令顺序,并且不允许是用\"$1\"寄存器。mfc0/mtc0是不是应该是ppc的指令,象是从控制寄存器中去内容/写内容。
Assembler Option Directive (.set)
Syntax

.set option

Description

The .set directive instructs the assembler to enable or disable certain options. The assembler has the following default options: reorder, macro, move, novolatile, and at. Only one option can be specified for each .set directive:

The reorder option permits the assembler to reorder machine language instructions to improve performance.


The noreorder option prevents the assembler from reordering machine language instructions. If a machine language instruction violates the hardware pipeline constraints, the assembler issues a warning message.


The macro option permits the assembler to generate multiple machine instructions from a single assembler instruction. This is the default action.


The nomacro option causes the assembler to print a warning whenever an assembler operation generates more than one machine language instruction. You must select the noreorder option before using the nomacro option; otherwise, an error results.


The at option permits the assembler to use the $at register for macros, but generates warnings if the source program uses $at .


When you use the noat option and an assembler operation requires the $at register, the assembler issues a warning message; however, the noat option does permit source programs to use $at without warnings being issued.


The nomove options instructs the assembler to mark each subsequent instruction so that it cannot be moved during reorganization. The assembler can still move instructions from below the nomove region to above the region or vice versa. The nomove option has part of the effect of the \"volatile\" C declaration; it prevents otherwise independent loads or stores from occurring in a different order than intended.


The move option cancels the effect of nomove.


The volatile option instructs the assembler that subsequent load and store instructions may not be moved in relation to each other or removed by redundant load removal or other optimization. The volatile option is less restrictive than noreorder; it allows the assembler to move other instructions (that is, instructions other than load and store instructions) without restrictions.


The novolatile option cancels the effect of the volatile option.


[编辑 -  1/3/03 by  sunsetyang]
[color=red]Optimization[/color] In Progress . . . Welcome to http://mail.ustc.edu.cn/~chyang/
sunsetyang
驱动小牛
驱动小牛
  • 注册日期2001-03-23
  • 最后登录2007-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-03 14:52
不知道你看过ucosii的代码,那是实时的,中断分64个等级,也就是你说的会抢先。但是我看linux代码,感觉没有分等级,下半部的代码会放在一个任务队列里,由任务调度完成优先级。中断响应都是一样的。

中断的分级一般的来说上有两中层次,硬件层次和软件层次。硬件上可以通过对中断控制器设置来设置各个中断的优先级,而软件层次的通常由OS来完成管理,这在不同的系统上有不同的实现。但软件上的响应实际上是受制于硬件层次上的设置的。
[color=red]Optimization[/color] In Progress . . . Welcome to http://mail.ustc.edu.cn/~chyang/
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-03 15:21
sunsetyang谢谢你告诉我很多原来不知道的东西。你觉的linux下的这段_sti汇编指令是不是应该就是简单置CPU中的IF位为1?也就是说跟汇编语言中的_sti指令是功能一样的吧?我觉得你好象对硬件特别通晓,请问一个跟硬件相关的问题:对中断控制寄存器,是不是可以发一些指令让它动态的决定是否将中断分级?还是说当这个中断控制寄存器硬件出厂后,就只能是中断分级或不分级的?你对LINUX下的中断实现是怎么看的?可以发表一下高见吗?
donotgo
驱动牛犊
驱动牛犊
  • 注册日期2002-11-20
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-03 15:37
底半软中断优先级是比硬中断低。也就是说执行bh代码时,硬件会抢先,这也是分上,下半部的原因。我们必须让上半部尽快完成,以防止耽误下一个中断,也就是你说的保证所有硬中断被响应。


UNIX1998,请问你看LNUX源代码时,有没有是那一段代码实现了这个软中断可被硬中断抢先的功能的?是怎么实现的?请你告诉我好吗?我现在看这模块看的头疼的很。感觉代码跟一些指导的书写的完全是相反的。
游客

返回顶部