?? 文件和設備編程.htm
字號:
<P> /* These may be needed for future network-power-down code.
*/<BR> /* trans_start記錄最后一次成功發送的時間。可以用來確定硬件是否工作正常。*/<BR> unsigned
long
trans_start; /* Time (in jiffies) of last Tx */<BR> unsigned
long
last_rx; /* Time of last
Rx
*/
<P> /* flags里面有很多內容,定義在include/linux/if.h里。*/<BR> unsigned
short
flags; /* interface flags (a la
BSD) */<BR> unsigned
short
family; /* address family ID (AF_INET)
*/<BR> unsigned
short
metric; /* routing metric (not
used) */<BR> unsigned
short
mtu; /* interface MTU
value */
<P> /* type標明物理硬件的類型。主要說明硬件是否需要arp。定義在<BR>
include/linux/if_arp.h里。 */<BR> unsigned
short
type; /* interface hardware
type */
<P> /* 上層協議層根據hard_header_len在發送數據緩沖區前面預留硬件幀頭空間。*/<BR> unsigned
short
hard_header_len; /* hardware hdr length */
<P> /* priv指向驅動程序自己定義的一些參數。*/<BR>
void
*priv; /* pointer to private
data */
<P> /* Interface address info. */<BR> unsigned
char
broadcast[MAX_ADDR_LEN]; /* hw bcast add
*/<BR> unsigned
char
pad;
/* make dev_addr alignedd to 8<BR>bytes */<BR> unsigned
char
dev_addr[MAX_ADDR_LEN]; /* hw
address */<BR> unsigned
char
addr_len; /* hardware address
length */<BR> unsigned
long
pa_addr; /* protocol
address
*/<BR> unsigned
long
pa_brdaddr; /* protocol broadcast addr
*/<BR> unsigned
long
pa_dstaddr; /* protocol P-P other side addr */<BR> unsigned
long
pa_mask; /* protocol
netmask
*/<BR> unsigned
short
pa_alen; /* protocol address
length */
<P> struct dev_mc_list
*mc_list; /* Multicast mac
addresses */<BR>
int
mc_count; /* Number of installed
mcasts */
<P> struct ip_mc_list
*ip_mc_list; /* IP multicast filter chain
*/<BR>
__u32
tx_queue_len; /* Max frames per queue allowed */
<P> /* For load balancing driver pair support */
<P> unsigned
long
pkt_queue; /* Packets queued */<BR> struct
device
*slave; /* Slave device */<BR> struct
net_alias_info
*alias_info; /* main dev alias info */<BR> struct
net_alias
*my_alias; /* alias devs */
<P> /* Pointer to the interface buffers. */<BR> struct
sk_buff_head buffs[DEV_NUMBUFFS];
<P> /* Pointers to interface service routines. */<BR>
int
(*open)(struct device *dev);<BR>
int
(*stop)(struct device *dev);<BR>
int
(*hard_start_xmit) (struct sk_buff
*skb,<BR>
struct device *dev);<BR>
int
(*hard_header) (struct sk_buff
*skb,<BR>
struct device
*dev,<BR>
unsigned short
type,<BR>
void
*daddr,<BR>
void
*saddr,<BR>
unsigned len);<BR>
int
(*rebuild_header)(void *eth, struct device
*dev,<BR>
unsigned long raddr, struct sk_buff *skb);<BR>#define HAVE_MULTICAST<BR>
void
(*set_multicast_list)(struct device *dev);<BR>#define
HAVE_SET_MAC_ADDR<BR>
int
(*set_mac_address)(struct device *dev, void *addr);<BR>#define
HAVE_PRIVATE_IOCTL<BR>
int
(*do_ioctl)(struct device *dev, struct ifreq *ifr, intt cmd);<BR>#define
HAVE_SET_CONFIG<BR>
int
(*set_config)(struct device *dev, struct ifmap *map);<BR>#define
HAVE_HEADER_CACHE<BR>
void
(*header_cache_bind)(struct hh_cache **hhp, struct devvice<BR>*dev, unsigned
short htype, __u32 daddr);<BR>
void
(*header_cache_update)(struct hh_cache *hh, struct devvice<BR>*dev, unsigned
char * haddr);<BR>#define HAVE_CHANGE_MTU<BR>
int
(*change_mtu)(struct device *dev, int new_mtu);
<P> struct iw_statistics* (*get_wireless_stats)(struct device
*dev);<BR>};
<P><BR>2.4 常用的系統支持
<P>2.4.1 內存申請和釋放<BR>
include/linux/kernel.h里聲明了kmalloc()和kfree()。用于在內核模式下申請和釋放內存。<BR>
void *kmalloc(unsigned int len,int priority);<BR> void
kfree(void *__ptr);<BR>
與用戶模式下的malloc()不同,kmalloc()申請空間有大小限制。長度是2的整次方。可以申請的最大長度也有限制。另外kmalloc()有priority參數,通常使用時可以為GFP_KERNEL,如果在中斷里調用用GFP_ATOMIC參數,因為使用GFP_KERNEL則調用者可能進入sleep狀態,在處理中斷時是不允許的。<BR>
kfree()釋放的內存必須是kmalloc()申請的。如果知道內存的大小,也可以用kfree_s()釋放。
<P>2.4.2 request_irq()、free_irq()<BR>
這是驅動程序申請中斷和釋放中斷的調用。在include/linux/sched.h里聲明。
<P>request_irq()調用的定義:<BR> int request_irq(unsigned int
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -