netmap内存池初始化流程


原文发表在 YYNOTE.COM, 地址:  http://yynote.com/blog/detail/networking/netmap-memory-pool-init-follow



  1. netmap_adapter 的申请

    在 e1000probe() -> e1000netmapattach() -> netmapattache() 中: 申请 netmapadapter 并且通过 WNA(ifp) = na; 保存至netdevice 的ax25_ptr 指针中。

  2. 在linuxnetmapopen 中会申请netmapprivd 结构priv, 然后存储在 file->private_data 域中.

  3. 在ioctl (NIOCGINFO) 中调用 至: linuxnetmapioctl -> netmapioctl 的 Case NIOCGINFO中, 进而调用netmapgetmemorylocked(priv) . 此时, priv 中的npifp = NULL, 因此NA=NULL,所以: nmd = nmmem. 接下来调用至netmapmemglobalfinalize. 在该函数中先调netmapmemoryconfig 进行参数配置,比如页对齐等,然后调用netmapmemfinalizeall , 调用 netmapfinalizeobj_allocator 分配内存,设置虚 拟地址和物理地址映射查找表。至此,设置 全局配置:

          netmap_buf_size = nmd->pools[NETMAP_BUF_POOL]._objsize;
          netmap_total_buffers
    = nmd->pools[NETMAP_BUF_POOL].objtotal;
          netmap_buffer_lut
    = nmd->pools[NETMAP_BUF_POOL].lut;
          netmap_buffer_base
    = nmd->pools[NETMAP_BUF_POOL].lut[0].vaddr;
  4. 在 ioctl (NIOCREGIF) 中通过 getifp 获取到 netdevice 的ifp , 然后在netmapdoregif 中, priv->npifp = ifp; 将当前的netdevice 保存至 file->private->npifp. 同时此时 通过 ifp 指针能够获取到保存在其中的 netmapadapter 结构.

  5. 通过 netmapifnew 调用 netmapmemifnew 分配netmapadapter的netmapring 管理结构体, 调用netmapnew_bufs 给每个ring的每个slot向netmap缓存区申请内存.

下面是内存管理结构图:

     alt text


文章版权归属yynote.com.转载请标明出处.

本文地址: http://yynote.com/blog/detail/networking/netmap-memory-pool-init-follow


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
netmap是一个基于零拷贝思想的高速网络I/O架构,它通过在网卡运行在netmap模式下与主机协议栈断开连接,并创建一个netmap环来实现高效的数据包处理。\[2\]netmap的架构包括了网卡环、netmap环和用于与主机协议栈交互的环。网卡环是网卡直接将数据包存入的缓存,而netmap环是应用程序可以通过调用netmap API访问的缓存。这些缓存位于共享空间,应用程序可以直接访问数据包内容,实现了网络数据包的零拷贝。\[2\] netmap的数据结构包括了netmap_if、nmreq、netmap_ring等。netmap_if是一个结构体,用于表示一个netmap接口,其包含了与接口相关的信息。nmreq是一个结构体,用于向内核注册一个netmap接口。netmap_ring是一个结构体,用于表示一个netmap环,其包含了环的相关信息,如可用的数据包数量、当前处理的数据包索引等。\[3\] 在使用netmap时,可以通过打开字符设备"/dev/netmap"来获取一个文件描述符,然后使用ioctl函数来注册网卡。接下来,可以使用mmap函数将共享内存映射到用户空间,从而可以访问netmap的数据包内容。最后,可以使用poll函数来等待数据包的到达,并通过遍历netmap的数据包来处理数据。\[3\] 需要注意的是,上述提供的代码示例是一个官方的例子,可能已经过时,不能直接使用。但是它可以大致说明netmap的使用过程。\[3\] #### 引用[.reference_title] - *1* *3* [netmap 介绍](https://blog.csdn.net/fengfengdiandia/article/details/52869290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Netmap分析(一)](https://blog.csdn.net/superbfly/article/details/51224920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值