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


发布评论