临江网

 找回密码
 点这里注册

QQ登录

只需一步,快速开始

搜索
热搜: 临江老照片

编辑推荐

查看: 2380|回复: 0
打印 上一主题 下一主题

Linux Kernel核心中文手册 14

[复制链接]

1万

主题

8

好友

5万

积分

版主

Rank: 7Rank: 7Rank: 7

帖子
19877
积分
53531
注册时间
2007-3-25
跳转到指定楼层
楼主
发表于 2007-7-18 22:59:01 |只看该作者 |倒序浏览
Linux Kernel核心中文手册
来自:蓝森林自由软件


Appendix A (附录 A )

inux 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; /* 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 和 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'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 */

} ;

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



代码接下一页(14-1)
 
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 顶0 踩0

发表回复

高级模式
B Color Image Link Quote Code Smilies
验证码 换一个

回顶部