免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7202 | 回复: 12

[中断] local_irq_save 为何要保存 eflags 寄存器 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2013-01-31 16:02 |显示全部楼层
如下, 一般代码就是

unsigned long flags;
local_irq_save(&flags);
do something;
local_irq_restore(&flags);

我的疑问就是谁会改变 flags?
既然中断已经被禁用了, 基本上就没有人能够在 do_something 时能够改变 eflags 了, 除了他自己, 但很显然这里不是防止他自己修改, 那么还有谁?

论坛徽章:
0
发表于 2013-01-31 16:42 |显示全部楼层
考虑过嵌套的情况吗!

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2013-01-31 16:42 |显示全部楼层
你这是码农思维,就不能发散点么?

实际上谁也不会改变eflags。之所以先保存eflags,只是因为不知道local_irq_save(&flags)之前eflags的状态。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2013-01-31 16:43 |显示全部楼层
塑料袋 发表于 2013-01-31 16:42
你这是码农思维,就不能发散点么?

实际上谁也不会改变eflags。之所以先保存eflags,只是因为不知道loca ...


汗, 我刚想明白, 结果发现你已经回了。。。。。。。。。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
发表于 2013-01-31 17:08 |显示全部楼层
Z神最近不在状态啊~~~~~

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2013-01-31 17:09 |显示全部楼层
zylthinking 发表于 2013-01-31 16:43
汗, 我刚想明白, 结果发现你已经回了。。。。。。。。。


我正在那边拍砖呢,你把我call这边来了。

8259那个我看不明白你在疑虑什么,多个中断并成一个是完全有可能发生的。

因为8259有个保存中断的寄存器,所以边沿触发的引脚,想关就关,不会来N个中断,一个都不响应,造成硬件瘫那。

但是IO APIC没有这个保存中断的寄存器,所以对于边沿触发的引脚,不是马上就关的,它的逻辑是:
1)disable intr只是找个变量做个标记就返回了,没有任何硬件操作
2)硬件中断第一次。记录下来在disable intr和enable intr之间,发生过中断这个事实,记录于软件还是local APIC忘了。
   并且在看到1)中已做的标记后,将真正关闭这条中断线。
3)硬件中断第二,三,四...次。由于已经关闭了中断线,所以软件,硬件都将永远不会知道。
4)enable intr开中断时:若没有发生2)3),则操作为简单的取消这个标记;若发生了2)3),则除取消标记外,还将响应2)中记录下来的那一次中断。

这样保证了关中断期间,能知道发没发生过中断,至于中断多少次倒不是关键。
kernel害怕的是磁盘那种驱动,在intr的响应函数中将下达下一个IO命令。如果关中断期间的中断全部丢失,一个都不响应的话,磁盘就将挂那瘫掉很长时间,直到IO request超时。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2013-01-31 17:18 |显示全部楼层
本帖最后由 zylthinking 于 2013-01-31 17:18 编辑
塑料袋 发表于 2013-01-31 17:09
我正在那边拍砖呢,你把我call这边来了。

8259那个我看不明白你在疑虑什么,多个中断并成一个是完全 ...


我就是看到情景分析上说关中断久了会丢失中断, 而我对 8259A 的分析表明, 不可能会发生这种情况, 所以搞不准是我分析对了 还是毛德操对了
APIC 我还真没有研究, 不过你的回复我大概看懂了, 貌似也不会发生中断丢失现象? 不管关多久的中断

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2013-01-31 17:30 |显示全部楼层
liuiang 发表于 2013-01-31 17:08
Z神最近不在状态啊~~~~~


汗, 你不知道我知道一点东西总比别人多出三倍努力, 我容易么, 全靠拼命一遍一遍看, 才能知道一些东西。。。。。。。这已经算我第四遍看情景分析了。。。。。。。。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2013-01-31 17:31 |显示全部楼层
zylthinking 发表于 2013-01-31 17:18
我就是看到情景分析上说关中断久了会丢失中断, 而我对 8259A 的分析表明, 不可能会发生这种情况, 所 ...


关中断期间,只关注发没发生过中断,而不关注发生过几次。

如果连发没发生过中断都不关注,把关中断期间的中断全部都丢了,那么像磁盘那种驱动,就只能等待超时后reset了。

只要知道关中断期间发生过中断,开中断后会重新响应一次中断的话,那么一切运转正常。
kernel只怕边沿中断的外设在发出一次中断后,就一直等待中断处理程序的响应,不响应就瘫那,不会再重新发中断的外设。

边沿触发时,即使关某条中断线后,8259也有一个内部的寄存器,用于记录关中断的这条线上发没发生过中断。等开这条中断线后,8259会触发这个中断。
电平触发时,即使关某条中断线后,外设自己也自始至终的保持这个电平。等开这条中断线后,会触发这个中断。

怕的是APIC那种,一旦关了某条边沿触发的中断线,关了就是关了,这期间所有中断都将丢失,永远无法触发。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2013-01-31 17:33 |显示全部楼层
zylthinking 发表于 2013-01-31 17:30
汗, 你不知道我知道一点东西总比别人多出三倍努力, 我容易么, 全靠拼命一遍一遍看, 才能知道一些东 ...


你不知道我学kernel的时候,连windows都用不顺畅,linux更不知道长啥样。
一直看了3年的情景分析和源代码后,才第一次在家里的电脑装个redhat,头回看了看linux长啥样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP