Linux内核网络协议栈1- socket文件系统注册

一、注册时机

1、在内核初始化时完成;
2、内核初始化过程(init/main.c): kernel_init()->do_basic_setup()->do_initcalls()->do_one_initcall()
3、socket文件系统注册过程(net/socket.c): core_initcall(sock_init)
1) core_initcall宏定义如下:
C代码   收藏代码
  1. #define core_initcall(fn) __define_initcall("1",fn,1)  
  2.   
  3. #define __define_initcall(level,fn,id) \  
  4.    static initcall_t __initcall_##fn##id __used \  
  5.    __attribute__((__section__(".initcall" level ".init"))) = fn  
宏定义 __define_initcall(level,fn, id) 对于内核的初始化很重要,他指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化阶段, do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。由于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常很重要。该宏的作用分三部分:a) 申明一个函数指针 initcall_t (即int *(void))变量__initcall_fn_id;b) 将该函数指针初始化为fn;c) 编译的时候需要把这个函数指针变量放置到名称为 ".initcall"level".init"的section中;
根据上面的解释,core_initcall(sock_init)的作用就是让编译器在编译时声明函数指针变量__initcallsock_init1,让其指向sock_init,并放到名为".initcall1.init"的section中;

二、socket文件系统注册
1、socket文件系统类型
C代码   收藏代码
  1. static struct file_system_type sock_fs_type = {  
  2.    .name = "sockfs",  
  3.    .get_sb = sockfs_get_sb,  
  4.    .kill_sb = kill_anon_super,  
  5. };  
其中,get_sb函数指针定义了如何获取该文件系统的超级块,而kill_sb函数指针定义了如何删除该超级块;
2、sock_init主要逻辑
函数的主要代码如下:
C代码   收藏代码
  1. static int __init sock_init(void){  
  2.    init_inodecache();  
  3.    register_filesystem(&sock_fs_type);  
  4.    sock_mnt = kern_mount(&sock_fs_type);  
  5.    return 0;  
  6. }  
1) init_inodecache() :创建一块用于socket相关的inode的调整缓存;后面创建inode、释放inode会使用到;
2) register_filesystem() :将socket文件系统注册到内核中;
在内核中,所有的文件系统保存在全局变量file_systems中,如下:
static struct file_system_type *file_systems;
不同的文件系统类型通过结构体的next字段形成一个单向链表;
这样,注册文件系统实质是将新的结构体插入到单向链表中的过程;
3) kern_mount() :在内核中安装文件系统,并建立安装点;
在安装的过程中,会初始化该安装点的超级块,此时会将该超级块的操作函数指针记录下来;如:
C代码   收藏代码
  1. static int sockfs_get_sb(struct file_system_type *fs_type,  
  2.              int flags, const char *dev_name, void *data,  
  3.              struct vfsmount *mnt)  
  4. {  
  5.     return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC,  
  6.                  mnt);  
  7. }  
其中sockfs_ops结构变量如下:
C代码   收藏代码
  1. static struct super_operations sockfs_ops = {  
  2.     .alloc_inode =  sock_alloc_inode,  
  3.     .destroy_inode =sock_destroy_inode,  
  4.     .statfs =   simple_statfs,  
  5. };  
该操作函数结构体定义了如何分配inode,如何销毁inode等;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值