⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;device&nbsp;I/O&nbsp;address&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;irq;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;device&nbsp;IRQ&nbsp;number&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Low-level&nbsp;status&nbsp;flags.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;char&nbsp;&nbsp;start,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;start&nbsp;an&nbsp;operation&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interrupt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;interrupt&nbsp;arrived&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;在处理中断时interrupt设为1,处理完清0。&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbusy;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;transmitter&nbsp;busy&nbsp;must&nbsp;be&nbsp;long&nbsp;for&nbsp;<BR>bitops&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*next;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;The&nbsp;device&nbsp;initialization&nbsp;function.&nbsp;Called&nbsp;only&nbsp;once.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;指向驱动程序的初始化方法。&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*init)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Some&nbsp;hardware&nbsp;also&nbsp;needs&nbsp;these&nbsp;fields,&nbsp;but&nbsp;they&nbsp;are&nbsp;not&nbsp;part&nbsp;of&nbsp;the&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usual&nbsp;set&nbsp;specified&nbsp;in&nbsp;Space.c.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;一些硬件可以在一块板上支持多个接口,可能用到if_port。&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if_port;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Selectable&nbsp;AUI,&nbsp;TP,..*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dma;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;DMA&nbsp;channel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;enet_statistics*&nbsp;(*get_stats)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;marks&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;&quot;visible&quot;&nbsp;part&nbsp;of&nbsp;the&nbsp;structure.&nbsp;All&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;fields&nbsp;hereafter&nbsp;are&nbsp;internal&nbsp;to&nbsp;the&nbsp;system,&nbsp;and&nbsp;may&nbsp;change&nbsp;at&nbsp;<BR>&nbsp;&nbsp;&nbsp;*&nbsp;will&nbsp;(read:&nbsp;may&nbsp;be&nbsp;cleaned&nbsp;up&nbsp;at&nbsp;will).&nbsp;<BR>&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;These&nbsp;may&nbsp;be&nbsp;needed&nbsp;for&nbsp;future&nbsp;network-power-down&nbsp;code.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;trans_start记录最后一次成功发送的时间。可以用来确定硬件是否工作正常。*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_start;&nbsp;&nbsp;/*&nbsp;Time&nbsp;(in&nbsp;jiffies)&nbsp;of&nbsp;last&nbsp;Tx&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_rx;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Time&nbsp;of&nbsp;last&nbsp;Rx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;flags里面有很多内容,定义在include/linux/if.h里。*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flags;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;interface&nbsp;flags&nbsp;(a&nbsp;la&nbsp;BSD)&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;family;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;address&nbsp;family&nbsp;ID&nbsp;(AF_INET)&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;metric;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;routing&nbsp;metric&nbsp;(not&nbsp;used)&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mtu;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;interface&nbsp;MTU&nbsp;value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;type标明物理硬件的类型。主要说明硬件是否需要arp。定义在&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include/linux/if_arp.h里。&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;interface&nbsp;hardware&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;上层协议层根据hard_header_len在发送数据缓冲区前面预留硬件帧头空间。*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hard_header_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;hardware&nbsp;hdr&nbsp;length&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;priv指向驱动程序自己定义的一些参数。*/&nbsp;<BR>&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*priv;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;pointer&nbsp;to&nbsp;private&nbsp;data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Interface&nbsp;address&nbsp;info.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broadcast[MAX_ADDR_LEN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;hw&nbsp;bcast&nbsp;add&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pad;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;make&nbsp;dev_addr&nbsp;aligned&nbsp;to&nbsp;8&nbsp;<BR>bytes&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[MAX_ADDR_LEN];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;hw&nbsp;address&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;hardware&nbsp;address&nbsp;length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_brdaddr;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;broadcast&nbsp;addr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_dstaddr;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;P-P&nbsp;other&nbsp;side&nbsp;addr&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_mask;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;netmask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_alen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;protocol&nbsp;address&nbsp;length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;dev_mc_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*mc_list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Multicast&nbsp;mac&nbsp;addresses&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc_count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Number&nbsp;of&nbsp;installed&nbsp;mcasts&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;ip_mc_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ip_mc_list;&nbsp;&nbsp;&nbsp;/*&nbsp;IP&nbsp;multicast&nbsp;filter&nbsp;chain&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;__u32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx_queue_len;&nbsp;&nbsp;&nbsp;/*&nbsp;Max&nbsp;frames&nbsp;per&nbsp;queue&nbsp;allowed&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;<BR>------------------&nbsp;Linux操作系统网络驱动程序编写&nbsp;-------------------&nbsp;<BR>------------&nbsp;Contact&nbsp;the&nbsp;author&nbsp;by&nbsp;<A HREF="mailto:mailto:bordi@bordi.dhs.org">mailto:bordi@bordi.dhs.org</A>&nbsp;------&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;For&nbsp;load&nbsp;balancing&nbsp;driver&nbsp;pair&nbsp;support&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pkt_queue;&nbsp;&nbsp;&nbsp;/*&nbsp;Packets&nbsp;queued&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;device&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*slave;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Slave&nbsp;device&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;net_alias_info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*alias_info;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;main&nbsp;dev&nbsp;alias&nbsp;info&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;net_alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*my_alias;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;alias&nbsp;devs&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Pointer&nbsp;to&nbsp;the&nbsp;interface&nbsp;buffers.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;sk_buff_head&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffs[DEV_NUMBUFFS];&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Pointers&nbsp;to&nbsp;interface&nbsp;service&nbsp;routines.&nbsp;*/&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*open)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*stop)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*hard_start_xmit)&nbsp;(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;device&nbsp;*dev);&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*hard_header)&nbsp;(struct&nbsp;sk_buff&nbsp;*skb,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;device&nbsp;*dev,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;type,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*daddr,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*saddr,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;len);&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*rebuild_header)(void&nbsp;*eth,&nbsp;struct&nbsp;device&nbsp;*dev,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;raddr,&nbsp;struct&nbsp;sk_buff&nbsp;*skb);&nbsp;<BR>#define&nbsp;HAVE_MULTICAST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*set_multicast_list)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>#define&nbsp;HAVE_SET_MAC_ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*set_mac_address)(struct&nbsp;device&nbsp;*dev,&nbsp;void&nbsp;*addr);&nbsp;<BR>#define&nbsp;HAVE_PRIVATE_IOCTL&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*do_ioctl)(struct&nbsp;device&nbsp;*dev,&nbsp;struct&nbsp;ifreq&nbsp;*ifr,&nbsp;int&nbsp;cmd);&nbsp;<BR>#define&nbsp;HAVE_SET_CONFIG&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*set_config)(struct&nbsp;device&nbsp;*dev,&nbsp;struct&nbsp;ifmap&nbsp;*map);&nbsp;<BR>#define&nbsp;HAVE_HEADER_CACHE&nbsp;<BR>&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*header_cache_bind)(struct&nbsp;hh_cache&nbsp;**hhp,&nbsp;struct&nbsp;device&nbsp;<BR>*dev,&nbsp;unsigned&nbsp;short&nbsp;htype,&nbsp;__u32&nbsp;daddr);&nbsp;<BR>&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*header_cache_update)(struct&nbsp;hh_cache&nbsp;*hh,&nbsp;struct&nbsp;device&nbsp;<BR>*dev,&nbsp;unsigned&nbsp;char&nbsp;*&nbsp;&nbsp;haddr);&nbsp;<BR>#define&nbsp;HAVE_CHANGE_MTU&nbsp;<BR>&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*change_mtu)(struct&nbsp;device&nbsp;*dev,&nbsp;int&nbsp;new_mtu);&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;struct&nbsp;iw_statistics*&nbsp;&nbsp;&nbsp;(*get_wireless_stats)(struct&nbsp;device&nbsp;*dev);&nbsp;<BR>};&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>2.4&nbsp;常用的系统支持&nbsp;<BR>&nbsp;<BR>2.4.1&nbsp;内存申请和释放&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;include/linux/kernel.h里声明了kmalloc()和kfree()。用于在内核模式下申&nbsp;<BR>请和释放内存。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*kmalloc(unsigned&nbsp;int&nbsp;len,int&nbsp;priority);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;kfree(void&nbsp;*__ptr);&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;与用户模式下的malloc()不同,kmalloc()申请空间有大小限制。长度是2的整&nbsp;<BR>次方。可以申请的最大长度也有限制。另外kmalloc()有priority参数,通常使用&nbsp;<BR>时可以为GFP_KERNEL,如果在中断里调用用GFP_ATOMIC参数,因为使用GFP_KERNEL&nbsp;<BR>则调用者可能进入sleep状态,在处理中断时是不允许的。&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;kfree()释放的内存必须是kmalloc()申请的。如果知道内存的大小,也可以用&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -