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中一块缓存的信息

#define BH_Uptodate  0  

#define BH_Dirty     1  

#define BH_Lock      2  

#define BH_Req       3  

#define BH_Touched   4  

#define BH_Has_aged  5  

#define BH_Protected 6  

#define BH_FreeOnIO  7  

struct buffer_head {

unsigned long      b_blocknr;    

kdev_t      b_dev;

kdev_t      b_rdev;      

unsigned long      b_rsector;    

struct buffer_head *b_next;      

struct buffer_head *b_this_page;

unsigned long      b_state;      

struct buffer_head *b_next_free;

unsigned int       b_count;      

unsigned long      b_size;      

char        *b_data;      

unsigned int       b_list;      

unsigned long      b_flushtime;  

unsigned long      b_lru_time;  

struct wait_queue  *b_wait;

struct buffer_head *b_prev;      

struct buffer_head *b_prev_free;

struct buffer_head *b_reqnext;  

};

device

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

struct device{

char      *name;

unsigned long    rmem_end;

unsigned long    rmem_start;      

unsigned long    mem_end;  

unsigned long    mem_start;      

unsigned long    base_addr;      

unsigned char    irq;      

volatile unsigned char  start,    

interrupt;      

unsigned long    tbusy;    

struct device    *next;

int       (*init)(struct device *dev);

unsigned char    if_port;  

unsigned char    dma;      

struct enet_statistics* (*get_stats)(struct device *dev);

unsigned long    trans_start;    

unsigned long    last_rx;  

unsigned short   flags;    

unsigned short   family;  

unsigned short   metric;  

unsigned short   mtu;      

unsigned short   type;    

unsigned short   hard_header_len;

void      *priv;    

unsigned char    broadcast[MAX_ADDR_LEN];

unsigned char    pad;

unsigned char    dev_addr[MAX_ADDR_LEN];

unsigned char    addr_len;

unsigned long    pa_addr;  

unsigned long    pa_brdaddr;      

unsigned long    pa_dstaddr;      

unsigned long    pa_mask;  

unsigned short   pa_alen;  

struct dev_mc_list      *mc_list;

int       mc_count;

struct ip_mc_list       *ip_mc_list;    

__u32     tx_queue_len;    

unsigned long    pkt_queue;      

struct device    *slave;  

struct net_alias_info   *alias_info;    

struct net_alias *my_alias;      

struct sk_buff_head     buffs[DEV_NUMBUFFS];

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;  

struct inode * f_inode;

struct file_operations * f_op;

unsigned long f_version;

void *private_data;  

};

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;        

const char *major_name;  

int minor_shift;  

int max_p;        

int max_nr;      

void (*init)(struct gendisk *);

struct hd_struct *part;  

int *sizes;      

int nr_real;      

void *real_devices;      

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;  

ushort gid;

ushort cuid;  

ushort cgid;

ushort mode;  

ushort seq;  

};


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理解的二进制文件格式

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


用来保存每个物理页面的信息

typedef struct page {

struct page *next;

struct page *prev;

struct inode       *inode;

unsigned long      offset;

struct page *next_hash;

atomic_t    count;

unsigned    flags;    

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;    

} mem_map_t;


mm_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总线

struct pci_bus {

struct pci_bus  *parent;    

struct pci_bus  *children;  

struct pci_bus  *next;      

struct pci_dev  *self;      

struct pci_dev  *devices;    

void    *sysdata;    

unsigned char  number;      

unsigned char  primary;      

unsigned char  secondary;    

unsigned char  subordinate;  

};


pci_dev


表示系统中的每个PCI设备,包括PCI-PCI和PCI-PCI桥接器

struct pci_dev {

struct pci_bus  *bus;      

struct pci_dev  *sibling;  

struct pci_dev  *next;    

void    *sysdata;  

unsigned int  devfn;      

unsigned short  vendor;

unsigned short  device;

unsigned int  class;      

unsigned int  master : 1;  

unsigned char  irq;

};


request


被用来向系统的块设备发送请求 它总是向buffer cache读出或写入数据块

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;

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


用来描叙向某个IP主机发送包的路由信息 此结构在IP路由cache内部实用

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


保护临界区数据结构和代码信号灯

struct semaphore {

int count;

int waking;

int lock ;  

struct wait_queue *wait;

};


sk_buff


用来描叙在协议层之间交换的网络数据

struct sk_buff

{

struct sk_buff      *next;      

struct sk_buff      *prev;      

struct sk_buff_head *list;      

int   magic_debug_cookie;

struct sk_buff      *link3;      

struct sock  *sk;  

unsigned long       when;

struct timeval      stamp;      

struct device       *dev;

union

{

struct tcphdr   *th;

struct ethhdr   *eth;

struct iphdr    *iph;

struct udphdr   *uh;

unsigned char   *raw;

void     *filp;

} h;

union

{

unsigned char   *raw;

struct ethhdr   *ethernet;

} mac;

struct iphdr *ip_hdr;    

unsigned long       len;  

unsigned long       csum;

__u32        saddr;      

__u32        daddr;      

__u32        raddr;      

__u32        seq;  

__u32        end_seq;    

__u32        ack_seq;    

unsigned char       proto_priv[16];

volatile char       acked,      

used,

free,

arp;  

unsigned char       tries,      

lock,

localroute,  

pkt_type,    

pkt_bridged,

ip_summed;  

#define PACKET_HOST  0

#define PACKET_BROADCAST    1

#define PACKET_MULTICAST    2

#define PACKET_OTHERHOST    3

unsigned short      users;      

unsigned short      protocol;    

unsigned int truesize;    

atomic_t     count;      

struct sk_buff      *data_skb;  

unsigned char       *head;      

unsigned char       *data;      

unsigned char       *tail;      

unsigned char       *end;

void  (*destructor)(struct sk_buff *);

__u16        redirport;  

};


sock


包含BSD套接口的协议相关信息 例如对于一个INET(Internet Address Domain)套接口此数据结构 包含TCP/IP和UDP/IP信息

struct sock

{

struct sock      *sklist_next;

struct sock      *sklist_prev;

struct options   *opt;

atomic_t  wmem_alloc;

atomic_t  rmem_alloc;

unsigned long    allocation;      

__u32     write_seq;

__u32     sent_seq;

__u32     acked_seq;

__u32     copied_seq;

__u32     rcv_ack_seq;

unsigned short   rcv_ack_cnt;      

__u32     window_seq;

__u32     fin_seq;

__u32     urg_seq;

__u32     urg_data;

__u32     syn_seq;

int       users;    

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;    

__u32     rcv_saddr;

unsigned short   max_unacked;

unsigned short   window;

__u32     lastwin_seq;      

__u32     high_seq;  

volatile unsigned long  ato;      

volatile unsigned long  lrcvtime;  

volatile unsigned long  idletime;  

unsigned int     bytes_rcv;

unsigned short   mtu;      

volatile unsigned short mss;      

volatile unsigned short user_mss;  

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;    

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;      

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;

int       ip_ttl;    

int       ip_tos;    

struct tcphdr    dummy_th;

struct timer_list       keepalive_timer;  

struct timer_list       retransmit_timer;

struct timer_list       delack_timer;    

int       ip_xmit_timeout;  

struct rtable    *ip_route_cache;  

unsigned char    ip_hdrincl;      

#ifdef CONFIG_IP_MULTICAST

int       ip_mc_ttl;

int       ip_mc_loop;      

char      ip_mc_name[MAX_ADDR_LEN];

struct ip_mc_socklist   *ip_mc_list;      

#endif

int        timeout;  

struct timer_list timer;    

struct timeval    stamp;

struct socket     *socket;

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


包含BSD套接口的信息 它不独立存在,一般位于一个VFS inode结构中

struct socket {

short  type;  

socket_state  state;

long   flags;

struct proto_ops     *ops;  

void   *data;

struct socket *conn;

struct socket *iconn;      

struct socket *next;

struct wait_queue    **wait;      

struct inode  *inode;

struct fasync_struct *fasync_list;

struct file   *file;

};


task_struct


用来描叙系统中的进程或任务

struct task_struct {

volatile long state;  

long   counter;

long   priority;

unsigned      long signal;

unsigned      long blocked;  

unsigned      long flags;    

int errno;

long   debugreg[8];    

struct exec_domain   *exec_domain;

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;

int    leader;

int    groups[NGROUPS];

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;

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

int swappable:1;

unsigned long swap_address;

unsigned long old_maj_flt;    

unsigned long dec_flt;

unsigned long swap_cnt;      

struct rlimit rlim[RLIM_NLIMITS];

unsigned short       used_math;

char   comm[16];

int    link_count;

struct tty_struct    *tty;    

struct sem_undo      *semundo;

struct sem_queue     *semsleeping;

struct desc_struct *ldt;

struct thread_struct tss;

struct fs_struct     *fs;

struct files_struct  *files;

struct mm_struct     *mm;

struct signal_struct *sig;

#ifdef __SMP__

int    processor;

int    last_processor;

int    lock_depth;    

#endif

};


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


每个任务队列结构(tq_struct)包含着已经排队的任务信息 它被设备驱动用来描叙那些无需立刻 执行的任务

struct tq_struct {

struct tq_struct *next;  

int sync;  

void (*routine)(void *);  

void *data;        

};


vm_area_struct


表示某进程的一个虚拟内存区域

struct vm_area_struct {

struct mm_struct * vm_mm;  

unsigned long vm_start;

unsigned long vm_end;

pgprot_t vm_page_prot;

unsigned short vm_flags;

short vm_avl_height;

struct vm_area_struct * vm_avl_left;

struct vm_area_struct * vm_avl_right;

struct vm_area_struct * vm_next;

struct vm_area_struct * vm_next_share;

struct vm_area_struct * vm_prev_share;

struct vm_operations_struct * vm_ops;

unsigned long vm_offset;

struct inode * vm_inode;

unsigned long vm_pte;      

};