嵌入式Linu内核详细设计_第1页
嵌入式Linu内核详细设计_第2页
嵌入式Linu内核详细设计_第3页
嵌入式Linu内核详细设计_第4页
嵌入式Linu内核详细设计_第5页
已阅读5页,还剩157页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式Linux内核详细设计讲明书拟制: 校对: 审核: 湖南计算机股份有限公司嵌入式系统研究所2001.5目录 HYPERLINK mhtml:mid:/00000000/ l _Toc502489490 1. 引言2 HYPERLINK mhtml:mid:/00000000/ l _Toc502489491 1.1 参考资料2 HYPERLINK mhtml:mid:/00000000/ l _Toc502489492 1.2 术语和缩写词2 HYPERLINK mhtml:mid:/00000000/ l _Toc502489493 2. 设计概览5 HYPERLINK mhtml:m

2、id:/00000000/ l _Toc502489494 2.1 设计的驱动因素以及各自重要性的排序(例如,功能、性能、可靠性、硬件、内存考虑等等)5 HYPERLINK mhtml:mid:/00000000/ l _Toc502489495 2.2 不同设计方案的评价5 HYPERLINK mhtml:mid:/00000000/ l _Toc502489496 2.3 对所选设计方案总体结构图示及讨论5 HYPERLINK mhtml:mid:/00000000/ l _Toc502489497 2.4 开发环境(如开发语言、硬件、外设等等)6 HYPERLINK mhtml:mid:

3、/00000000/ l _Toc502489498 3. 设计描述7 HYPERLINK mhtml:mid:/00000000/ l _Toc502489499 3.1 全局数据结构7 HYPERLINK mhtml:mid:/00000000/ l _Toc502489500 3.2 进程调度子系统25 HYPERLINK mhtml:mid:/00000000/ l _Toc502489501 3.2.1 模块功能概览25 HYPERLINK mhtml:mid:/00000000/ l _Toc502489502 3.2.2 详细输入、输出及处理描述25 HYPERLINK mhtm

4、l:mid:/00000000/ l _Toc502489503 3.3 内存治理子系统31 HYPERLINK mhtml:mid:/00000000/ l _Toc502489504 3.3.1 模块功能概览31 HYPERLINK mhtml:mid:/00000000/ l _Toc502489505 3.3.2 详细输入、输出及处理描述31 HYPERLINK mhtml:mid:/00000000/ l _Toc502489506 3.4 虚拟文件子系统34 HYPERLINK mhtml:mid:/00000000/ l _Toc502489507 3.4.1 模块功能概览34

5、HYPERLINK mhtml:mid:/00000000/ l _Toc502489508 3.4.2 详细输入、输出及处理描述34 HYPERLINK mhtml:mid:/00000000/ l _Toc502489509 3.5 进程间通信(IPC)子系统51 HYPERLINK mhtml:mid:/00000000/ l _Toc502489510 3.5.1 模块功能概览51 HYPERLINK mhtml:mid:/00000000/ l _Toc502489511 3.5.2 详细输入、输出及处理描述51 HYPERLINK mhtml:mid:/00000000/ l _T

6、oc502489512 3.6 网络模块(NET)子系统60 HYPERLINK mhtml:mid:/00000000/ l _Toc502489513 3.6.1 模块功能概览60 HYPERLINK mhtml:mid:/00000000/ l _Toc502489514 3.6.2 详细输入、输出及处理描述601. 引言1.1 参考资料无1.2 术语和缩写词Argument 参数,函数和例程中能够带入参数进行处理。ARP 地址转换协议。被用来将IP地址转换成物理硬件地址,如网卡地址。ARP是TCP/IP协议族中一个特不重要的协议。 Ascii Ascii代表着American Stan

7、dard Code for Information Interchange. 字母表中的每个字母代表一个8位的编码。Ascii被用来存储”可写“的字符。 Bit 值域为0或1的一个二进制数据位。Bottom Half Handler 核内心在队列中的任务的句柄或指针。 Byte 字节,8位数据。 C 一种高级编程语言,Linux差不多上是用C编写的。CPU Central Processing Unit(中央处理单元)。Data Structure 数据结构。Device Driver 设备驱动程序。用来操纵一个特定设备类的软件。例如,NCR 810设备驱动程序操纵NCR 810 SCSI 设

8、备。DMA Direct Memory Access(直接内存存取)ELF Executable and Linkable Format(可执行与可连接格式). EIDE 扩展IDE. Executable image 可执行映象。一个含有指令和数据的文件。能够被调进虚拟内存而执行。 Function 函数IDE Integrated Disk Electronics. Image 参阅可执行映象。IP Internet Protocol(网际协议). IPC Interprocess Communiction(进程间通讯) Interface 接口。接口是一个抽象的概念。实现中,通常指一些函

9、数或例程接口。IRQ Interrupt Request Queue(中断申请队列). ISA Industry Standard Architecture. This is a standard, although now rather dated, data bus interface for system components such as floppy disk drivers. Kernel Module 一个能够动态地被装载的核心部份,如文件系统和设备驱动序。Kilobyte 1024字节。Megabyte 一兆字节或1024K字节。Microprocessor 微处理器。Mod

10、ule 模块。一个含有指令的文件。Object file 目标文件。或*.o文件。指一个含有指令和数据的文件。但那个文件尚未与其所需要的其他目标文件或库相连接以形成一个可执行文件。 Page 物理内存被分成许多同样大小的页面。是虚拟内存治理调度的最小单位。 Pointer 指针Process 进程。一个正在执行的程序。Processor 处理器的简称。PCI Peripheral Component Interconnect. 一个外设总线。Peripheral 外围设备Program 程序。Protocol 协议。通常指两个实体间“对话”的一种事先格式约定。Register 寄存器Routi

11、ne 例程。与函数类似,除了不返回值。 SCSI Small Computer Systems Interface(小型计算机接口). Shell command shell。Linux 缺省用的是bash shell. SMP Symmetrical multiprocessing. Systems(对称多处理系统)。Socket 一个socket代表着一个网络连接。Linux支持BSD Socket 接口。Software 软件System V Unix的一个版本,公布于1983。那个版本中,引进了闻名的士System V IPC机制。TCP Transmission Control Pr

12、otocol(传输操纵协议). Task Queue 任务队列UDP User Datagram Protocol(用户数据报协议). Virtual memory 虚拟内存2. 设计概览2.1 设计的驱动因素以及各自重要性的排序(例如,功能、性能、可靠性、硬件、内存考虑等等)在设计过程中,要紧要考虑的有以下几点:跨平台的可移植性,在保证功能和不牺牲性能的前提下尽量减小核心的体积,为今后进一步开发留下空间和便利。其中,最要紧的确实是可移植性,这是那个嵌入式系统的特色。减少核心的体积能够降低成本,然而随着当今硬件生产技术的提高完善,这一点差不多不像过去那样重要了,因此在裁剪核心的同时要幸免牺牲性

13、能和功能。2.2 不同设计方案的评价内核采纳层次式结构。如此的结构大概层次清晰,易于修改。然而它严峻降低了内核的效率。因为当高层次的函数调用底层提供的功能时,可能需要跨越几个层次,如此会增加系统开销。而且,在系统核心中,各个部分互相提供功能调用,假如严格按照层次式结构组织将打破核心中各个功能部分的有机结构,使结构变的混乱。内核采纳整体式结构。如此的结构的特点是那个内核由许多过程组成,然而不像在层次式结构中那样,每个过程只能被紧挨着它的上层调用。在整体式结构中,每个过程独立编译后,连接程序将其连接成为一个单独的目标程序,每个过程都对其它过程可见。如此的结构尽管在内部关系上确实变的复杂了(各个模块

14、间是网状的结构),然而在调用关系和提供服务的角度来看变的简单清晰也更直观了,子系统间易于访问,内核工作效率较高。而且也有助于不同的人参与不同过程的开发。因此对内核的组织采纳整体式结构。2.3 对所选设计方案总体结构图示及讨论内核由5个要紧的子系统组成,它们之间的大致依靠关系如图。FS:文件系统IPC:进程间通信MM:内存治理NET:网络模块SCHED:进程调度进程调度子系统处于核心地位,其它子系统要完成操作都需要它来调度以占用系统资源完成自己的操作。文件系统需要利用网络模块支持网络文件系统,也需要利用内存治理支持RAMDISK设备。内存治理利用文件系统支持交换,交换进程定期的由调度程序调度,这

15、也是内存治理依靠于进程调度的缘故。进程间通信子系统要依靠内存治理支持共享内存通信机制。进程调度子系统需要内存治理的支持来完成创建进程等操作。2.4 开发环境(如开发语言、硬件、外设等等)内核由GNU C语言及汇编语言开发。硬件平台是i386嵌入式平台。所支持的外设诸如标准PC的外设,和一些差不多的嵌入式系统的硬件设备。如网络设备,显示设备,外存,音频设备,视频设备等。3. 设计描述3.1 全局数据结构全局数据结构的描述。block_dev_struct 数据结构用来登记块设备以被缓冲区使用。struct blk_dev_struct void (*request_fn)(void); stru

16、ct request * current_request;struct request plug; struct tq_struct plug_tq; ;buffer_head 数据结构用来存放缓冲区中的一个数据块的信息。 /* bh state bits */ #define BH_Uptodate 0 /* 1 缓冲区里有数据*/ #define BH_Dirty 1 /* 1 缓冲区脏 */#define BH_Lock 2 /* 1 缓冲区被锁 */ #define BH_Req 3 /* 0 缓冲区无效 */ #define BH_Touched 4 /* 1 缓冲区被重复访问 */

17、 #define BH_Has_aged 5 /* 1 缓冲区过时 */ #define BH_Protected 6 /* 1 缓冲区处于爱护状态 */ #define BH_FreeOnIO 7 /* 1 IO后丢弃缓冲区头部 */ struct buffer_head /* First cache line: */ unsigned long b_blocknr; /* 块数目 */ kdev_t b_dev; /* 设备 (B_FREE = free) */ kdev_t b_rdev; /* 真实设备 */ unsigned long b_rsector; /* 磁盘上的真是缓冲区*

18、/ struct buffer_head *b_next; /* 信号队列列表 */ struct buffer_head *b_this_page; /* 一页内的缓冲区循环列表 */ /* Second cache line: */ unsigned long b_state; /* 缓冲区状态掩码 */ struct buffer_head *b_next_free; unsigned int b_count; /* 用户使用此块 */ unsigned long b_size; /* 块大小 */ /* Non-performance-critical data follows. */

19、 char *b_data; /* 数据块指针 */ unsigned int b_list; /* 缓冲区公布表 */ unsigned long b_flushtime; /* 脏缓冲区被重写时刻 */ unsigned long b_lru_time; /* 缓冲区上次被使用时刻 */ struct wait_queue *b_wait; struct buffer_head *b_prev; /* 双重连接的哈希表 */ struct buffer_head *b_prev_free; /* 双重连接的缓冲区*/ struct buffer_head *b_reqnext; /* 请求

20、队列 */ ; device 系统中每一个网络设备都对应于一个设备数据结构。 struct device /*那个地点是那个结构的可见部分的第一部分 ( 就像用户在文件Space.c中看到的一样 ).这是它的名称和接口. */ char *name; /* I/O specific fields */ unsigned long rmem_end; unsigned long rmem_start; unsigned long mem_end; /* 共享内存结束 */ unsigned long mem_start; /* 共享内存起始 */ unsigned long base_addr;

21、 /* 设备IO地址 */ unsigned char irq; /* device IRQ number */ /* Low-level status flags. */ volatile unsigned char start, /* 开始一个操作 */ interrupt; /* 中断到达 */ unsigned long tbusy; /* 传送忙 */ struct device *next; /* 设备初始化,只被调用一次 */ int (*init)(struct device *dev); /* 有些设备还需要下面这些字段, 然而它们不是在文件 Space.c中通常的设置项.

22、*/ unsigned char if_port; /* 可选择的 AUI,TP, */ unsigned char dma; /* DMA 通道 */ struct enet_statistics* (*get_stats)(struct device *dev); /* 标记了结构的可见部分的结束部分. 这后面的所有字段是系统内部的,能够被随意改动 */ /* 这些可能为今后的远程关机代码使用 */ unsigned long trans_start; /* 最后一次传送的时刻 */ unsigned long last_rx; /* 最后Rx的时刻 */ unsigned short f

23、lags; /* 接口标记 (BSD)*/ unsigned short family; /* 地址族 ID */ unsigned short metric; /* 路由距离 */ unsigned short mtu; /* MTU 值 */ unsigned short type; /* 硬件类型 */ unsigned short hard_header_len; /* 硬件地址长度 */ void *priv; /* 私有数据 */* 接口地址信息. */ unsigned char broadcastMAX_ADDR_LEN; unsigned char pad; unsigned

24、 char dev_addrMAX_ADDR_LEN; unsigned char addr_len; /* 硬件地址长度 */ unsigned long pa_addr; /* 协议地址 */ unsigned long pa_brdaddr; /* 协议广播地址*/ unsigned long pa_dstaddr; /* PP协议另一端地址*/ unsigned long pa_mask; /* 协议网络掩码 */ unsigned short pa_alen; /* 协议地址长度 */ struct dev_mc_list *mc_list; /* Mac广播地址 */ int mc

25、_count; /* 已安装的Mac编号 */ struct ip_mc_list *ip_mc_list; /* IPMac链 */ _u32 tx_queue_len; /* 每个队列的最大帧长度 */* For load balancing driver pair support */ unsigned long pkt_queue; /* 包队列 */ struct device *slave; /* 附属设备 */ struct net_alias_info *alias_info; /* 主设备不名信息 */ struct net_alias *my_alias; /* 不名设备

26、*/ /* Pointer to the interface buffers. */ struct sk_buff_head buffsDEV_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,

27、 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)(st

28、ruct 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);

29、int (*change_mtu)(struct device *dev, int new_mtu); struct iw_statistics* (*get_wireless_stats)(struct device *dev); ;device_struct 数据结构用来登记字符和块设备(含有相应的名字和对此设备的文件操作集)。每一个chrdevs 和 blkdevs向量的入口对应一个字符或块设备。struct device_struct const char * name; struct file_operations * fops; ;file 每个打开的文件, socket 接口都对

30、应一个文件数据结构。 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; /* 将发送的SIGIO的用户标示和组标示 */ struct inode * f_inode; struct file_operations * f_op; unsigned long f_ver

31、sion; void *private_data; /* 为tty或其它设备需要 */ ;files_struct files_struct 数据结构描述一个正被打开的文件。 struct files_struct int count;fd_set close_on_exec; fd_set open_fds; struct file * fdNR_OPEN; ; fs_struct struct fs_struct int count; unsigned short umask; struct inode * root, * pwd; ;gendisk gendisk 数据结构含有一个硬盘的

32、信息。当系统初始化,发觉硬盘和检测分区参数时,此结构被填充。 struct hd_struct long start_sect; long nr_sects; ; struct gendisk int major; /* 设备主编号 */ const char *major_name; /* 主设备名 */int minor_shift; /* number of times minor is shifted to get real minor */ int max_p; /* 每个设备的最大分区数 */ int max_nr; /* 真实设备的最大个数 */ void (*init)(str

33、uct gendisk *); /* 工作前先初始化 */ struct hd_struct *part; /* 分区表 */ int *sizes; /* 以块计数的设备大小, 拷贝进blk_size */ int nr_real; /* 真实设备个数 */ void *real_devices; /* 内部使用 */ struct gendisk *next; ; inode数据结构包含一个磁盘中的文件或目录的信息。struct inode kdev_t i_dev; unsigned long i_ino; umode_t i_mode; nlink_t i_nlink; uid_t i

34、_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

35、; struct file_lock *i_flock; struct vm_area_struct *i_mmap; struct page *i_pages; struct dquot *i_dquotMAXQUOTAS; 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; unsi

36、gned 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

37、_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

38、 *generic_ip; u; ;fipc_perm ipc_perm 结构描述了一个 System V IPC 对象的存取权限。.struct ipc_perm key_t key; ushort uid; /* 所有者的用户编号和组编号 */ ushort gid; ushort cuid; /* 创建者的用户编号和组编号 */ ushort cgid; ushort mode; /* 访问方式 */ ushort seq; /* 序列号 */ ; irqaction 结构用来描述系统的中断句柄。 struct irqaction void (*handler)(int, void *,

39、 struct pt_regs *); unsigned long flags; unsigned long mask; const char *name; void *dev_id; struct irqaction *next; ; linux_binfmt 每个Linux 能够理解的二进制文件格式对应一个linux_binfmt 数据结构。 struct linux_binfmt struct linux_binfmt * next; long *use_count; int (*load_binary)(struct linux_binprm *, struct pt_regs * r

40、egs); int (*load_shlib)(int fd);int (*core_dump)(long signr, struct pt_regs * regs); ;mem_map_t数据结构(或叫做页面) 用来存放每个物理内存页面的信息。 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; atomi

41、c_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; /* map_nr = mem_map */ mem_map_t; mm_struct 用来描述一个任务活一个进程

42、的虚拟内存空间。 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_fl

43、ags; struct vm_area_struct * mmap; struct vm_area_struct * mmap_avl; struct semaphore mmap_sem; ; pci_bus 系统中的每个PCI总线对应一个 pci_bus 结构。 struct pci_bus struct pci_bus *parent; /* 父总线 */struct pci_bus *children; /* 总线的P2P链 */struct pci_bus *next; /* 所有PCI总线链 */struct pci_dev *self; /* 被父总线看到的桥设备*/struct

44、 pci_dev *devices; /* 桥后的设备 */void *sysdata; /* 系统指定的外部挂钩 */unsigned char number; /* 总线编号 */unsigned char primary; /* 主桥编号 */unsigned char secondary; /* 二级桥编号 */unsigned char subordinate; /* 下级总线的最大数目 */ ;pci_dev 系统中的每个PCI 设备,包括PCI-PCI和PCI-ISA桥设备都分不对应于一个 pci_dev 结构。/* * There is one pci_dev structur

45、e for each slot-number/function-number * combination: */ struct pci_dev struct pci_bus *bus; /* 设备所基于的总线 */ struct pci_dev *sibling; /* 总线上的下一个设备 */ struct pci_dev *next; /* 所有设备的链 */ void *sysdata; /* 系统指定的外部挂钩 */ unsigned int devfn; /* 可编程设备 ; 函数索引 */ unsigned short vendor; unsigned short device;

46、unsigned int class; /* 3 bytes: (base,sub,prog-if) */ unsigned int master : 1; /* set if device is master capable */ /* * 理论上, 中断级不能够从配置空间中猎取而 * 不阻碍其它. 然而, 旧的 PCI 芯片不支持 * 这些寄存器同时只返回零. 例如, * 芯片 Vision864-P rev 0 能够使用 INTA, 然而返回 0 *. pci_init()用 PCI_INTERRUPT_LINE 的数据初始化那个字段*. 同时pcibios_fixup() 能够改变它。

47、*. 那个字段不能是0,除非改设备 * 全然不能产生中断. */ unsigned char irq; /* 改设备产生的irq */ ;request 结构用来向系统中的块设备发出请求。 这些请求是关于读或写缓冲区中的数据块。 struct request volatile int rq_status; #define RQ_INACTIVE (-1) #define RQ_ACTIVE 1 #define RQ_SCSI_BUSY 0 xffff #define RQ_SCSI_DONE 0 xfffe #define RQ_SCSI_DISCONNECTING 0 xffe0 kdev_

48、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 每个 rtable 结构含有对应一个IP主机的路由信息。rtable 结构在IP路由

49、缓冲中被使用。struct rtable struct rtable *rt_next; _u32 rt_dst; _u32 rt_src; _u32 rt_gateway; atomic_t rt_refcnt; atomic_t rt_use; unsigned long rt_window; atomic_t rt_lastuse; struct hh_cache *rt_hh; struct device *rt_dev; unsigned short rt_flags; unsigned short rt_mtu; unsigned short rt_irtt; unsigned c

50、har rt_tos; ; semaphore被用来爱护临界数据和临界区代码。 struct semaphore int count; int waking; int lock ; /* to make waking testing atomic */ struct wait_queue *wait; ; sk_buff sk_buff 结构被用来当数据在网络协议之间移动时描述网络数据.struct sk_buff struct sk_buff *next; /* 表中的下一个缓冲区*/ struct sk_buff *prev; /* 表中的前一个缓冲区*/ struct sk_buff_h

51、ead *list; /* 所在的表 */ int magic_debug_cookie; struct sk_buff *link3; /* IP协议层的缓冲区链 */ struct sock *sk; /* 所属的Socket */ unsigned long when; /* used to compute rtts */ struct timeval stamp; /* 到达时刻 */ struct device *dev; /* 到达或离开的设备 */ union struct tcphdr *th; struct ethhdr *eth; struct iphdr *iph; st

52、ruct udphdr *uh; unsigned char *raw; /* 用来在一个unix domain socket 里传送文件句柄*/ void *filp; h; union /* As yet incomplete physical layer views */ unsigned char *raw; struct ethhdr *ethernet; mac; struct iphdr *ip_hdr; /* For IPPROTO_RAW */ unsigned long len; /* 实际数据长度 */ unsigned long csum; /* 校验和 */ _u32

53、 saddr; /* IP源地址 */ _u32 daddr; /* IP 目标地址 */ _u32 raddr; /* IP 下一节点地址 */ _u32 seq; /* TCP 序列号 */ _u32 end_seq; /* seq + fin + syn + datalen */ _u32 ack_seq; /* TCP 确认序列号 */ unsigned char proto_priv16; volatile char acked, /* 是否被确认 */ used, /* 是否被使用 ? */ free, /* 如何释放缓冲区 */ arp; /* IP/ARP 解析是否结束 */

54、unsigned char tries, /* Times tried */ lock, /* 是否锁住 ? */ localroute, /* 为改帧的本地路由断言 */ pkt_type, /* 包级不 */ pkt_bridged, /* Tracker for bridging */ ip_summed; /* 驱动产生的IP校验和 */ #define PACKET_HOST 0 /* 对自己 */ #define PACKET_BROADCAST 1 /* 对所有*/ #define PACKET_MULTICAST 2 /* 对组 */ #define PACKET_OTHERH

55、OST 3 /* 对其它人 */ unsigned short users; /* 用户技术 见 datagram.c,tcp.c */ unsigned short protocol; /* 来自协议的包的协议. */ unsigned int truesize; /* 缓冲区大小 */ atomic_t count; /* 共享计数 */ struct sk_buff *data_skb; /* 实际数据的skb指针 */ unsigned char *head; /* 缓冲区头 */ unsigned char *data; /* 数据头指针 */ unsigned char *tail

56、; /* 尾指针 */ unsigned char *end; /* 结束指针 */ void (*destructor)(struct sk_buff *); /* 撤销函数 */ _u16 redirport; /* Redirect port */ ; sock 每个sock 数据结构维护一个关于BSD socket 的协议信息。例如,对一个INET类型的socket,此数据结构将含有所有TCP/IP和UDP/IP的相关信息。 struct sock /* This must be first. */ struct sock *sklist_next; struct sock *skli

57、st_prev; struct options *opt; atomic_t wmem_alloc; atomic_t rmem_alloc; unsigned long allocation; /* 配置模式 */ _u32 write_seq; _u32 sent_seq; _u32 acked_seq; _u32 copied_seq; _u32 rcv_ack_seq; unsigned short rcv_ack_cnt; /* 同一确认的计数 */ _u32 window_seq; _u32 fin_seq; _u32 urg_seq; _u32 urg_data; _u32 sy

58、n_seq; int users; /* 用户计数 */ /* 不是所有的都不稳定, 然而确实有些是, 因此我们能够讲它们都不稳定. */ unsigned long lingertime; int proc; struct sock *next; struct sock *pprev; struct sock *bind_next; struct sock *bind_pprev; struct sock *pair; int hashent; struct sock *prev; struct sk_buff *volatile send_head; struct sk_buff *vol

59、atile send_next; struct sk_buff *volatile send_tail; struct sk_buff_head back_log; struct sk_buff *partial; struct timer_list partial_timer; long retransmits; struct sk_buff_head write_queue, receive_queue; struct proto *prot; struct wait_queue *sleep; _u32 daddr; _u32 saddr; /* 发送源 */ _u32 rcv_sadd

60、r; /* 目的地址 */ unsigned short max_unacked; unsigned short window; _u32 lastwin_seq; /* 最后一次更新窗口时的序列号*/ _u32 high_seq; /* 进行当前最快转发时的序列号 */ volatile unsigned long ato; /* 确认超时 */ volatile unsigned long lrcvtime; /* jiffies at last data rcv */ volatile unsigned long idletime; /* jiffies at last rcv */ u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论