📄 文件和设备编程.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 + -