1. E1000
    1. transimit descriptor ring structure
    2. mbuf structure

E1000

看不懂洋文看不懂洋文啊啊啊

transimit descriptor ring structure

若干 transimit descripor 组成一个环状结构,由两个寄存器标记头和尾(TDH 和 TDT)。

image-20240319171557323

HEAD 和 TAIL 之间是由硬件控制的 descriptor。新的需要传递的网络包写到 TAIL 指向的 descriptor,网卡硬件从 HEAD 指向的 descriptor 开始传输网络包,直到 HEAD 与 TAIL 之间没有其他内容。

DD 标志可以判断传输是否完成来避免软件影响被硬件控制的 descriptor,从而防止 race condition

receive descriptor 也类似。

mbuf structure

// The above functions manipulate the size and position of the buffer:
//            <- push            <- trim
//             -> pull            -> put
// [-headroom-][------buffer------][-tailroom-]
// |----------------MBUF_SIZE-----------------|
//
// These marcos automatically typecast and determine the size of header structs.
// In most situations you should use these instead of the raw ops above.
#define mbufpullhdr(mbuf, hdr) (typeof(hdr)*)mbufpull(mbuf, sizeof(hdr))
#define mbufpushhdr(mbuf, hdr) (typeof(hdr)*)mbufpush(mbuf, sizeof(hdr))
#define mbufputhdr(mbuf, hdr) (typeof(hdr)*)mbufput(mbuf, sizeof(hdr))
#define mbuftrimhdr(mbuf, hdr) (typeof(hdr)*)mbuftrim(mbuf, sizeof(hdr))

MBUF 有小部分就是中间的 buffer,前后预留了一些空间 headroom 和 tailrom 以便之后调整大小。如果需要在buffer 的头部增加一些东西就 push,如果在尾部增加东西就 put,如果从头部取出东西就 pull 等等。