Linux内核栈溢出(stack overflow)问题

最近一段时间在设计和开发一个Linux内核模块,进入到最后的正确性测试与稳定性测试阶段。在这个阶段发现了一个非常有意思的问题,堆栈溢出(stack overflow)。Linux内核堆栈溢出之后直接导致了系统kernel Panic。由于导致stack overflow的原因是递归调用导致的,所以,最后通过调试串口导出的kernel panic信息很快就定位问题所在了,否则这样的问题还真是很难调试和发现。通过这次bug,我们应该记住的是:Linux内核stack资源是有限的,而递归调用将大量消耗stack资源,因此在内核编程中尽量少用递归算法,否则将会导致出乎意料的一些问题。依次类推,为了减少stack资源的消耗,程序的局部变量定义的不要太大,否则也将会消耗大量stack资源,从而导致内核程序的不稳定。

为了解决递归调用导致的问题,我将递归算法改写成了非递归算法,解决了stack overflow的问题。在此介绍一下递归算法改写成非递归算法的一些思想。在项目实现过程中,需要对IO请求进行按顺序排队,因此采用了效率较高并且实现简单的快速排序算法,该算法是一种分治算法,即将排序队列进行切分,分解成一系列的小问题进行求解,针对这种问题,很容易采用递归的办法进行实现,伪代码描述如下:

/* qs_sort实现从小到大的排序 */

Struct bio qs_sort(struct bio_list *list_head, struct bio *bio_tail) {

Struct bio_list *less_list, *large_list;

Struct bio *middle_bio;

/* 递归调用结束点,小问题求解完毕,直接返回最后一个元素 */

If (!list_head) {

Return bio_tail;

}

/* 对队列进行切分,选择一个middle_bio,并且按照middle_bio将其切分成less_list队列和large_list队列 */

Split_list(list_head, less_list, large_list, &middle_bio);

/* 采用递归的方法实现大队列的排序操作 */

Middle_bio->bi_next = qs_sort(large_list, bio_tail);

/* 采用递归的方法实现小队列的排序操作 */

Return qs_sort(less_list, middle_bio);

}

linux内核 panic,linux 内核 panic相关推荐

  1. linux内核 异常 log,Linux Kernel WARN()/BUG(), Oops/Panic, Tainted分析

    稳定性范畴, 参考5.x kernel. kernel Oops Oops指的就是内核的不正确行为,比如对驱动来说:static int i82092aa_pci_probe(struct pci_d ...

  2. linux系统与内核,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  3. linux的内核是指的什么,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  4. linux 系统的内核,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  5. 最小的linux内核编译,Linux最小内核移植

    class="markdown_views prism-github-gist"> Linux内核编译 本篇博客来自凌云实验室开发板介绍及其烧录学习笔记 1.内核介绍 一种开 ...

  6. 几个使用linux内核的系统,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  7. linux 内核将两个设备相关联,linux用户空间和内核空间交换数据

    转载地址:http://www.poluoluo.com/server/201107/138420.html 在研究dahdi驱动的时候,见到了一些get_user,put_user的函数,不知道其来 ...

  8. 熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  9. linux版本与内核对应关系,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

  10. Linux内核与Linux操作系统的区别,[科普] Linux 的内核与 Linux 系统之间的关系

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在 FHS 协议里,有这样的规定: /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如: cat. ls. cp. /boot/ ...

最新文章

  1. 关于C#中timer类 在C#里关于定时器类就有3个
  2. URAL 1055 Combinations
  3. linux下remove函数
  4. mysql 删除过期日志_【转】对mysql日志进行操作的总结包括 启用,过期自动删除 等...
  5. 触摸屏开发_Microchip推出新型电容触摸式控制器,加速汽车触摸屏EMI认证
  6. 【poj3375】 Network Connection
  7. 从零实现深度学习框架——理解正则化(二)
  8. 5-21 求前缀表达式的值(25分)
  9. 我是如何学习Android源码的
  10. JAVA实现MD5算法、SHA1算法和SHA256算法
  11. 一张图囊括所有ASM优化投放知识点
  12. 竞赛题-6283. 正整数和负整数的最大计数
  13. 【快乐摸鱼】— 用python开发益智游戏
  14. SpringCloud Alibaba 从入门到精通(精选)
  15. android连iphone热点超时,Android19连接iOS13个人热点失败
  16. 手机ftp服务器进入制定文件夹,ftp服务器 指定文件夹
  17. 教你免费下载和安装office办公软件,超级简单
  18. word图片另存为变黑色_别处复制过来的 图像在word中粘贴后变黑怎么处理?
  19. 网易视频云余利华:以用户体验为核心,深耕PaaS云生态
  20. rtth之线程间的通信

热门文章

  1. 使用selenium爬取csdn博客
  2. selenium得到一个动态页面
  3. flutter 刷脸_支付宝刷脸认证 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. Emgu-WPF学习使用-阈值化
  5. Windows7系统下编译安装X264
  6. 构建之法----软件工程简介
  7. E/Trace: error opening trace file: No such file or directory
  8. QTWebkit中的webkit/qt/api文档
  9. Silverlight4 ColorPicker控件
  10. 响应在此上下文中不可用