首 页文章中心

Linux学习网

您的位置Linux学习网 > Linux综合 > 文章内容

第十五章 Linux核心数据结构

作者:佚名  来源:不详  发布时间:2007-12-21 16:49:00
本章列出了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 char           addr_len;        /* hardware addr len    */  unsigned long           pa_addr;         /* protocol address     */  unsigned long           pa_brdaddr;      /* protocol broadcast addr*/  unsigned long           pa_dstaddr;      /* protocol P-P other addr*/  unsigned long           pa_mask;         /* protocol netmask     */  unsigned short          pa_alen;         /* protocol address len */  struct dev_mc_list      *mc_list;        /* M'cast mac addrs     */  int                     mc_count;        /* No installed mcasts  */    struct ip_mc_list       *ip_mc_list;     /* IP m'cast filter chain */  __u32                   tx_queue_len;    /* Max frames per queue   */      /* For load balancing driver pair support */  unsigned long           pkt_queue;       /* Packets queued       */  struct device           *slave;          /* Slave device         */  struct net_alias_info   *alias_info;     /* main dev alias info  */  struct net_alias        *my_alias;       /* alias devs           */    /* Pointer to the interface buffers. */  struct sk_buff_head     buffs[DEV_NUMBUFFS];  /* Pointers to interface service routines. */  int                     (*open)(struct device *dev);  int                     (*stop)(struct device *dev);  int                     (*hard_start_xmit) (struct sk_buff *skb,                                              struct device *dev);  int                     (*hard_header) (struct sk_buff *skb,                                          struct device *dev,                                          unsigned short type,                                          void *daddr,                                          void *saddr,                                          unsigned len);  int                     (*rebuild_header)(void *eth,                                           struct device *dev,                                          unsigned long raddr,                                          struct sk_buff *skb);  void                    (*set_multicast_list)(struct device *dev);  int                     (*set_mac_address)(struct device *dev,                                          void *addr);  int                     (*do_ioctl)(struct device *dev,                                           struct ifreq *ifr,                                          int cmd);  int                     (*set_config)(struct device *dev,                                          struct ifmap *map);  void                    (*header_cache_bind)(struct hh_cache **hhp,                                          struct device *dev,                                           unsigned short htype,                                          __u32 daddr);  void                    (*header_cache_update)(struct hh_cache *hh,                                          struct device *dev,                                          unsigned char *  haddr);  int                     (*change_mtu)(struct device *dev,                                          int new_mtu);  struct iw_statistics*   (*get_wireless_stats)(struct device *dev);};

device_struct

此结构被块设备和字符设备用来向核心登记(包含设备名称以及可对此设备进行的文件操作)。chrdevs和blkdevs 中的每个有效分别表示一个字符设备和块设备。

struct device_struct {    const char * name;    struct file_operations * fops;};

file

每个打开的文件、套接口都用此结构表示。

struct file {  mode_t f_mode;  loff_t f_pos;  unsigned short f_flags;  unsigned short f_count;  unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;  struct file *f_next, *f_prev;  int f_owner;         /* pid or -pgrp where SIGIO should be sent */  struct inode * f_inode;  struct file_operations * f_op;  unsigned long f_version;  void *private_data;  /* needed for tty driver, and maybe others */};

files_struct

描叙被某进程打开的所有文件。

struct files_struct {  int count;  fd_set close_on_exec;  fd_set open_fds;  struct file * fd[NR_OPEN];};

fs_struct

struct fs_struct {  int count;  unsigned short umask;  struct inode * root, * pwd;};

gendisk

包含关于某个硬盘的信息。用于磁盘初始化与分区检查时?
收藏本页到: 365Key | del.icio.us | | 添加到雅虎收藏+
  • 网站帮助 - 广告合作 - 网站地图