当前位置:Linux教程 - Linux - Linux Data Structures(Linux数据结构)

Linux Data Structures(Linux数据结构)



        

    本附录列出了本书中描述的Linux使用的主要的数据结构。为了在页面上访得下,它们经过了少量的编辑。

     

    Block_dev_struct

     

    block_dev_struct数据结构用于登记可用的块设备,让buffer cache使用。它们放在blk_dev向量表中。

    参见include/linux/blkdev.h

     

    struct blk_dev_struct {

    void (*request_fn)(void);

    struct request * current_request;

    struct request plug;

    struct tq_struct plug_tq;

    };

     

    buffer_head

     

    buffer_head数据结构存放buffer cache中一个块缓冲区的信息。

    参见include/linux/fs.h

     

    /* 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

     

    系统中的每一个网络设备都用一个device数据结构表示

    参见include/linux/netdevice.h

     

    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; /* Mcast mac addrs */

    int mc_count; /* No installed mcasts */

    struct ip_mc_list *ip_mc_list; /* IP mcast 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

     

    device_struct数据结构用于登记字符和块设备(存放这个设备的名称和可能进行的文件操作)。Chrdevs和blkdevs向量表中的每一个有效的成员都分别代表一个字符或块设备。

    参见fs/devices.c

     

    struct device_struct {

    const char * name;

    struct file_operations * fops;

    };

     

    file

    每一个打开的文件、socket等等都用一个file数据结构代表

    参见include/linux/fs.h

     

    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 */

    };

     

    file_struct

    file_struct数据结构描述了一个进程打开的文件

    参见include/linux/sched.h

    struct files_struct {

    int count;

    fd_set close_on_exec;

    fd_set open_fds;

    struct file * fd[NR_OPEN];

    };

     

    fs_struct

    参见include/linux/sched.h

    struct fs_struct {

    int count;

    unsigned short umask;

    struct inode * root, * pwd;

    };

     

    gendisk

     

    gendisk数据结构存放硬盘的信息。用在初始化过程中找到磁盘,探测分区的时候

    参见include/linux/genhd.h

     

    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数据结构存放磁盘上的一个文件或目录的信息

    参见include/linux/fs.h

     

    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

    ipc_perm数据结构描述一个系统V IPC对象的访问权限

    参见include/linux/ipc.h

     

    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

    irqaction数据结构描述系统的中断处理程序

    参见include/linux/interrupt.h

     

    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_binfmt数据结构表示

    参见include/linux/binfmt.h

     

    struct linux_binfmt {

    struct linux_binfmt * next;

    long *use_count;

    int (*load_binary)(struct linux_binprm *, struct pt_regs * regs);

    int (*load_shlib)(int fd);

    int (*core_dump)(long signr, struct pt_regs * regs);

    };

     

    mem_map_t

    mem_map_t数据结构(也叫做page)用于存放每一个物理内存页的信息

    参见include/linux/mm.h

     

    typedef struct page {

    /* these must be first (free area handling) */

    struct page *next;

    struct page *prev;

    struct inode *inode;

    unsigned long offset;

    struct page *next_hash;

    atomic_t count;

    unsigned flags; /* atomic flags, some possibly

    updated asynchronously */

    unsigned dirty:16,

    age:8;

    struct wait_queue *wait;

    struct page *prev_hash;

    struct buffer_head *buffers;

    unsigned long swap_unlock_entry;

    unsigned long map_nr; /* page->map_nr == page - mem_map */

    } mem_map_t;

     

    mm struct

    mm_struct数据结构用于描述一个任务或进程的虚拟内存

    参见include/linux/sched.h

    struct mm_struct {

    int count;

    pgd_t * pgd;

    unsigned long context;

    unsigned long start_code, end_code, start_data, end_data;

    unsigned long start_brk, brk, start_stack, start_mmap;

    unsigned long arg_start, arg_end, env_start, env_end;

    unsigned long rss, total_vm, locked_vm;

    unsigned long def_flags;

    struct vm_area_struct * mmap;

    struct vm_area_struct * mmap_avl;

    struct semaphore mmap_sem;

    };

     

    pci_bus

    系统中的每一个PCI总线用一个pci_bus数据结构表示

    参见include/linux/pci.h

    struct pci_bus {

    struct pci_bus *parent; /* parent bus this bridge is on */

    struct pci_bus *children; /* chain of P2P bridges on this bus */

    struct pci_bus *next; /* chain of all PCI buses */

    struct pci_dev *self; /* bridge device as seen by parent */

    struct pci_dev *devices; /* devices behind this bridge */

    void *sysdata; /* hook for sys-specific extension */

    unsigned char number; /* bus number */

    unsigned char primary; /* number of primary bridge */

    unsigned char secondary; /* number of secondary bridge */

    unsigned char subordinate; /* max number of subordinate buses */

    };

     

    pci_dev

    系统中的每一个PCI设备,包括PCI-PCI和PCI-ISA桥设备都用一个pci_dev数据结构代表

    参见include/linux/pci.h

    /*

    * There is one pci_dev structure for each slot-number/function-number

    * combination:

    */

    struct pci_dev {

    struct pci_bus *bus; /* bus this device is on */

    struct pci_dev *sibling; /* next device on this bus */

    struct pci_dev *next; /* chain of all devices */

    void *sysdata; /* hook for sys-specific extension */

    unsigned int devfn; /* encoded device & function index */

    unsigned short vendor;

    unsigned short device;

    unsigned int class; /* 3 bytes: (base,sub,prog-if) */

    unsigned int master : 1; /* set if device is master capable */

    /*

    * In theory, the irq level can be read from configuration

    * space and all would be fine. However, old PCI chips don

    * support these registers and return 0 instead. For example,

    * the Vision864-P rev 0 chip can uses INTA, but returns 0 in

    * the interrupt line and pin registers. pci_init()

    * initializes this field with the value at PCI_INTERRUPT_LINE

    * and it is the job of pcibios_fixup() to change it if

    * necessary. The field must not be 0 unless the device

    * cannot generate interrupts at all.

    */

    unsigned char irq; /* irq generated by this device */

    };

     

    request

    request用于向系统中的块设备发出请求。请求都是从/向buffer cache读/写数据块

    参见include/linux/blkdev.h

     

    struct request {

    volatile int rq_status;

    #define RQ_INACTIVE (-1)

    #define RQ_ACTIVE 1

    #define RQ_SCSI_BUSY 0xffff

    #define RQ_SCSI_DONE 0xfffe

    #define RQ_SCSI_DISCONNECTING 0xffe0

    kdev_t rq_dev;

    int cmd; /* READ or WRITE */

    int errors;

    unsigned long sector;

    unsigned long nr_sectors;

    unsigned long current_nr_sectors;

    char * buffer;

    struct semaphore * sem;

    struct buffer_head * bh;

    struct buffer_head * bhtail;

    struct request * next;

    };

     

    rtable

    每一个rtable数据结构都存放向一个IP主机发送报文的路由的信息。Rtable数据结构在IP route缓存中使用。

    参见include/net/route.h

     

    struct rtable

    {

    struct rtable *rt_next;

    __u32 rt_dst;

    __u32 rt_src;

    __u32 rt_gateway;

    atomic_t rt_refcnt;

    atomic_t rt_use;

    unsigned long rt_window;

    atomic_t rt_lastuse;

    struct hh_cache *rt_hh;

    struct device *rt_dev;

    unsigned short rt_flags;

    unsigned short rt_mtu;

    unsigned short rt_irtt;

    unsigned char rt_tos;

    };

     

    semaphore

    信号灯用于保护重要数据结构和代码区域。

    参见include/asm/semaphore.h

     

    struct semaphore {

    int count;

    int waking;

    int lock ; /* to make waking testing atomic */

    struct wait_queue *wait;

    };

     

    sk_buff

    sk_buff数据结构当网络数据在协议层之间移动的过程中描述网络数据。

    参见include/linux/sk_buff.h

     

    struct sk_buff

    {

    struct sk_buff *next; /* Next buffer in list */

    struct sk_buff *prev; /* Previous buffer in list */

    struct sk_buff_head *list; /* List we are on */

    int magic_debug_cookie;

    struct sk_buff *link3; /* Link for IP protocol level buffer chains */

    struct sock *sk; /* Socket we are owned by */

    unsigned long when; /* used to compute rtts */

    struct timeval stamp; /* Time we arrived */

    struct device *dev; /* Device we arrived on/are leaving by */

    union

    {

    struct tcphdr *th;

    struct ethhdr *eth;

    struct iphdr *iph;

    struct udphdr *uh;

    unsigned char *raw;

    /* for passing file handles in a unix domain socket */

    void *filp;

    } h;

    union

    {

    /* As yet incomplete physical layer views */

    unsigned char *raw;

    struct ethhdr *ethernet;

    } mac;

    struct iphdr *ip_hdr; /* For IPPROTO_RAW */

    unsigned long len; /* Length of actual data */

    unsigned long csum; /* Checksum */

    __u32 saddr; /* IP source address */

    __u32 daddr; /* IP target address */

    __u32 raddr; /* IP next hop address */

    __u32 seq; /* TCP sequence number */

    __u32 end_seq; /* seq [+ fin] [+ syn] + datalen */

    __u32 ack_seq; /* TCP ack sequence number */

    unsigned char proto_priv[16];

    volatile char acked, /* Are we acked ? */

    used, /* Are we in use ? */

    free, /* How to free this buffer */

    arp; /* Has IP/ARP resolution finished */

    unsigned char tries, /* Times tried */

    lock, /* Are we locked ? */

    localroute, /* Local routing asserted for this frame */

    pkt_type, /* Packet class */

    pkt_bridged, /* Tracker for bridging */

    ip_summed; /* Driver fed us an IP checksum */

    #define PACKET_HOST 0 /* To us */

    #define PACKET_BROADCAST 1 /* To all */

    #define PACKET_MULTICAST 2 /* To group */

    #define PACKET_OTHERHOST 3 /* To someone else */

    unsigned short users; /* User count - see datagram.c,tcp.c */

    unsigned short protocol; /* Packet protocol from driver. */

    unsigned int truesize; /* Buffer size */

    atomic_t count; /* reference count */

    struct sk_buff *data_skb; /* Link to the actual data skb */

    unsigned char *head; /* Head of buffer */

    unsigned char *data; /* Data head pointer */

    unsigned char *tail; /* Tail pointer */

    unsigned char *end; /* End pointer */

    void (*destructor)(struct sk_buff *); /* Destruct function */

    __u16 redirport; /* Redirect port */

    };

     

    sock

    每一个sock数据结构都存放一个BSD socket中和协议相关的信息。例如,对于一个INET socket,这个数据结构会存放所有的TCP/IP和UDP/IP相关的信息

    参见include/linux/net.h

     

    struct sock

    {

    /* This must be first. */

    struct sock *sklist_next;

    struct sock *sklist_prev;

    struct options *opt;

    atomic_t wmem_alloc;

    atomic_t rmem_alloc;

    unsigned long allocation; /* Allocation mode */

    __u32 write_seq;

    __u32 sent_seq;

    __u32 acked_seq;

    __u32 copied_seq;

    __u32 rcv_ack_seq;

    unsigned short rcv_ack_cnt; /* count of same ack */

    __u32 window_seq;

    __u32 fin_seq;

    __u32 urg_seq;

    __u32 urg_data;

    __u32 syn_seq;

    int users; /* user count */

    /*

    * Not all are volatile, but some are, so we

    * might as well say they all are.

    */

    volatile char dead,

    urginline,

    intr,

    blog,

    done,

    reuse,

    keepopen,

    linger,

    delay_acks,

    destroy,

    ack_timed,

    no_check,

    zapped,

    broadcast,

    nonagle,

    bsdism;

    unsigned long lingertime;

    int proc;

    struct sock *next;

    struct sock **pprev;

    struct sock *bind_next;

    struct sock **bind_pprev;

    struct sock *pair;

    int hashent;

    struct sock *prev;

    struct sk_buff *volatile send_head;

    struct sk_buff *volatile send_next;

    struct sk_buff *volatile send_tail;

    struct sk_buff_head back_log;

    struct sk_buff *partial;

    struct timer_list partial_timer;

    long retransmits;

    struct sk_buff_head write_queue,

    receive_queue;

    struct proto *prot;

    struct wait_queue **sleep;

    __u32 daddr;

    __u32 saddr; /* Sending source */

    __u32 rcv_saddr; /* Bound address */

    unsigned short max_unacked;

    unsigned short window;

    __u32 lastwin_seq; /* sequence number when we last

    updated the window we offer */

    __u32 high_seq; /* sequence number when we did

    current fast retransmit */

    volatile unsigned long ato; /* ack timeout */

    volatile unsigned long lrcvtime; /* jiffies at last data rcv */

    volatile unsigned long idletime; /* jiffies at last rcv */

    unsigned int bytes_rcv;

    /*

    * mss is min(mtu, max_window)

    */

    unsigned short mtu; /* mss negotiated in the syns */

    volatile unsigned short mss; /* current eff. mss - can change */

    volatile unsigned short user_mss; /* mss requested by user in ioctl */

    volatile unsigned short max_window;

    unsigned long window_clamp;

    unsigned int ssthresh;

    unsigned short num;

    volatile unsigned short cong_window;

    volatile unsigned short cong_count;

    volatile unsigned short packets_out;

    volatile unsigned short shutdown;

    volatile unsigned long rtt;

    volatile unsigned long mdev;

    volatile unsigned long rto;

    volatile unsigned short backoff;

    int err, err_soft; /* Soft holds errors that don

    cause failure but are the cause

    of a persistent failure not

    just imed out */

    unsigned char protocol;

    volatile unsigned char state;

    unsigned char ack_backlog;

    unsigned char max_ack_backlog;

    unsigned char priority;

    unsigned char debug;

    int rcvbuf;

    int sndbuf;

    unsigned short type;

    unsigned char localroute; /* Route locally only */

    /*

    * This is where all the private (optional) areas that don

    * overlap will eventually live.

    */

    union

    {

    struct unix_opt af_unix;

    #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE)

    struct atalk_sock af_at;

    #endif

    #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE)

    struct ipx_opt af_ipx;

    #endif

    #ifdef CONFIG_INET

    struct inet_packet_opt af_packet;

    #ifdef CONFIG_NUTCP

    struct tcp_opt af_tcp;

    #endif

    #endif

    } protinfo;

    /*

    * IP private area

    */

    int ip_ttl; /* TTL setting */

    int ip_tos; /* TOS */

    struct tcphdr dummy_th;

    struct timer_list keepalive_timer; /* TCP keepalive hack */

    struct timer_list retransmit_timer; /* TCP retransmit timer */

    struct timer_list delack_timer; /* TCP delayed ack timer */

    int ip_xmit_timeout; /* Why the timeout is running */

    struct rtable *ip_route_cache; /* Cached output route */

    unsigned char ip_hdrincl; /* Include headers ? */

    #ifdef CONFIG_IP_MULTICAST

    int ip_mc_ttl; /* Multicasting TTL */

    int ip_mc_loop; /* Loopback */

    char ip_mc_name[MAX_ADDR_LEN]; /* Multicast device name */

    struct ip_mc_socklist *ip_mc_list; /* Group array */

    #endif

    /*

    * This part is used for the timeout functions (timer.c).

    */

    int timeout; /* What are we waiting for? */

    struct timer_list timer; /* This is the TIME_WAIT/receive

    * timer when we are doing IP

    */

    struct timeval stamp;

    /*

    * Identd

    */

    struct socket *socket;

    /*

    * Callbacks

    */

    void (*state_change)(struct sock *sk);

    void (*data_ready)(struct sock *sk,int bytes);

    void (*write_space)(struct sock *sk);

    void (*error_report)(struct sock *sk);

    };

     

    socket

     

    每一个socket数据结构都存放一个BSD socket的信息。它不会独立存在,实际上是VFS inode数据结构的一部分

    参见include/linux/net.h

     

    struct socket {

    short type; /* SOCK_STREAM, ... */

    socket_state state;

    long flags;

    struct proto_ops *ops; /* protocols do most everything */

    void *data; /* protocol data */

    struct socket *conn; /* server socket connected to */

    struct socket *iconn; /* incomplete client conn.s */

    struct socket *next;

    struct wait_queue **wait; /* ptr to place to wait on */

    struct inode *inode;

    struct fasync_struct *fasync_list; /* Asynchronous wake up list */

    struct file *file; /* File back pointer for gc */

    };

     

    task_struct

    每一个task_struct描述系统中的一个任务或进程

    参见include/linux/sched.h

    struct task_struct {

    /* these are hardcoded - don touch */

    volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */

    long counter;

    long priority;

    unsigned long signal;

    unsigned long blocked; /* bitmap of masked signals */

    unsigned long flags; /* per process flags, defined below */

    int errno;

    long debugreg[8]; /* Hardware debugging registers */

    struct exec_domain *exec_domain;

    /* various fields */

    struct linux_binfmt *binfmt;

    struct task_struct *next_task, *prev_task;

    struct task_struct *next_run, *prev_run;

    unsigned long saved_kernel_stack;

    unsigned long kernel_stack_page;

    int exit_code, exit_signal;

    /* ??? */

    unsigned long personality;

    int dumpable:1;

    int did_exec:1;

    int pid;

    int pgrp;

    int tty_old_pgrp;

    int session;

    /* boolean value for session group leader */

    int leader;

    int groups[NGROUPS];

    /*

    * pointers to (original) parent process, youngest child, younger sibling,

    * older sibling, respectively. (p->father can be replaced with

    * p->p_pptr->pid)

    */

    struct task_struct *p_opptr, *p_pptr, *p_cptr,

    *p_ysptr, *p_osptr;

    struct wait_queue *wait_chldexit;

    unsigned short uid,euid,suid,fsuid;

    unsigned short gid,egid,sgid,fsgid;

    unsigned long timeout, policy, rt_priority;

    unsigned long it_real_value, it_prof_value, it_virt_value;

    unsigned long it_real_incr, it_prof_incr, it_virt_incr;

    struct timer_list real_timer;

    long utime, stime, cutime, cstime, start_time;

    /* mm fault and swap info: this can arguably be seen as either

    mm-specific or thread-specific */

    unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;

    int swappable:1;

    unsigned long swap_address;

    unsigned long old_maj_flt; /* old value of maj_flt */

    unsigned long dec_flt; /* page fault count of the last time */

    unsigned long swap_cnt; /* number of pages to swap on next pass */

    /* limits */

    struct rlimit rlim[RLIM_NLIMITS];

    unsigned short used_math;

    char comm[16];

    /* file system info */

    int link_count;

    struct tty_struct *tty; /* NULL if no tty */

    /* ipc stuff */

    struct sem_undo *semundo;

    struct sem_queue *semsleeping;

    /* ldt for this task - used by Wine. If NULL, default_ldt is used */

    struct desc_struct *ldt;

    /* tss for this task */

    struct thread_struct tss;

    /* filesystem information */

    struct fs_struct *fs;

    /* open file information */

    struct files_struct *files;

    /* memory management info */

    struct mm_struct *mm;

    /* signal handlers */

    struct signal_struct *sig;

    #ifdef __SMP__

    int processor;

    int last_processor;

    int lock_depth; /* Lock depth.

    We can context switch in and out

    of holding a syscall kernel lock... */

    #endif

    };

     

    timer_list

    timer_list数据结构用于实现进程的实时计时器。

    参见include/linux/timer.h

     

    struct timer_list {

    struct timer_list *next;

    struct timer_list *prev;

    unsigned long expires;

    unsigned long data;

    void (*function)(unsigned long);

    };

     

    tq_struct

    每一个任务队列(tq_struct)数据结构都存放正在排队的工作的信息。通常是一个设备驱动程序需要的任务,但是不需要立即完成。

    参见include/linux/tqueue.h

     

    struct tq_struct {

    struct tq_struct *next; /* linked list of active bhs */

    int sync; /* must be initialized to zero */

    void (*routine)(void *); /* function to call */

    void *data; /* argument to function */

    };

     

    vm_area_struct

     

    每一个vm_area_struct数据结构描述一个进程的一个虚拟内存区

    参见include/linux/mm.h

     

    struct vm_area_struct {

    struct mm_struct * vm_mm; /* VM area parameters */

    unsigned long vm_start;

    unsigned long vm_end;

    pgprot_t vm_page_prot;

    unsigned short vm_flags;

    /* AVL tree of VM areas per task, sorted by address */

    short vm_avl_height;

    struct vm_area_struct * vm_avl_left;

    struct vm_area_struct * vm_avl_right;

    /* linked list of VM areas per task, sorted by address */

    struct vm_area_struct * vm_next;

    /* for areas with inode, the circular list inode->i_mmap */

    /* for shm areas, the circular list of attaches */

    /* otherwise unused */

    struct vm_area_struct * vm_next_share;

    struct vm_area_struct * vm_prev_share;

    /* more */

    struct vm_operations_struct * vm_ops;

    unsigned long vm_offset;

    struct inode * vm_inode;

    unsigned long vm_pte; /* shared mem */

    };


    发布人:netbull 来自:非常Linux