进入内核编程的最佳方法?


8

并不是问什么书(尽管如果您知道有什么指南/教程会有所帮助),而是开始进行内核编程的最佳方法是什么,是否有一个特定的发行版是最好的学习方法?

我最感兴趣的是设备驱动程序部分,但是我想学习如何设置内核(模块等),我大约有4-5年的C / C ++经验,但这主要是大学的知识(因此不喜欢4-5年的工作经验,如果您明白我的意思)


4
首先,它用e拼写内核。
迦勒

是的,我注意到当我贴上标签时,哈哈。

4
下一次花时间修复它。这是尊重这里花时间帮助您的社区的好方法。另外,如果您要为内核编写代码,则必须严格遵守此类细节!
卡莱布

@Caleb,会做!

谢谢你问这个问题,我一直想自己
迈克·潘宁顿

Answers:


11

首先:

对于婴儿阶段,在“ hello world”模块和虚拟硬件驱动程序上编写各种变体是最好的开始方式(当您对自己的工作有更多了解时,实际的硬件会带来最现实的问题)。

“ Linux设备驱动程序”是一本非常不错的书,值得一读:http : //lwn.net/Kernel/LDD3/

LDD(至少用于)进行了一些练习,您在其中编写了虚拟驱动程序,例如RAM磁盘和虚拟网络设备。

其次:

订阅https://lkml.org/或您将要入侵的子系统的邮件列表。潜伏一下,浏览线程,阅读代码审查(回复补丁),看看人们是什么样的人偶然发现或继续前进。

查看是否可以为尚不支持或尚不很好支持的设备获取(廉价)硬件。廉价的USB NIC或类似的低成本USB外设就是不错的选择。最好是使用过时的或过时的驱动程序,也许是由供应商编写的,也许是针对2.4.x编写的,因为您可以从某种可行的方法开始(排序),然后逐步对其进行改编/重写。进行测试。我的第一个驱动程序尝试是Davicom DM9601 USB NIC。我有一个2.4系列厂商编写的内核驱动程序,后来我慢慢适应了2.6。(注意:Mainline中的驱动程序不是我的驱动程序,最后其他人从头开始写了一个)。

另一个不错的方法是查看“内核新手”站点,特别是“内核管理员”待办事项:http : //kernelnewbies.org/KernelJanitors/Todo 这是初学者应该能够解决的任务列表。


4
对于Linux来说,这是一个很好的答案,只缺少一种资源:LXR,用于浏览内核源代码。
吉尔(Gilles)'所以

8

存在许多内核。

Linux不是唯一的游戏,而是使用最广泛的游戏。有人建议minix内核了解操作系统概念。我会使用Linux 2.6.x系列,因为它是最常见的,并且不会浪费在(几乎)没人使用的东西上。Solaris,XNU(Mac),FreeBSD和Dragonfly值得注意。1个

找到一些超级简单的东西(串行端口,USB等),然后使其做其他事情。如果遇到其他挑战,请尝试为尚未安装的模块编写内核模块。(请务必先通过pci sudo lspci -nn和/或usb ID 搜索可疑者sudo lsusb。)

更新:不要直接在主系统上执行此操作,请使用虚拟机(VM)(计算机中的计算机),如前所述。 VirtualBox可以免费提供此功能。另外,我不想让它看上去不堪重负,但请尝试使用VM快照,以便在某些情况破坏VM本身时可以返回。

更新2:有关Git的说明(DVCSes inc。Merurial,化石,集市,darcs)是一个好主意,主要用于代码和小的重要文件。除非您知道其中的含义,否则请不要使用Git备份音乐,视频等。;)


6

查找您要修改的模块或驱动程序,或者从null / hello world类型的模块开始,然后从那里构建。专门使用模块,因为它允许您将代码加载,卸载,重新编译和重新加载到正在运行的内核中。稍后您可以了解核心部分,但是基本上模块具有各种各样的功能,并且您几乎可以做任何喜欢的事情。

其次,使用虚拟机。在VirtualBox或虚拟机上设置客户机,然后在其中进行内核测试一段时间。这样一来,您在破坏某些内容时就不会杀死您的主系统,而且重新启动,回溯到工作的快照等都非常容易。

第三,学习git


1

有人已经提到过“ Linux设备驱动程序”这本书-这是一个很好的参考资料,我也强烈推荐它。

尽管该问题提到发起者并没有专门要求书籍,但最新的“了解Linux内核”一书(http://oreilly.com/catalog/9780596005658/)对于学习Linux内核具有非常重要的意义。 ,还包含有关Linux设备驱动程序的部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.