我想进入 Ubuntu 系统编程领域;具体来说,开发和调试设备驱动程序。但是,尽管我之前有为其他开源项目做贡献的经验,但我不确定如何开始。
我有相当多的 Python 编程技能/经验(但我想这在这里是没用的),中等的 C 编程技能,良好的调试技能(但仅限于用户模式程序),不错的静态逆向技能(更多的是一种爱好)并且已经完成了一个简短(但非常有趣)的内核模块编程教程这里。
我想问几个问题。
- 您想给我什么特别的建议吗(这是您经过艰苦努力才学到的)。是的,这是一个抽象的问题。
- 我已经使用 Ubuntu 很长时间了,但我不知道从哪里开始提供帮助。鉴于我对设备驱动程序的特殊兴趣,有什么建议吗?
- 建议阅读的材料?我目前正在阅读“Linux 系统编程 - 探讨内核和 C 库”。
- 建议阅读与设备驱动程序调试相关的材料?
谢谢。
答案1
嗯,作为一名内核工程师,我发现我学到的最好的教训通常是那些艰难的教训。我面临的挑战是深入挖掘并找到新的创造性方法来调试问题或解决特定的症结。坚持下去的动力实际上来自于我对特定子系统的投入兴趣。如果你不致力于坚持到底,那么现在就停下来,这一切都很难,战争故事的强度各不相同 :)。
您可以在自己愿意继续努力的领域提供最好的帮助。问问自己,您想离硬件有多近,然后从那里继续。例如,在一般的设备驱动程序开发中,应用的操作系统概念要少得多,而内存管理、IO 写回、进程调度等资源管理问题则更多。毕竟,设备驱动程序是关于敲打固件来获得您想要的东西,然后遵守该子系统的接口,有如此多的可比工作,因此从那里开始相对容易。缺点是,您正在使用硬件,这总是会拖累开发。
这是一本用户空间的书,你不再需要它了 :-p。内核是一个服务驱动的框架,如果你直接深入驱动程序开发,那么一开始就理解整个用户/内核接口不会很有用,因为你将与用户空间完全隔绝。Linux 设备驱动程序第 3 版是免费提供并且具有很好的参考价值。
请参阅下面的链接。不过最重要的是,从某个地方开始,坚持下去。这应该很难,考验你的耐心和决心。由于你并不真正了解自己感兴趣的是什么,因此从这些小冲突中吸取的教训将塑造你未来的参与。如果你连这一点都做不到,那么内核黑客就不适合你了。
我建议你找一位导师,他会挑战你,并在你进步的过程中陪伴你。我自己还没有尝试过,但这个项目可能对你来说是个不错的开始:http://kernelnewbies.org/KernelMentors。
我还建议您熟悉内核跟踪框架,例如 ftrace、perf 和 systemtap。
祝你好运!