通信工程tcp(2)期末复习_0_第1页
通信工程tcp(2)期末复习_0_第2页
通信工程tcp(2)期末复习_0_第3页
免费预览已结束,剩余2页可下载查看

下载本文档

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

文档简介

1、通信工程tcp(2)期末复习 一、数据存储与字节序 (1)什么是大端字节序: (2)什么是小端字节序: (3)什么是络字节序: 端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序。 小端字节序:低字节存于内存低地址;高字节存于内存高地址。如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 可以知道内存的地址是由低到高的顺序;而数据的字节也是由低到高的,故以上字节序是小端字节序。 大端字节序:高字节存于内存低地址

2、;低字节存于内存高地址。 0x0029f458 0x12 0x0029f459 0x34 0x0029f45a 0x56 0x0029f45b 0x79 在以上数据存放于内存中的表现形式中,0x0029f458 可以知道内存的地址是由低到高的顺序;而数据的字节却是由高到低的,故以上字节序是大端字节序。 络字节序:就是大端字节序。规定不同系统间通信一律采用络字节序。 在vc中的实验如下: int temp = 0x12345678; 调试中,该变量在内存中的字节数据是78 56 34 12,内存中的存放地址是:0x0029f458,0x0029f459, 0x0029f45a,0x0029f45

3、b;刚好符合低位存于低地址中,说明vc遵循小端字节序。 二、linux内核通用链表 1、内核通用链表的定义 2、怎样创建链表 3、怎样向链表添加元素 4、怎样从链表删除元素 5、怎样遍历链表 6、list_entry(.)宏的实现原理 1、内核通用链表的定义 struct list_head struct list_head *next, *prev; ; 2、 新建一个链表 实际上linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看list_head()这个宏: #define list_head_init(name) c) 搬移 linux提供

4、了将原本属于一个链表的节点移动到另一个链表的操作,并根据插入到新链表的位置分为两类: static inline void list_move(struct list_head *list, struct list_head *head); static inline void list_move_tail(struct list_head *list, struct list_head *head); d) 合并 除了针对节点的插入、删除操作,linux链表还提供了整个链表的插入功能: static inline void list_splice(struct list_head *list

5、, struct list_head *head); 4、遍历 a) 由链表节点到数据项变量 list_entry宏是用来根据list_head指针查找链表所嵌入的结构体的地址,具体实现是依赖宏container_of: #define list_entry(ptr, type, member) container_of(ptr, type, member) #define container_of(ptr, type, member) ( const typeof( (type *)0)-member ) *_mptr = (ptr); (type *)( (char *)_mptr - o

6、ffsetof(type,member) );) #define offsetof(type, member) (size_t) &(type *)0)- member) container_of有三个参数, ptr是成员变量的指针, type是指结构体的类型, member是成员变量的名字。 container_of 的作用就是在已知某一个成员变量的名字、指针和结构体类型的情况下,计算结构体的指针,也就是计算结构体的起始地址。 计算的方法其实很简单,就是用该成员变量的指针减去它于type结构体起始位置的偏移量。在这个定义中,typeof( (type *)0)-member ) 就是获得 m

7、ember 的类型, 然后定义了一个临时的常量指针 _mptr, 指向 member 变量。 把 _mptr 转换成 char * 类型, 因为 offsetof 得到的偏移量是以字节为单位。 两者相减得到结构体的起始位置, 再强制转换成 type 类型。 offsetof在这里,type表示一个结构体的类型,member是结构体中的一个成员变量的名字。offsetof 宏的作用是计算成员变量 member 相对于结构体起始位置的内存偏移量,以字节(byte)为单位。 b) 遍历宏 宏list_entry的定义如下: #define list_entry(ptr, type, member)

8、(type *)(char *)(ptr)-(unsigned long)(&(type *)0)-member) 1) (type *)0) 将0转型为type类型指针,这里就是list_user类 型。 2) (type *)0)-member 访问结构中的数据成员member,即list成 员。 3) &(type *)0)-member) 取出数据成员member的地址,即list的地址。 4) (unsigned long)(&(type *)0)-member) 将上一步的地址进行类型转换得到一个unsigned long 型的数,也就是member所在结构实例的偏移地址,即得到list成员在list_user宿主中的偏移。 5) (char *)(ptr) 将宿主中list的地址转换为char *型,便于按字节进行计算。 6) ptr的值减去list在该宿主中的偏移,得到该宿主的首地址的值。 7) 对上一部的结果进行(type *)转型,获得宿主首地址,即list_use

温馨提示

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

评论

0/150

提交评论