netmap内存池初始化流程

来源:互联网 发布:linux route 编辑:程序博客网 时间:2024/05/16 04:24


原文发表在 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 0