原著: David A Rusling
翻译: Banyan & fifa
第十五章
Linux核心数据结构
本章列出了Linux实用的主要数据结构。
block_dev_struct
此结构用于向核心登记块设备,它还被buffer
cache实用。所有此类结构都位于blk_dev数组中。
struct
blk_dev_struct
{
void
(*request_fn)(void);
struct
request
*
current_request;
struct
request
plug;
struct
tq_struct
plug_tq;
};
buffer_head
此结构包含关于buffer
cache中一块缓存的信息。
/*
bh
state
bits
*/
#define
BH_Uptodate
0
/*
1
if
the
buffer
contains
valid
data
*/
#define
BH_Dirty
1
/*
1
if
the
buffer
is
dirty
*/
#define
BH_Lock
2
/*
1
if
the
buffer
is
locked
*/
#define
BH_Req
3
/*
0
if
the
buffer
has
been
invalidated
*/
#define
BH_Touched
4
/*
1
if
the
buffer
has
been
touched
(aging)
*/
#define
BH_Has_aged
5
/*
1
if
the
buffer
has
been
aged
(aging)
*/
#define
BH_Protected
6
/*
1
if
the
buffer
is
protected
*/
#define
BH_FreeOnIO
7
/*
1
to
discard
the
buffer_head
after
IO
*/
struct
buffer_head
{
/*
First
cache
line:
*/
unsigned
long
b_blocknr;
/*
block
number
*/
kdev_t
b_dev;
/*
device
(B_FREE
=
free)
*/
kdev_t
b_rdev;
/*
Real
device
*/
unsigned
long
b_rsector;
/*
Real
buffer
location
on
disk
*/
struct
buffer_head
*b_next;
/*
Hash
queue
list
*/
struct
buffer_head
*b_this_page;
/*
circular
list
of
buffers
in
one
page
*/
/*
Second
cache
line:
*/
unsigned
long
b_state;
/*
buffer
state
bitmap
(above)
*/
struct
buffer_head
*b_next_free;
unsigned
int
b_count;
/*
users
using
this
block
*/
unsigned
long
b_size;
/*
block
size
*/
/*
Non-performance-critical
data
follows.
*/
char
*b_data;
/*
pointer
to
data
block
*/
unsigned
int
b_list;
/*
List
that
this
buffer
appears
*/
unsigned
long
b_flushtime;
/*
Time
when
this
(dirty)
buffer
*
should
be
written
*/
unsigned
long
b_lru_time;
/*
Time
when
this
buffer
was
*
last
used.
*/
struct
wait_queue
*b_wait;
struct
buffer_head
*b_prev;
/*
doubly
linked
hash
list
*/
struct
buffer_head
*b_prev_free;
/*
doubly
linked
list
of
buffers
*/
struct
buffer_head
*b_reqnext;
/*
request
queue
*/
};
device
系统中每个网络设备都用一个设备数据结构来表示。
struct
device
{
/*
*
This
is
the
first
field
of
the
"visible"
part
of
this
structure
*
(i.e.
as
seen
by
users
in
the
"Space.c"
file).
It
is
the
name
*
the
interface.
*/
char
*name;
/*
I/O
specific
fields
*/
unsigned
long
rmem_end;
/*
shmem
"recv"
end
*/
unsigned
long
rmem_start;
/*
shmem
"recv"
start
*/
unsigned
long
mem_end;
/*
shared
mem
end
*/
unsigned
long
mem_start;
/*
shared
mem
start
*/
unsigned
long
base_addr;
/*
device
I/O
address
*/
unsigned
char
irq;
/*
device
IRQ
number
*/
/*
Low-level
status
flags.
*/
volatile
unsigned
char
start,
/*
start
an
operation
*/
interrupt;
/*
interrupt
arrived
*/
unsigned
long
tbusy;
/*
transmitter
busy
*/
struct
device
*next;
/*
The
device
initialization
function.
Called
only
once.
*/
int
(*init)(struct
device
*dev);
/*
Some
hardware
also
needs
these
fields,
but
they
are
not
part
of
the
usual
set
specified
in
Space.c.
*/
unsigned
char
if_port;
/*
Selectable
AUI,TP,
*/
unsigned
char
dma;
/*
DMA
channel
*/
struct
enet_statistics*
(*get_stats)(struct
device
*dev);
/*
*
This
marks
the
end
of
the
"visible"
part
of
the
structure.
All
*
fields
hereafter
are
internal
to
the
system,
and
may
change
at
*
will
(read:
may
be
cleaned
up
at
will).
*/
/*
These
may
be
needed
for
future
network-power-down
code.
*/
unsigned
long
trans_start;
/*
Time
(jiffies)
of
last
transmit
*/
unsigned
long
last_rx;
/*
Time
of
last
Rx
*/
unsigned
short
flags;
/*
interface
flags
(BSD)*/
unsigned
short
family;
/*
address
family
ID
*/
unsigned
short
metric;
/*
routing
metric
*/
unsigned
short
mtu;
/*
MTU
value
*/
unsigned
short
type;
/*
hardware
type
*/
unsigned
short
hard_header_len;
/*
hardware
hdr
len
*/
void
*priv;
/*
private
data
*/
/*
Interface
address
info.
*/
unsigned
char
broadcast[MAX_ADDR_LEN];
unsigned
char
pad;
unsigned
char
dev_addr[MAX_ADDR_LEN];
unsigned