QEMU¶
在配置之前先考虑一个现实的问题, 为了阻止 pxe 启动, 省事地将 -net none 加上了, ~~所以去掉之后该思考一下怎么阻止 pxe 启动了~~. 其实问出这个问题就很 神金.
在之前我们将 bioos 分出了 .vars 与 .code, .vars 只需要一次在 uefi menu 中的设置就可以保存下来.实际上只需要 -boot c 就可以直接从硬盘启动了, 这是 qemu_fw_cfg 的功劳. 以后可以谈谈.
目的地¶
e1000 在发送的时候貌似没有地址?
实际上的地址存储在一个叫 以太网帧 的数据结构中, 填充 MAC 地址即可.
在刚开始的时候可能不知道对方的 MAC 地址, 所以选择 广播, 即发送到 FF:FF:FF:FF:FF:FF
调试¶
向 QEMU 广播:
监听 tap0, 以 16 进制输出 payload 原始内容(-XX):
中断¶
一个棘手的问题, PCI 设备的中断问题.
如果用的是 PIC, 那么 PCI Config Space 中的 Interrupt Line 就是 要设置的 irq.
如果用的是 APIC, 就比较麻烦了. 这是我们有两种选择:
- ACPI 查询
- MSI - Message Signaled Interrupts
对于 e1000, 第二种方法实际上是不存在的, 它不支持.
但是由于 懒 的特性, 我决定 用 e1000e, 尽管它是一个 PCIe 设备, 还是可以通过 PCI驱动 读取 256Byte 的配置空间来进行 MSI 的配置.
关于 MSI 的代码, 可以在 kernel/dev/pci.c 找到.
但这只是一个尝鲜的方法, 并不是长久之计. 在之后, 需要通过 读取 ACPI 来查询 e1000 所使用的 ioapic pin.
这个 pin number 存储在 _PRT (PCI Routing Table) 方法中, 需要通过 解析 AML 语言 来执行这个方法, 写一个 AML 解释器是困难的, 调用库就可以了.
acpicauacpilai-Lightweight AML Interpreter
这里选择 lai