从零写OS(三十七):网络栈 —— e1000 驱动 + ARP/IP/TCP + Socket

文件系统能读写了,这一章加网络支持。目标是实现一个最小 TCP/IP 栈,让用户程序能通过 socket 发送 HTTP 请求并收到响应。 验证方式: / # wget_test wget_test start connecting... connected! request sent HTTP/1.0 200 OK ... DONE 架构概览 用户程序(wget_test) ↕ syscall: socket/connect/write/read/close 内核 socket 层(net.c) ↕ tcp_connect / tcp_send / tcp_recv / tcp_close TCP 层(net.c) ↕ 以太网帧收发 ARP 层(net.c) ↕ e1000_send / e1000_recv e1000 网卡驱动(e1000.c) ↕ MMIO + DMA QEMU e1000 虚拟网卡(-netdev user,id=net0 -device e1000,netdev=net0) PCI 枚举 e1000 通过 PCI 总线连接。内核在启动时枚举 PCI 设备: void pci_enumerate(void) { for (bus=0; bus<256; bus++) for (dev=0; dev<32; dev++) for (fn=0; fn<8; fn++) { uint16_t vendor = pci_read16(bus, dev, fn, 0); if (vendor == 0xFFFF) continue; // 记录 vendor/device/bar0 } } e1000 的 vendor=0x8086,device=0x100E。BAR0 是 MMIO 基地址(通常 0xFEBC0000)。 ...

May 22, 2026 · 4 min · 大飞
京ICP备14031575号-3