今天, 写代码的时候碰到了一点UNIX信号相关的问题, 于是晚上就查阅了Linux信号实现的机制, 大体上有个总结:

执行一个信号处理程序是件相当复杂的任务,因为在用户态和内核态之间切换时需要谨慎地处理栈中的内容。 信号处理程序是用户态进程所定义的函数,并包含在用户态的代码段中。handle_signal( )函数运行在内核态而信号处理程序运行在用户态,这就意味着在当前进程恢复 “正常”执行之前,它必须首先执行用户态的信号处理程序。此外,当内核打算恢复进程的正常执行时,内核态堆栈不再包含被中断程序的硬件上下文,因为每当从内核态向用户态转换时,内核态堆栈被清空。而另外一个复杂性是因为信号处理程序可以调用系统调用,在这种情况下,执行了系统调用的服务例程以后,控制权必须返回到信号处理程序而不是到被中断程序的代码。Linux所采用的解决方法是: 一个非阻塞的信号发送给一个进程。当中断或异常发生时,进程切换到内核态。正要返回到用户态前,内核执行do_signal()函数,这个函数又依次处理信号( 通过调用handle_signal() )和建立用户态堆栈(通过调用setup_frame()或setup_rt_frame() )。当进程又切换到用户态时,因为信号处理程序的起始地址被强制放进程序计数器中,因此开始执行信号处理程序。当处理程序终止时,setup_frame() 或setup_rt_frame()函数放在用户态堆栈中的返回代码就被执行。这个代码调用sigreturn()系统调用,它的服务例程把正常程序的用户态堆栈硬件上下文拷贝到内核态堆栈,并把用户态堆栈恢复回到它原来的状态(通过调用restore_sigcontext() )。当这个系统调用结束时,普通进程因此能恢复自己的执行。

针对以上的实现, 如果仔细的分析源代码, 可能是件艰苦的差事!

Linux中断函数堆栈,Linux在执行信号处理的过程中对堆栈的处理相关推荐

  1. 从函数调用过程中的堆栈变化理解缓冲区溢出

    一.说明 本来是想直接写一个缓冲区溢出的例子,但是一是当前编译器和操作系统有溢出的保护措施没有完全弄清怎么取消,二是strcpy等遇到00会截断需要进行编码这比较难搞,所以最终没有实现. 但已经双看了 ...

  2. Linux中断子系统(三)之GIC中断处理过程

    Linux中断子系统(三)之GIC中断处理过程 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一)中 ...

  3. Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

    Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dl ...

  4. 只能在执行 Render() 的过程中调用 RegisterForEventValidation

    当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误提示.有两种方法可以解决以上问题: 1.修改web ...

  5. 异常“只能在执行Render()的过程中调用RegisterForEventValidation”的解决办法(转)...

    当出现下面的异常的时候: 只能在执行Render()的过程中调用RegisterForEventValidation 当出现的异常的提示: 异常详细信息: System.InvalidOperatio ...

  6. sqlserver2008R2在配置复制分发时报错:在执行xp_cmdshell的过程中出错

    报错: 正在配置... - 正在配置分发服务器 (错误) 消息 SQL Server 无法将"WIN-C6BGU7K6VUR"配置为分发服务器. (Microsoft.SqlSer ...

  7. linux驱动的中断函数,嵌入式Linux驱动开发(四)——字符设备驱动之中断方式以及中断方式获取按键值...

    之前我们完成了关于通过查询的方式获取按键键值的驱动程序,可以参考:嵌入式Linux开发--裸板程序之中断控制器. 虽然读取键值没有什么问题,但是测试程序占用CPU过高,一直在不断的查询,资源消耗过大, ...

  8. linux 中断 应用程序,Linux中断编程

    本文转载自[微信公众号:机械猿,ID:on_ourway]经微信公众号授权转载,如需转载与原文作者联系 基本概念 中断是指CPU在执行程序时,由于内外部事件或由程序预先安排的事件,导致CPU 暂停当前 ...

  9. linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.

    来自:http://hi.baidu.com/phenix_yw/blog/item/6eb4ca391d1479f23a87ce19.html 信号安装函数sigaction(int signum, ...

  10. linux 中断服务程序,request_irq() linux注册中断服务

    在 2.4 内核和 2.6内核中都使用 request_irq() 函数来注册中断服务函数.在 2.4 内核中,需要包含的头文件是 #include ,2.6 内核中需要包含的头文件则是 #inclu ...

最新文章

  1. 生态伙伴 | 身边的法律人都在用的「觅律搜索」入驻飞书啦!
  2. 静态路由协议的默认管理距离是_距离矢量路由选择协议
  3. RABBITMQ 管理指南(添加虚拟HOST)
  4. linux下uvc协议访问usb摄像头,Ubuntu调用USB摄像头
  5. gj10 python socket编程
  6. android 照片拼接长图_我才发现,微信里面有一个功能,能将手机照片自动拼成长图...
  7. Elasticsearch教程 elasticsearch Mapping的创建
  8. [递归]一文看懂递归
  9. android按钮控件常见问题,Android的基本控件和Activity的应用总结
  10. osi7层协议源代码_捍卫开放源代码的17年:立即加入OSI
  11. 18C 也不能避免 SQL 解析的 Bug
  12. 读名老中医之路笔记(四)
  13. 设计原则之依赖倒置原则详解
  14. 学校机房计算机类型,学校计算机机房的管理和维护建议原稿(备份存档)
  15. 台式计算机搜索不到无线信号,win7电脑搜不到无线信号怎么办_win7找不到无线网络怎么解决-win7之家...
  16. S3C2440裸机开发----点亮LED
  17. 南通全国计算机等级考试,南通大学2017年3月全国计算机等级考试报名通知
  18. 即将毕业大学生的第一个五年计划
  19. 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛) Jumping Monkey(并查集,逆向考虑)
  20. 【RC延迟电路 RC充电电路】 multisim 14.0仿真 参数计算

热门文章

  1. java tostring 库_JavaBean toString() – 将bean对象打印成字符串
  2. 中晋最新消息2020年_最新消息!洛阳市第一高级中学发布2020年招生简章
  3. python 采集系统_python—收集系统信息
  4. apache http自动跳转https_NGINX使用rewrite实现http 跳转 https
  5. php pdo exec,PDO::exec
  6. 浏览器检测 vs 特性检测
  7. 大众点评运维架构详大揭秘!
  8. word文档总让正文与目录分开在不同的页——分页符的使用
  9. 修改Win7启动顺序和启动菜单名称
  10. SpringBoot 轻量级英文版个人博客 flame