2024年3月26日发(作者:)

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整

性,严禁用于任何商业用途。

E-mail: wwwlkk@

来源: /?business&aid=6&un=wwwlkk#7

从系统调用的角度来看待如何使用PACKET_MMAP:

[setup]:

socket() ------> 捕获socket的创建

setsockopt() ------> 环形缓冲区的分配

mmap() ------> 将分配的缓冲区映射到用户空间中

[capture]

poll() ------> 等待新进的报文

[shutdown]

close ------> 销毁捕获socket和所有相关的资源

下面逐步分析以上步骤的具体实现:

PACKET_MMAP实现分析

1

/7

1)fd = socket(PF_PACKET, mode, htons(ETH_P_ALL))是建立一个packet_sock结构。

2)setsockopt(fd, SOL_PACKET, PACKET_RX_RING, (void *)&req, sizeof(req));是分配物理内存。

3)mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);是将2)建立的物理内存映射

到进程的地址空间。

经过以上3个步骤,内核建立起如图1所示的内存区结构。

PACKET_MMAP实现分析

2

/7