免费注册 查看新帖 |

Chinaunix

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

[中断] 用户态中断(user-mode irq) [复制链接]

论坛徽章:
0
发表于 2013-04-06 18:31 |显示全部楼层
本帖最后由 txawplh 于 2013-04-06 21:02 编辑

          我在看handle_irq源码时(内核版本v3.,看到下面几句话:

           if (user_mode_vm(regs) || !execute_on_irq_stack(overflow, desc, irq)) {
                     if (unlikely(overflow))
                           print_stack_overflow();
                     desc->handle_irq(irq, desc);
          }
         
         让我不太理解的是user_mode_vm(regs)这句话,查了一下,这句话是在这个Patch中添加的:
         [PATCH] x86-32: don't switch to irq stack for a user-mode irq

         貌似意思是说用户模式中断不用切换中断栈,想问一下什么是用户模式中断???
         多谢了

论坛徽章:
0
发表于 2013-04-07 14:36 |显示全部楼层
应该是指 CPU当前正在执行用户态的代码,此时发生了硬中断,切换到内核态后,由于内核栈是空的,所以直接使用而无需做切换。

备注两点:
1,当CPU切换到用户态时,对应的内核栈数据全部废弃无用,再次进入到内核态时,内核栈是一个全新的空栈。
2,linux 2.6.x后,内核栈和中断栈是分离的,即每个cpu私有两个中断栈(根据各个版本不同有细微差别),分别用于软中断和硬中断,中断处理函数使用的栈是对应的中断栈,而不再像2.4.x那样内核栈/中断栈合为一个。所以才有切换一说。

http://lenky.info/?p=2247

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-04-07 22:25 |显示全部楼层
我倒觉得可能的向是通过新的中断向量entry设置为直接跑user-mode 的中断handler,而不是见了中断就ring0.
当然这需要硬件的新特性支持

论坛徽章:
0
发表于 2013-04-08 16:00 |显示全部楼层
本帖最后由 txawplh 于 2013-04-08 17:10 编辑

谢谢你的解释,不过这里执行的判断是是否切换到中断栈,不是切换到内核栈。回复 2# lenky0401


   

论坛徽章:
0
发表于 2013-04-08 17:05 |显示全部楼层
我也觉得好像是这样的回复 3# smalloc


   

论坛徽章:
0
发表于 2013-04-08 17:21 |显示全部楼层
回复 4# txawplh


    额,可能是我没有说清楚,是这样的:

当cpu处于ring3时,如果发生中断,那么首先要切换到ring0,这个无需多说。

另外一个就是内核栈和中断栈的切换问题。之所以有这个中断栈,是为了尽量避免栈溢出,而如果当前内核栈本身就是空栈,那么就没有必要再切换到中断栈,因为这毫无疑问是无用功。

举个例子,要用桶装水(执行中断函数),本来就有一个空桶在面前(内核栈),那么自然没有必要再去拿个空桶(切换到中断栈)。

这个判断就是看当前是否有必要做内核栈到中断栈的切换。而我说的是基础前提,即ring3切换到ring0时,内核栈是空栈。

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-04-08 17:31 |显示全部楼层
应该是LS的说的那样

论坛徽章:
0
发表于 2013-04-10 15:56 |显示全部楼层
懂了,感谢版主的详细解答回复 6# lenky0401


   

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
发表于 2013-04-11 22:16 |显示全部楼层
回复 6# lenky0401


    感觉你们说的  都听不懂啊  感觉就一个堆栈空间啊,,,哪又来了内核栈和中断栈  大侠能解释哈嘛  新手学习中

论坛徽章:
0
发表于 2013-04-13 14:40 |显示全部楼层
本帖最后由 junnyg 于 2013-04-13 16:31 编辑

回复 9# tc1989tc
同为新手,一起探讨哈,谈下自己的理解:
1. 每个进程的栈空间分为内核态和用户态,内核态的栈空间只有8K大小,栈底保存着进程的thread_info信息;
2. 用户态栈大小默认为8M,可以在用户态执行ulimit -S进行设置;
3. 进程在用户态执行时,使用的是用户态的栈空间;而进程发起系统调用或者缺页异常等处理时则会进入内核态,这时使用的
栈空间就是内核态的栈。
4. 同样中断处理时最开始使用的也是内核栈,但由于内核栈比较小,如果中断handler执行流程较长,会有栈溢出的风险,所以有时
会在中断处理调用handler前切换为中断栈,而如果是用户态被中断打断,内核栈本身还是空,则不用担心栈溢出的风险

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP