求PF灭火器地上警戒线要求 还有使用方法

4951人阅读
Linux Develop(135)
pf_ring通过用户态、内核态共享内存达到提高包处理效率的目的。
1、PF_Ring加载的3种模式,模式0和调用libpcap性能相同,模式1和模式2相当于0 coyp性能会提升,官网http://www.ntop.org/products/pf_ring/。
As of PF_RING 4.1, when inserting the pf_ring module it is possible to specify three operational modes:
Transparent Mode 0: standard NAPI polling
insmod pf_ring.ko transparent_mode=0
Transparent Mode 1: PF_RING-aware driver copies the packets into PF_RING, while the same packet is still passed to NAPI
insmod pf_ring.ko transparent_mode=1
Transparent Mode 2: PF_RING-aware driver copies the packets into PF_RING, the packet is not passed to NAPI
insmod pf_ring.ko transparent_mode=2
2、整理一下pf_ring是如何通过mmap来实现共享内存的。
kernel/pf_ring.c:7861
static struct proto_ops ring_ops = {.family = PF_RING,.owner = THIS_MODULE,
/* Operations that make no sense on ring sockets. */.connect = sock_no_connect,.socketpair = sock_no_socketpair,.accept = sock_no_accept,.getname = sock_no_getname,.listen = sock_no_listen,.shutdown = sock_no_shutdown,.sendpage = sock_no_sendpage,
/* Now the operations that really occur. */.release = ring_release,.bind = ring_bind,.mmap = ring_mmap,.poll = ring_poll,.setsockopt = ring_setsockopt,.getsockopt = ring_getsockopt,.ioctl = ring_ioctl,.recvmsg = ring_recvmsg,.sendmsg = ring_sendmsg,};
这样,当用户态调用mmap时,将会调用ring_mmap函数。
用户态调用
userland/lib/pfring_mod.c:162
ring-&buffer = (char *)mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE,MAP_SHARED, ring-&fd, 0);
if(ring-&buffer == MAP_FAILED) {printf(&mmap() failed: try with a smaller snaplen\n&);close(ring-&fd);return -1;}
ring-&slots_info = (FlowSlotInfo *)ring-&if(ring-&slots_info-&version != RING_FLOWSLOT_VERSION) {printf(&Wrong RING version: &&kernel is %i, libpfring was compiled with %i\n&,ring-&slots_info-&version, RING_FLOWSLOT_VERSION);close(ring-&fd);return -1;}memSlotsLen = ring-&slots_info-&tot_munmap(ring-&buffer, PAGE_SIZE);
ring-&buffer = (char *)mmap(NULL, memSlotsLen,PROT_READ|PROT_WRITE,MAP_SHARED, ring-&fd, 0);
/* printf(&mmap len %u\n&, memSlotsLen); */
if(ring-&buffer == MAP_FAILED) {printf(&mmap() failed&);close(ring-&fd);return -1;}
ring-&slots_info = (FlowSlotInfo *)ring-&ring-&slots = (char *)(ring-&buffer+sizeof(FlowSlotInfo));
首先通过mmap出一个页,读出ring的相关信息(包括memSlot长度),进而将所有的共享区域全部map出来。
内核态实现
用户态调用了mmap后,内核态对应的实现函数是ring_mmap。
调用链是ring_alloc_mem =& ring_alloc_mem =&&allocate_shared_memory =&&vmalloc_user
分配完映射的内存后
ring_mmap =&&do_memory_mmap =&&remap_vmalloc_range
完成映射过程.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:947592次
积分:12003
积分:12003
排名:第1237名
原创:315篇
转载:33篇
评论:110条
(1)(1)(1)(1)(1)(1)(2)(2)(2)(7)(4)(5)(4)(2)(6)(4)(5)(6)(15)(3)(7)(8)(1)(4)(7)(3)(6)(22)(13)(9)(13)(5)(2)(13)(16)(11)(2)(5)(12)(2)(9)(4)(7)(15)(2)(7)(2)(2)(4)(6)(3)(1)(1)(1)(4)(1)(2)(1)(1)(1)(2)(1)(2)(36)(1)(1)

参考资料

 

随机推荐