当前位置导航:炫浪网>>网络学院>>操作系统>>Linux教程

Linux 核心--16.Linux数据结构


  原著: David A Rusling
  翻译: Banyan & fifa
  
  第十五章 Linux核心数据结构 
  
  本章列出了Linux实用的主要数据结构。 
  block_dev_struct
  此结构用于向核心登记块设备,它还被buffer cache实用。所有此类结构都位于blk_dev数组中。 
  
  struct blk_dev_struct {
      void (*request_fn)(void);
      struct request * current_request;
      struct request   plug;
      struct tq_struct plug_tq;
  };
  
  buffer_head
  此结构包含关于buffer cache中一块缓存的信息。 
  
  /* bh state bits */
  #define BH_Uptodate  0   /* 1 if the buffer contains valid data      */
  #define BH_Dirty     1   /* 1 if the buffer is dirty                 */
  #define BH_Lock      2   /* 1 if the buffer is locked                */
  #define BH_Req       3   /* 0 if the buffer has been invalidated     */
  #define BH_Touched   4   /* 1 if the buffer has been touched (aging) */
  #define BH_Has_aged  5   /* 1 if the buffer has been aged (aging)    */
  #define BH_Protected 6   /* 1 if the buffer is protected             */
  #define BH_FreeOnIO  7   /* 1 to discard the buffer_head after IO    */
  
  struct buffer_head {
    /* First cache line: */
    unsigned long      b_blocknr;    /* block number                   */
    kdev_t             b_dev;        /* device (B_FREE = free)         */
    kdev_t             b_rdev;       /* Real device                    */
    unsigned long      b_rsector;    /* Real buffer location on disk   */
    struct buffer_head *b_next;      /* Hash queue list                */
    struct buffer_head *b_this_page; /* circular list of buffers in one 
                                        page                           */
  
    /* Second cache line: */
    unsigned long      b_state;      /* buffer state bitmap (above)    */
    struct buffer_head *b_next_free;
    unsigned int       b_count;      /* users using this block         */
    unsigned long      b_size;       /* block size                     */
  
    /* Non-performance-critical data follows. */
    char               *b_data;      /* pointer to data block          */
    unsigned int       b_list;       /* List that this buffer appears  */
    unsigned long      b_flushtime;  /* Time when this (dirty) buffer
                                      * should be written              */
    unsigned long      b_lru_time;   /* Time when this buffer was 
                                      * last used.                     */
    struct wait_queue  *b_wait;
    struct buffer_head *b_prev;      /* doubly linked hash list        */
    struct buffer_head *b_prev_free; /* doubly linked list of buffers  */
    struct buffer_head *b_reqnext;   /* request queue                  */
  };
  
  device
  系统中每个网络设备都用一个设备数据结构来表示。 
  
  struct device 
  {
  
    /*
     * This is the first field of the "visible" part of this structure
     * (i.e. as seen by users in the "Space.c" file).  It is the name
     * the interface.
     */
    char                    *name;
  
    /* I/O specific fields                                           */
    unsigned long           rmem_end;        /* shmem "recv" end     */
    unsigned long           rmem_start;      /* shmem "recv" start   */
    unsigned long           mem_end;         /* shared mem end       */
    unsigned long           mem_start;       /* shared mem start     */
    unsigned long           base_addr;       /* device I/O address   */
    unsigned char           irq;             /* device IRQ number    */
  
    /* Low-level status flags. */
    volatile unsigned char  start,           /* start an operation   */
                            interrupt;       /* interrupt arrived    */
    unsigned long           tbusy;           /* transmitter busy     */
    struct device           *next;
  
    /* The device initialization function. Called only once.         */
    int                     (*init)(struct device *dev);
  
    /* Some hardware also needs these fields, but they are not part of
       the usual set specified in Space.c. */
    unsigned char           if_port;         /* Selectable AUI,TP,   */
    unsigned char           dma;             /* DMA channel          */
  
    struct enet_statistics* (*get_stats)(struct device *dev);
  
    /*
     * This marks the end of the "visible" part of the structure. All
     * fields hereafter are internal to the system, and may change at
     * will (read: may be cleaned up at will).
     */
  
    /* These may be needed for future network-power-down code.       */
    unsigned long           trans_start;     /* Time (jiffies) of 
                                                last transmit        */
    unsigned long           last_rx;         /* Time of last Rx      */
    unsigned short          flags;           /* interface flags (BSD)*/
    unsigned short          family;          /* address family ID    */
    unsigned short          metric;          /* routing metric       */
    unsigned short          mtu;             /* MTU value            */
    unsigned short          type;            /* hardware type        */
    unsigned short          hard_header_len; /* hardware hdr len     */
    void                    *priv;           /* private data         */
  
    /* Interface address info. */
    unsigned char           broadcast[MAX_ADDR_LEN];
    unsigned char           pad;               
    unsigned char           dev_addr[MAX_ADDR_LEN];  
    unsigned
相关内容
赞助商链接