Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103594178
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-02 16:07:06

文章分类:

本文列出了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中主要的数据结构及其功能,要想把Linux学好必须掌握这些数据结构。
阅读(483) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~