network 协议栈
协议层次 | 协议包 |
---|---|
四 | udp |
三 | ip |
二 | eth |
xv6 e1000 接受包的过程
接受到网络包的时候网卡会发出中断,调用 e1000_intr
else if(irq == E1000_IRQ){
e1000_intr();
}
从 recv descriptor 中读取数据通过 net_rx
提交到协议栈之后,会依次 parse 协议。首先是 eth 协议,提出头 ethhdr 之后,根据 ethhdr->type 来进一步解析。
ethhdr = mbufpullhdr(m, *ethhdr);
if (!ethhdr) {
mbuffree(m);
return;
}
type = ntohs(ethhdr->type);
if (type == ETHTYPE_IP)
net_rx_ip(m);
如果接下来是 IP 协议,parse udp 协议(没有 TCP 是因为 qemu 不太支持)
len = ntohs(iphdr->ip_len) - sizeof(*iphdr);
net_rx_udp(m, len, iphdr);
qemu 如何提供网络功能
https://medium.com/@tunacici7/qemu-eli5-part-7-networking-ec49f8418826
Documentation/Networking - QEMU
ifeq ($(LAB),net)
QEMUOPTS += -netdev user,id=net0,hostfwd=udp::$(FWDPORT)-:2000 -object filter-dump,id=net0,netdev=net0,file=packets.pcap
QEMUOPTS += -device e1000,netdev=net0,bus=pcie.0
endif
network backend 有点类似于网络交换设备,路由器、交换机
CVE-2023-21987&CVE-2023-21991
啥是 virtualbox
类似于 vmware 是一个开源、轻便的、但是速度可能差一点的
build virtual box
找不到 virtual cpp error: Cannot find cl.exe (Visual C++) anywhere on your system. Check the build requirements. · Issue #7 · VirtualBoBs/build-virtualbox-in-windows 然后发现需要安装英文的语言包就行….