首 页文章中心

Linux学习网

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

推荐:Linux操作系统的核心数据结构

作者:佚名  来源:不详  发布时间:2007-12-21 16:42: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
  

包含关于某个硬盘的信息。用于磁盘初始化与分区检查时。

 

   struct hd_struct {  long start_sect;  long nr_sects;  };  struct gendisk {  int major; /* major number of driver */  const char *major_name; /* name of major driver */  int minor_shift; /* number of times minor is shifted to get real minor */  int max_p; /* maximum partitions per device */  int max_nr; /* maximum number of real devices */  void (*init)(struct gendisk *);  /* Initialization called before we do our thing */  struct hd_struct *part; /* partition table */  int *sizes; /* device size in blocks, copied to blk_size[] */  int nr_real; /* number of real devices */  void *real_devices; /* internal use */  struct gendisk *next;  };  inode
  

此VFS inode结构描叙磁盘上一个文件或目录的信息。

    struct inode {  kdev_t i_dev;  unsigned long i_ino;  umode_t i_mode;  nlink_t i_nlink;  uid_t i_uid;  gid_t i_gid;  kdev_t i_rdev;  off_t i_size;  time_t i_atime;  time_t i_mtime;  time_t i_ctime;  unsigned long i_blksize;  unsigned long i_blocks;  unsigned long i_version;  unsigned long i_nrpages;  struct semaphore i_sem;  struct inode_operations *i_op;  struct super_block *i_sb;  struct wait_queue *i_wait;  struct file_lock *i_flock;  struct vm_area_struct *i_mmap;  struct page *i_pages;  struct dquot *i_dquot[MAXQUOTAS];  struct inode *i_next, *i_prev;  struct inode *i_hash_next, *i_hash_prev;  struct inode *i_bound_to, *i_bound_by;  struct inode *i_mount;  unsigned short i_count;  unsigned short i_flags;  unsigned char i_lock;  unsigned char i_dirt;  unsigned char i_pipe;  unsigned char i_sock;  unsigned char i_seek;  unsigned char i_update;  unsigned short i_writecount;  union {  struct pipe_inode_info pipe_i;  struct minix_inode_info minix_i;  struct ext_inode_info ext_i;  struct ext2_inode_info ext2_i;  struct hpfs_inode_info hpfs_i;  struct msdos_inode_info msdos_i;  struct umsdos_inode_info umsdos_i;  struct iso_inode_info isofs_i;  struct nfs_inode_info nfs_i;  struct xiafs_inode_info xiafs_i;  struct sysv_inode_info sysv_i;  struct affs_inode_info affs_i;  struct ufs_inode_info ufs_i;  struct socket socket_i;  void *generic_ip;  } u;  };  ipc_perm
  

此结构描叙对一个系统V IPC对象的存取权限。

    struct ipc_perm  {  key_t key;  ushort uid; /* owner euid and egid */  ushort gid;  ushort cuid; /* creator euid and egid */  ushort cgid;  ushort mode; /* access modes see mode flags below */  ushort seq; /* sequence number */  };  irqaction
  

用来描叙系统的中断处理过程。

    struct irqaction {  void (*handler)(int, void *, struct pt_regs *);  unsigned long flags;  unsigned long mask;  const char *name;  void *dev_id;  struct irqaction *next;  };  linux_binfmt
  

用来表示可被Linux理解的二进制。

收藏本页到: 365Key | del.icio.us | | 添加到雅虎收藏+
  • 网站帮助 - 广告合作 - 网站地图