billconan 发表于 2005-7-5 23:53:57

请教net\ipv4\af_inet.c文件中的问题

这个文件中涉及的很多结构都有一个 list_head
看上去像是个双向循环的链表 但是其中并不包含内容 纯粹就是两个用来遍历用的指针 我想不通没有内容的一个链表是干什么的?

比如说注销的函数 哪位大侠能给解释一下
void
inet_unregister_protosw(struct inet_protosw *p)
{
if (INET_PROTOSW_PERMANENT & p->flags) {
printk(KERN_ERR
"Attempt to unregister permanent protocol %d.\n",
p->protocol);
} else {
br_write_lock_bh(BR_NETPROTO_LOCK);
list_del(&p->list); //这一句的含义是什么?
br_write_unlock_bh(BR_NETPROTO_LOCK);
}
}

函数参数中的结构体如下

struct inet_protosw {
struct list_head list;

/* These two fields form the lookup key. */
unsigned short type; /* This is the 2nd argument to socket(2). */
int protocol; /* This is the L4 protocol number. */

struct proto *prot;
struct proto_ops *ops;

int capability; /* Which (if any) capability do
* we need to use this socket
* interface?
*/
char no_check; /* checksum on rcv/xmit/none? */
unsigned char flags; /* See INET_PROTOSW_* below. */
};

结构体中的head_list定义如下
struct list_head {
struct list_head *next, *prev;
};

你瞧 根本没有实质的信息 而且*next和*prev也是指向list_head的 根本没能把inet_protosw 连成链表啊 要这个指针到底做什么用啊?

另外还有个问题 有个函数是这样的
static int __init inet_init(void)
里面的“__init”是干什么用的?

还有就是文件的最后有一个 module_init(inet_init);
的函数声明 我不明白是干什么的,因为文件中没有这个函数,也没有用到它的地方,显然它也不是加载模块,它是干什么的?

_z_ 发表于 2005-7-7 12:38:10

list_head是个“通用”链表,依靠list_entry(ptr, type, member)获得所依附的结构指针。

#define __init          __attribute__ ((__section__ (".text.init"))
__init修饰的函数被连接到.text.init段,执行完毕后所占的空间被释放。
module_init(x)在__initcall_start与__initcall_end之间保存函数指针。不过这个与是否编译成模块有关。

billconan 发表于 2005-7-7 15:14:24

list_head好像通过一个强制类型转换得到的整个结构体内容 这个是我目前的理解

谢谢楼上的解答

不知道看这部分代码由没有好的资料啊
页: [1]
查看完整版本: 请教net\ipv4\af_inet.c文件中的问题