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

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

与其问什么书(尽管如果您知道任何有帮助的指南/教程),不如问什么是开始进行内核编程的最佳方法,以及是否有一个最适合学习的特定发行版?

我最感兴趣的是设备驱动程序部分,但我也想了解内核是如何设置的(模块等)我有大约 4-5 年的 C/C++ 经验,但主要是大学知识(所以它是不像 4-5 年工作经验,如果你明白我的意思的话)

答案1

首先:

对于婴儿阶段,编写“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。 (注:主线中的驱动程序是不是我的驱动程序,最后是别人从头写了一个)。

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

答案2

存在许多内核。

Linux不是唯一的游戏,但它是使用最广泛的游戏。有些人推荐minix内核来了解操作系统概念。我会选择 Linux 2.6.x 系列,因为它是最常见的,并且不会浪费在(几乎)没人使用的东西上。 Solaris、XNU (Mac)、FreeBSD 和 Dragonfly 是著名的。1

找到一些超级简单的东西(串行端口、USB 等)并让它做其他事情。对于额外的挑战,请尝试为还没有内核模块的东西编写内核模块。 (请务必先通过 pcisudo lspci -nn和/或 USB id搜索嫌疑人sudo lsusb。)

更新:不要直接在主系统上执行此操作,请使用如上所述的虚拟机 (VM)(计算机中的计算机)。 虚拟盒子可以提供这个,而且是免费的。另外,我不希望它看起来令人难以承受,但请尝试使用虚拟机快照,这样您就可以在虚拟机本身出现问题时返回。

更新2:关于 Git(DVCSes inc.mercurial、fossil、bazaar、darcs)的注释是个好主意,主要针对代码和小型重要文件。尽量不要使用 Git 来备份音乐、视频等,除非您知道其含义。 ;)

答案3

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

其次,使用虚拟机。在 VirtualBox 下设置一台来宾机器或在 VM 上设置一些来宾机器,并在其中进行一段时间的内核测试。这样,当你破坏某些东西时,你就不会杀死你的主系统,并且重新启动、回溯到工作快照等都非常容易。

第三,学习git

答案4

有人已经提到了“Linux Device Drivers”这本书 - 这是一个很好的资源,我也强烈推荐它。

虽然问题提到发起者并不是专门要求书籍,但最新版的《Understanding the Linux Kernel》一书(http://oreilly.com/catalog/9780596005658/)对于总体了解 Linux 内核非常有价值,并且还包含有关 Linux 设备驱动程序的部分。

相关内容