Google Summer of Code 2013¶
项目提案创意¶
本页列出了一些可以在 Google Summer of Code 2013 中为 iPXE 开发的创意。欢迎就其中任何创意联系 iPXE 开发者,或提出你自己的项目创意。
驱动程序开发¶

我们总是需要更多的网卡驱动程序,而且许多现有驱动程序也会受益于重写。一些驱动程序仍在使用传统的 Etherboot 驱动程序 API。一些驱动程序是从 Linux 驱动程序移植的,这通常会产生过于庞大、包含大量冗余代码的驱动程序。
理想情况下,网卡驱动程序应该使用 iPXE 网络驱动程序 API 从头编写。这样通常能得到一个小巧高效的驱动程序,只需极少的改动就能支持新的网卡型号。
你将编写直接与硬件交互的底层 C 代码。你应该对计算机的内部工作原理有良好的理解:你应该了解内存地址、PCI BAR、内存映射 I/O 和 DMA 等概念。
要求¶
要开发新的网卡驱动程序,你需要:
- 若干相关网卡的样品。iPXE 项目乐意为任何在 GSoC 2013 中从事驱动程序开发的人购买并提供网卡。
- 一台运行能够构建 iPXE 的操作系统(如 Linux)的开发机(或虚拟机)。
- 一台用于测试代码的测试机(必须是物理机)。它不能与开发机是同一台机器,因为你需要频繁重启测试机。测试机应有板载串口用于调试。
- 一条连接测试机和开发机用于调试的 null-modem 线缆。如有需要,iPXE 项目乐意购买并提供 null-modem 线缆。
入门¶
下载并构建 iPXE,用它启动一台真实的物理机。查看一些现有网络驱动程序的 iPXE 源代码,例如 realtek.c 和 intel.c。查看一份网卡数据手册,例如 http://download.intel.com/design/network/datashts/82547gi_ei_ds.pdf。找出一款目前不受 iPXE 支持的网卡,或一个需要改进的现有驱动程序。
预编译二进制 Web 界面¶

许多用户更希望能够下载 iPXE 的预编译二进制版本,而不是从源代码构建。目前只提供了少数预编译二进制文件(例如 http://boot.ipxe.org/ipxe.iso),而且无法定制这些二进制文件以包含额外的构建选项或嵌入式脚本。
有一个未完成但基本可用的自动构建服务器脚本 build.fcgi,它旨在通过如下 URL 提供按需构建的二进制文件:
http://build.ipxe.org/undionly.kpxe
http://build.ipxe.org/bin-x86_64-efi/ipxe.efi
http://build.ipxe.org/undionly.kpxe?DEBUG=iscsi
设想是:一个基于 Web 的用户界面应该让用户能够选择任何相关的构建选项、指定任何嵌入式脚本等,然后构造并下载相应的 http://build.ipxe.org/ URL。
你将设计用户界面,并使用 HTML、CSS 和一种合适的服务器端语言(如 Perl)来实现它。build.fcgi 脚本是用 Perl 编写的,所以即使你选择用不同的语言编写自己的服务器端代码,你也需要能够理解和调试 Perl 代码。
要求¶
要开发预编译二进制 Web 界面,你需要:
- 一台运行能够构建 iPXE 并运行 Apache Web 服务器的操作系统(如 Linux)的开发机(或虚拟机)。
入门¶
下载并构建 iPXE。阅读并尝试嵌入式脚本和调试选项。查看 config/general.h 中可用的构建选项(其中一些已有文档),并尝试启用其中一些选项进行构建。
快速浏览一下 Rom-o-matic 网站,这是一个为旧版本 gPXE 提供简易构建界面的传统网站。
思考什么样的用户界面才算好。考虑如何展示所有各种构建选项而不让用户被复杂性淹没,以及如何让最常见的构建类型变得简单。
ProxyDHCP 服务器¶

iPXE 等 PXE 客户端需要启动文件名等配置选项。这些信息通常由 DHCP 服务器提供。
在某些网络中,用户可能无法更改 DHCP 服务器配置以提供必要的选项。例如,在大型企业网络中,DHCP 服务器可能受到严格的变更控制措施约束。在小型家庭网络中,DHCP 服务器可能内嵌在 ADSL 路由器中,无法调整其配置。在这些网络中,DHCP 服务器可用于获取 IP 地址,但不能用于提供配置选项。
为解决这个问题,PXE 规范允许对 DHCP 协议进行扩展,称为 ProxyDHCP,它允许 ProxyDHCP 服务器提供配置选项而不必提供 IP 地址。"真正的"DHCP 服务器提供 IP 地址,ProxyDHCP 服务器提供配置选项。
开源的 dnsmasq 服务器能够充当 ProxyDHCP 服务器,目前使用静态文本文件进行配置。
ProxyDHCP 是无状态协议,所有请求都是幂等的。一个相当巧妙的解决方案是扩展 dnsmasq,允许通过 HTTP 动态获取配置:dnsmasq 会把 ProxyDHCPDISCOVER 转换成 HTTP GET 请求,从而允许响应由运行在 Web 服务器上的脚本高效地构造。这样可以把决定客户端 DHCP 选项的策略与响应 DHCP 请求的机制分离开来,提供极大的灵活性,同时还能实现冗余和故障转移等理想特性。
你将修改 dnsmasq 源代码,使其能够把 ProxyDHCP 请求转换成 HTTP GET 请求。你还将实现一个示例 Web 服务器脚本来响应这些转换后的 ProxyDHCP 请求。你将与 iPXE 开发者合作,确保你开发的 ProxyDHCP 功能足以满足 iPXE 的需求,并与 dnsmasq 开发者合作,把你的更改合并到 dnsmasq 源代码的上游。
要求¶
要为 Linux 开发 ProxyDHCP 服务器,你需要:
- 一台运行能够构建 dnsmasq 和 iPXE 的操作系统(如 Linux)的开发机(或虚拟机)。
- 几台用于运行 iPXE 和你修改后的 dnsmasq 的测试机(或虚拟机)。
入门¶
从 http://www.thekelleys.org.uk/dnsmasq/ 下载并构建 dnsmasq 源代码。确保你能使用自己构建的 dnsmasq 版本启动 iPXE。捕获一些 DHCP 数据包并查看其内部,了解 DHCP 选项在实践中的工作方式。查看 dnsmasq 源代码以了解其工作原理。
熟悉环境¶
你的第一项任务应该是下载并构建 iPXE,然后在虚拟机中测试启动。例如:
cd src
make bin/ipxe.iso
qemu -boot d -cdrom bin/ipxe.iso
你应该能够看到 iPXE 开始运行。在配置好网络并搭建一些服务器之前,它还无法启动任何东西,但你至少可以尝试与 iPXE 命令行交互。
尝试对 iPXE 代码做一个小改动,例如编辑 core/main.c 并修改启动消息。重新构建并检查你的改动是否可见。
申请流程¶

你将通过 GSoC Web 应用提交申请。你的申请至少应包括:
- 你的姓名和尽可能多的联系方式(电子邮件地址、电话号码、IRC 昵称等)。
- 你想要实现的内容的简要概述,包括项目每一周的一些现实目标。尽量用可衡量的里程碑来思考。例如,如果你在实现一个新的网络驱动程序,那么一些合理的里程碑可能是:
- 第 1 周:能够从网卡读取 MAC 地址,通过使用
ifstat命令显示 MAC 地址来验证 - 第 2 周:能够发送数据包,通过使用
dhcp命令、捕获发送的数据包,并使用 Wireshark 观察发送的 DHCP 数据包来验证 - ……
- 第 4 周:能够在 4.6 秒(即 1Gbps 线速)内正确下载包含伪随机数据的 512MB 测试文件,使用
md5sum和time命令验证 - ……
- 一些表明你熟悉 iPXE 代码库的材料。如果你已经为本项目贡献过代码,请列出你之前的一些提交。
申请流程将包括一次面试,面试中会要求你用 C 语言解决一些简短的编程练习。前几年使用过这些练习:
memcpy_and_sum()¶
/**
* Copy memory region and calculate byte checksum
*
* @v dst Destination address
* @v src Source address
* @v len Length of region
* @ret sum Byte checksum
*
* This function copies a region of memory of length "len" from "src"
* to "dst", as per the standard C function "memcpy()". It also
* calculates the byte checksum of the region.
*
* For example, suppose that we have:
*
* uint8_t src[4] = { 0x47, 0x53, 0x6f, 0x43 };
* uint8_t dst[4];
* uint8_t sum;
*
* sum = memcpy_and_sum ( dst, src, 4 );
*
* then we should end up with dst[] containing the bytes { 0x47, 0x53,
* 0x6f, 0x43 }, and sum having the value 0x47+0x53+0x6f+0x43=0x4c.
*/
uint8_t memcpy_and_sum ( void *dst, const void *src, size_t len ) {
// Your code goes here
}
reverse_array()¶
/**
* Reverse the order of an array of 32-bit integers
*
* @v array Array of integers
* @v count Number of elements in the array
*
* This function simply reverses the order of the elements in an array
* of 32-bit integers. For example, suppose that we have:
*
* uint32_t array[3] = { 0x12345678, 0xdeadbeef, 0xf00df00d };
*
* reverse_array ( array, 3 );
*
* then array[] should contain { 0xf00df00d, 0xdeadbeef, 0x12345678 }.
*/
void reverse_array ( uint32_t *array, unsigned int count ) {
// Your code goes here
}
投入要求¶
你应该预期在夏季全职投入你的 GSoC 项目。不需要每天固定工作时长,但你应该每周投入约 40 小时,才能对得起这个项目。
我们喜欢与学生保持持续的沟通。你应该预期几乎一直待在 #ipxe IRC 频道中,并且至少每个工作日沟通一次。
根据以往的经验,我们经常发现学生试图在不求助于人的情况下完成工作。从学术背景来看,这是可以理解的;在你的学位课程中,能够证明自己可以独立工作很重要。然而,GSoC 本质上不是学术活动。我们希望你寻求帮助。如果你不需要问问题,那可能意味着你的项目挑战性不够。
有用链接¶
- ipxe-devel@lists.ipxe.org——项目邮件列表
- Freenode 上的 #ipxe——项目 IRC 频道