在家学习内核黑客和嵌入式开发?

37

我一直对内核编程和嵌入式系统领域很感兴趣。
有没有好的教程(加上易于获取的硬件),可以帮助我开始涉足这方面的内容?
类似编写驱动程序的套件,其配有良好的文档且价格实惠?

谢谢!


1
大家都只提到Linux:考虑看看FreeBSD或其他*BSD变体。由于它们基于在大学开发的代码,并且参与其中的人员正在基于此代码教授课程,因此可以认为这可能是更好的学习经验。此外,还有http://www.amazon.com/Design-Implementation-FreeBSD-Operating-System/dp/0201702452,可以获得很好的概述。 - Peer Stritzinger
此外,还有http://www.amazon.com/TCP-IP-Illustrated-Vol-Implementation/dp/020163354X/ref=sr_1_2?s=books&ie=UTF8&qid=1296814492&sr=1-2,这是一本关于*BSD TCP/IP协议栈的优秀代码演示。该系列中的其他书籍也非常值得推荐。顺便说一下,这个TCP/IP协议栈也被许多实时嵌入式系统所使用,例如http://www.rtems.org。 - Peer Stritzinger
如果你想理解操作系统的工作原理,可以参考http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720/ref=sr_1_1?ie=UTF8&s=books&qid=1296814961&sr=1-1,当然还有Andy Tannenbaum的相关书籍。 - Peer Stritzinger
现在购买一款小型SBC已经足够便宜 - 25美元到35美元 - 对于我们大多数人来说: http://www.raspberrypi.org/quick-start-guide - kaiwan
6个回答

33

如果您完全是新手,我建议您不要从硬件开发开始,而是去学习一些“纯软件”内核模块,例如 proc 文件/sysfs 或者更复杂的例子如文件系统/网络开发。建议您在 uml/vmware/virtualbox 等虚拟机上进行开发,这样即使出现崩溃也不会对您的电脑造成太大的影响。对于嵌入式开发,您可以选择一个小型 ARM 开发套件或小型 Via C3/C4 机器,或者任何旧的 PC,您可以在上面使用自制的 USB/PCI/其他设备。

一个好的开始地方可能是 Kernelnewbies.org - 它有很多链接和有用的内核开发信息,还介绍了适合初学者的易于实现的任务列表。

一些需要阅读的书籍:

深入理解 Linux 内核 - 详细描述了内核子系统的设计,是一个非常好的参考书。

Linux 设备驱动程序 - 更像是教程,带有很多示例代码,重点在于让您入门并解释了 Linux 内核的关键方面,介绍了构建过程和内核模块的基础知识。

Linux 内核模块编程指南 - 一些更加入门级别的材料。

正如之前所建议的那样,查看 Linux 代码总是一个好主意,特别是因为 Linux 内核 API 经常发生变化... LXR 通过提供非常好的浏览界面来帮助您进行查看 - lxr.linux.no

为了了解内核构建过程,可以参考这个链接:

Linux 内核 Makefile (kbuild)

同时请查看内核源代码的文档目录!
以下是一些从内核开发课中盗取的有趣练习题:
  • 编写一个内核模块,该模块创建名为 /proc/jiffies 的文件,在每次读取操作时报告 jiffies 的当前时间。
  • 编写一个内核模块,提供 proc 文件 /proc/sleep。当应用程序将秒数作为 ASCII 文本写入此文件(“echo 3 > /proc/sleep”)时,它应阻塞指定的秒数。写访问对文件内容没有副作用,即在读访问上,文件应为空(参见 LDD3,第6/7章)
  • 编写一个 proc 文件,在其中可以临时存储一些文本(使用“echo“blah” > /proc/pipe”),并再次获取它(cat /proc/pipe),并清除该文件。注意同步问题。
  • 修改 pipe 示例模块以注册为字符设备 /dev/pipe,并添加动态内存分配以处理写请求。
  • 编写一个非常简单的文件系统。

5
一本绝对必读的书是 Rubini 的 this 书(可作为硬拷贝或免费软拷贝获取)。他提供了多个虚拟驱动程序的实现,不需要任何硬件设备除了您的电脑。因此,对于开始内核开发来说,这是最简单的方法。
至于嵌入式开发,我建议购买众多的 SBC(单板计算机)之一。其中有许多基于 x86 处理器的,通常带有 PC/104 接口(电气上与 ISA 总线标准相同,但基于可堆叠连接器而非边缘连接器 - 非常容易接口自定义硬件)。
它们通常具有 VGA 连接器,使调试更加容易。

3

对于嵌入式Linux开发,你可以在任何地方购买到的简单Linksys WRT54G路由器本身就是一个开发平台http://en.wikipedia.org/wiki/Linksys_WRT54G_series:

WRT54G以其发布固件源代码以满足GNU GPL的义务而著称。这使得程序员可以修改固件以更改或添加设备功能。几个第三方固件项目为WRT54G提供了增强固件。

我尝试在上面安装OpenWrtDD-WRT固件。您可以将它们作为低成本平台进行开发的起点。


3
首先,最好的方法是阅读大量代码。由于Linux是开源的,你会找到许多驱动程序。找到一个与你想要编写的代码在某种程度上相似的驱动程序。你会发现一些不错的、相对容易理解的代码(如环回设备、ROM文件系统等)。
你还可以使用lxr.linux.no,这是Linux代码交叉引用。如果您需要查找某个功能的工作方式并需要查看代码,则这是一种很好且简单的方式。
还有一本O'Reilly书(了解Linux内核,第3版涵盖了2.6内核)或者如果你想要免费的东西,你可以使用高级Linux编程书(http://www.advancedlinuxprogramming.com/)。还有很多关于文件系统、网络等的具体文档。

1

我完全是内核编程的新手 :) 我决定购买两本书《Linux程序开发:带练习指南》和《编写Linux设备驱动程序:带练习指南》。它们写得非常清晰,并为进一步学习提供了良好的基础。


1

需要准备的一些事情:

  • 你将进行交叉编译。嵌入式设备将使用MIPS、PowerPC或ARM CPU,但没有足够的CPU功率、内存或存储来在合理的时间内编译自己的内核。
  • 嵌入式系统通常使用串口作为控制台,并且为了降低成本,生产板上通常没有连接器焊接。除非你可以焊接串口连接器,否则调试内核崩溃非常困难,你不会得到太多关于出了什么问题的信息。

Linksys NSLU2是一个低成本的方式,可以让你使用真正的嵌入式系统,并具有添加外围设备的USB端口。任何一个无线接入点都可以使用,参见OpenWrt兼容性页面。请注意,你在商店里找到的Linksys WRT54G的当前型号不能再使用Linux:它们的RAM和Flash更少,以降低成本。Cisco/Linksys现在在WRT54G上使用vxWorks,具有较小的内存占用。

如果你真的想深入了解,嵌入式CPU评估套件的价格从几百美元开始。除非你需要职业工作或咨询合同,否则我建议不要在这方面花费金钱。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接