【编者按】Linux 的创始人 Linus Torvalds 最近亲自改进了用户模式栈扩展代码,解决了一个与虚拟内存地址布局相关的问题。
原文链接:https://www.phoronix.com/news/Linux-65-User-Mode-Stack-Expand
未经允许,禁止转载!
作者 | Michael Larabel 译者 | 枫叶聊斋责编 | 夏萌出品 | CSDN(ID:CSDNnews)Linux 的创造者 Linus Torvalds 已不再像之前那样亲自编写大量的核心代码。他如今的主要职责是监督上游的内核开发社区,包括审查代码、管理版本发布,并在邮件列表中参与讨论。然而,有时他也会亲自进行一些底层的内核开发工作,比如他最近就编写了 Linux 6.5 改进用户模式栈扩展的代码。
这项近 500 行的代码重构的目标是提升用户模式下的栈扩展部分的效率。
他在提交记录中解释道:
本次修改让我们的用户模式栈扩展代码在变更虚拟内存(VM)布局之前,始终进行 mmap_lock 写入。
这实际上是我们一直以来都在做的事情。由于我们并不严格需要它,我们选择了一种更为便捷("投机取巧"听起来是不是更好些?)的方式,即通过一种不需要进行适当锁定的机制来就地扩展栈的虚拟内存地址(vma)。
这种方式在实际工作中表现出色。我们只需根据需要改变 vm_start 或 vm_end,然后配合使用 anon_vma 锁和 mm->page_table_lock 进行临时锁定,就能够顺利进行一切操作。
然而,直到 Ruihan Li 指出,由于现在虚拟内存地址(vma)布局使用了 maple tree 代码,我们不能仅仅改变 vm_start 和 vm_end,否则原有的锁定机制将会被破坏。
解决这个问题虽然有一些困难,但并还不算糟糕。我们有三种不同的栈扩展情况,它们的工作方式略有不同。
感谢 Linus Torvalds 亲自接手这项编程挑战,现在在 Linux 6.5 版本中,这个问题应该已经得到了解决。
更多详细内容可参考提交记录:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9471f1f2f50282b9e8f59198ec6bb738b4ccc009