Chinaunix首页 | 论坛 | 博客
  • 博客访问: 648980
  • 博文数量: 156
  • 博客积分: 4833
  • 博客等级: 上校
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-21 19:36
文章分类

全部博文(156)

文章存档

2016年(2)

2013年(1)

2012年(13)

2011年(30)

2010年(46)

2009年(29)

2008年(23)

2007年(12)

分类: BSD

2011-12-13 20:55:03

//mbuf 的使用有很多trick为了省空间

预先分好的一些 slab
zone_mbuf, zone_clust, zone_jumbop

zone_pack使用的是zone_clust的空间
m_getcl->uma_zalloc_arg->zone_alloc_item->(zone->uz_init:arg->uminit:mb_zinit_pack)

zone_pack使用最频繁,所以做了很多优化。
一次分配mbuf+zone_clust, cache特性较好。
m_getcl使用zone_pack

这个比较乱:
     m_getcl  获取普通大小2K mbuf
     m_getjcl 获取指定大小K mbuf    
     m_gethdr 获取Mbuf 能存下小于  MSIZE(256)- sizeof(struct m_hdr) -sizeof(struct pkthdr)

     m_clget  为mbuf分配2k ext data
     //////////////////////////////////////////////
     mbuf在数据包小的时候不使用m_ext部分,都自己保存。
     存不下了就需要扩。
     根据(m->m_flags & M_EXT)判断!
    
    
    
 struct mbuf {
        struct m_hdr    m_hdr;
        union {
                    struct {
                             struct pkthdr    MH_pkthdr;              /* M_PKTHDR set */
                             union {
                                          struct  m_ext    MH_ext;    /* M_EXT set */
                                          char    MH_databuf[MHLEN];
                                       } MH_dat;
                               } MH;
                    char    M_databuf[MLEN];                     /* !M_PKTHDR, !M_EXT */
              } M_dat;
};

struct m_hdr {
    struct mbuf    *mh_next;    /* next buffer in chain */
    struct mbuf    *mh_nextpkt;    /* next chain in queue/record */
    caddr_t         mh_data;    /* location of data */     根据需要随时调整!!
    int             mh_len;    /* amount of data in this mbuf */
    int             mh_flags;    /* flags; see below */
    short           mh_type;    /* type of data in this mbuf */
    uint8_t         pad[M_HDR_PAD];/* word align                  */
};

struct m_ext {
    caddr_t         ext_buf;    /* start of buffer */
    void           (*ext_free)    /* free routine if not the usual */
                (void *, void *);
    void        *ext_arg1;    /* optional argument pointer */
    void        *ext_arg2;    /* optional argument pointer */
    u_int         ext_size;    /* size of buffer, for ext_free */
    volatile u_int    *ref_cnt;    /* pointer to ref count info */
    int         ext_type;    /* type of external storage */ EXT_JUMBO9...
};

#define    m_next        m_hdr.mh_next
#define    m_len         m_hdr.mh_len
#define    m_data        m_hdr.mh_data
#define    m_type        m_hdr.mh_type
#define    m_flags       m_hdr.mh_flags
#define    m_nextpkt     m_hdr.mh_nextpkt
#define    m_act         m_nextpkt
#define    m_pkthdr      M_dat.MH.MH_pkthdr
#define    m_ext         M_dat.MH.MH_dat.MH_ext
#define    m_pktdat      M_dat.MH.MH_dat.MH_databuf
#define    m_dat         M_dat.M_databuf

阅读(1140) | 评论(0) | 转发(0) |
0

上一篇:BSD 开发笔记

下一篇:BSD 进程与线程......

给主人留下些什么吧!~~