Linux数据结构

来源:互联网 发布:2333什么意思网络用语 编辑:程序博客网 时间:2024/05/17 02:09
/* Linux数据结构-------------------------------------------------------------------------------- Linux使用的主要数据结构。*/ /*block_dev_struct block_dev_struct 数据结构用来登记块设备以被缓冲区使用。这些结构被存放在blk_dev vector中。 */struct blk_dev_struct { void (*request_fn)(void); struct request * current_request; struct request plug; struct tq_struct plug_tq;};/*buffer_head The buffer_head 数据结构用来存放缓冲区中的一个数据块的信息。 bh state bits */#define BH_Uptodate 0 /* 1 if the buffer contains valide 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 bu
/*  Linux数据结构--------------------------------------------------------------------------------  Linux使用的主要数据结构。*/ /*block_dev_struct  block_dev_struct 数据结构用来登记块设备以被缓冲区使用。这些结构被存放在blk_dev   vector中。 */struct blk_dev_struct {    void (*request_fn)(void);    struct request * current_request;    struct request   plug;    struct tq_struct plug_tq;};/*buffer_head  The buffer_head 数据结构用来存放缓冲区中的一个数据块的信息。   bh state bits  */#define BH_Uptodate  0   /* 1 if the buffer contains valide 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 device_struct 数据结构用来登记字符和块设备(含有相应的名字和对此设备的文件 操作集)。每一个chrdevs and blkdevs向量的入口对应一个字符或块设备。*/struct device_struct {    const char * name;    struct file_operations * fops;};/*file每个打开的文件, socket 接口都对应一个文件数据结构。 */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_structfiles_struct 数据结构描述一个正被打开的文件。 struct files_struct {  int count;  fd_set close_on_exec;  fd_set open_fds;  struct file * fd[NR_OPEN];};fs_structstruct fs_struct {  int count;  unsigned short umask;  struct inode * root, * pwd;};/*gendiskgendisk 数据结构含有一个硬盘的信息。当系统初始化,发现硬盘和检测分区参数时,此结构被填充。 */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_permipc_perm 结构描述了一个 System 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 */};irqactionirqaction 结构用来描述系统的中断句柄。 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 数据结构。 */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_tmem_map_t 数据结构(或叫做页面) 用来存放每个物理内存页面的信息。*/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_structmm_struct 用来描述一个任务活一个进程的虚拟内存空间。 */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 结构。*/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 结构。*//* * 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't   * 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 */};/*requestrequest 结构用来向系统中的块设备发出请求。 这些请求是关于读或写缓冲区中的数据块。 */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路由缓冲中被使用。 */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;};/*semaphoreSemaphores 被用来保护临界数据和临界区代码。 */struct semaphore {    int count;    int waking;    int lock ;                /* to make waking testing atomic */    struct wait_queue *wait;};/*sk_buffsk_buff 结构被用来当数据在网络协议之间移动时描述网络数据。 */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 rtt's          */  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的相关信息。 */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 syn's */    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't                                                 cause failure but are the cause                                                 of a persistent failure not                                                 just 'timed 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't *    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数据结构的一个部份。 */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 数据结构描述系统中的进程或任务。 (译者注:请注意结构中已考虑SMP的结构)*/struct task_struct {/* these are hardcoded - don't 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 结构用来实现对进程的定时器的操作。 struct timer_list {  struct timer_list *next;  struct timer_list *prev;  unsigned long expires;  unsigned long data;  void (*function)(unsigned long);};/*tq_struct每个任务队列 task queue (tq_struct)  含有已在排队的任务信息。一般来说,这些任务是设备驱动程序所需的,但不是必须“立刻”被完成。(译者注:千万注意,这个队列不是进程调度队列,而是一个函数(如设备驱动程序调用的一些核心函数)队列。结构中含有函数指针和被传递的参数。请回忆递归时栈结构中的内容。不同的是队列是FIFO,而栈是LIFO) */struct tq_struct {    struct tq_struct *next;   /* linked list of active bh's */    int sync;                 /* must be initialized to zero */    void (*routine)(void *);  /* function to call */    void *data;               /* argument to function */};/*vm_area_struct每个 vm_area_struct 结构含有一个进程虚拟内存的每个部份的描述。*/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 */};  /*摘自http://www.huihoo.org/linux/kernel/*/

原创粉丝点击