TCP/IP - 网络文件系统

来源:互联网 发布:数据库原理pdf百度云 编辑:程序博客网 时间:2024/06/07 03:08

1. 网络的初始化入口:

sock_fs_type变量。

定义在内核的net/socket.c中。

类型为file_system_type结构体,代表Linux内核的各种网络文件系统。

sock_fs_type变量代表sockfs的网络文件系统,虚拟文件系统。


2. 网络文件系统的初始化:

initcall机制。

复用GCC编译器的功能,在__initcall_start到__initcall_end中存放内核的初始化函数地址。

Linux在启动时会执行init/main.c中的初始化函数kernel_init(),这个函数调用do_basic_setup(),从而调用do_initcalls()函数,其中遍历__initcall_start到__initcall_end的地址空间,循环调用do_one_initcall()函数执行所有的init初始化函数。

kernel_init()->do_basic_setup()->do_initcalls()->do_one_initcall()。


3. sock_init()函数:

在socket.c文件中。

core_initcall()函数将sock_init()函数登记到initcall中。

core_initcall(sock_init);

GCC编译时把sock_init()函数安装到initcall中。

驱动程序中常用的module_init注册用户自定义的初始化函数也是通过initcall来实现的。

内核初始化时会执行sock_init()函数来等级网络文件系统。

kernel_init()->do_basic_setup()->do_initcalls()->do_one_initcall()->sock_init()。

sock_init()函数主要将sock_fs_type变量登记到内核安装网络文件系统。

sock_init()创建一块用于网络文件节点和socket的高速缓存:

init_inodecache();

sock_init()将网络文件系统注册到Linux中:

register_filesystem(&sock_fs_type);

sock_init()进行网络文件系统的安装并建立安装点:

kern_mount(&sock_fs_type);


4. 安装过程:

内核调用sock_fs_type变量get_sb字段中存储的钩子函数(即函数指针)sockfs_get_sb(),由该函数完成网络文件系统的安装。

sock_init()->kern_mount()->中间过程从略->sockfs_get_sb()->get_sb_pseudo()。


5. get_sb_pseudo()函数:

第一个参数:sock_fs_type。

第二个参数:要求创建socket名称的根目录项,如:"socket:"。

第三个参数:关于网络文件系统的超级块操作函数表sockfs_ops。

最后一个参数:网络文件系统的安装点。


6. sockfs_ops变量:

网络文件系统的超级块操作函数表。

创建socket时会用到该函数表内容。

该函数表对网络文件系统的节点和目录提供了具体的操作函数。

涉及玩过文件系统的重要操作都会到该函数表中查找相应的操作函数。

Linux内核在创建socket节点时会查找sockfs_ops变量的alloc_inode字段,即sock_alloc_inode(),完成节点的建立。


原创粉丝点击