`
diecui1202
  • 浏览: 96782 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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宏定义如下:
#define core_initcall(fn) __define_initcall("1",fn,1)

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

 

分享到:
评论

相关推荐

    Linux内核协议栈的详解完整版

    详解Linux协议栈的数据流向,SOCKET的操作流程,unicast multicast等等的区别。

    Linux内核网络栈源代码情景分析

    《Linux内核网络栈源代码情景分析》主要对Linux1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux...

    Linux内核网络栈源代码情景分析.pdf

    本书主要对 Linux 1.2.13 内核协议栈的全部源代码做了详细的分析, 该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握 Linux 网络协议结构。...

    LINUX-1.2.13内核网络栈实现.pdf

    本书主要对Linux 1.2.13内核协议栈的全部源代码做了详细的分析,该版本所有代码都在一个文件夹中,每种协议的实现都只有一个文件与之对应,分析该版本源代码可以方便读者迅速掌握Linux网络协议结构。 本书共分为5个...

    linux内核协议栈的实现

    很详细的一个原理图,看明白之后对linux网络协议栈有很深的理解和认知,有关socket、ip报文、ip分片、转发、桥等图解

    linux 内核 socket相关的协议栈初始化

    文章详细介绍了linux 内核中有关socket 相关的协议栈的初始化部分。文章中各个函数调用关系清晰,重要代码逻辑都有中文注释及中文旁白解释。是一篇很好的学习linux 内核网络子系统的文章。

    LinuxKernelNetworkProtocolStack:linux内核网络协议栈源码阅读-源码网

    准备将readme.md作为笔记,记录linux内核网络协议栈源码剖析的过程 天2,2016年11月18日20:24:07 增加了对sys_socket(), sock_create, __sock_create(), inet_create()的完全注释 socket的创建过程已经完成,接下来...

    Linux 蓝牙协议栈的USB+设备驱动

    摘 要:基于对Linux 下蓝牙协议栈BlueZ 源代码的分析,给出BlueZ的组织结构和特点。分析蓝牙USB 传输驱动机制和数据处理过程, 给出实现蓝牙设备驱动的重要数据结构和流程,并总结Linux 下开发蓝牙USB 设备驱动的...

    linux网络编程-宋敬彬-part3

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    linux网络编程-宋敬彬-part2

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    理解Linux网络栈(1):Linux网络协议栈简单总结

    (1)Socket应用层的各种网络应用程序基本上都是通过LinuxSocket编程接口来和内核空间的网络协议栈通信的。LinuxSocket是从BSDSocket发展而来的,它是Linux操作系统的重要组成部分之一,它是网络应用程序的基础。从...

    深入分析Linux内核源码

    12.2 网络协议 12.2.1 网络参考模型 12.2.2 TCP/IP 协议工作原理及数据流 12.2.3 Internet 协议 12.2.4 TCP协议 12.3 套接字(socket) 12.3.1 套接字在网络中的地位和作用 12.3.2 套接字接口的种类 12.3.3 ...

    linux网络编程-宋敬彬-part1

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    Linux协议栈阅读笔记

    网络协议栈的实现基本采用TCP/IP的四层架构(链路、网络、传输、应用)。不过在实际学习中通常讲到的是5层架构(物理、链路、网络、传输、应用)。  BSD风格 BSD风格就是通常说的 socket、bind、connect、listen、...

    linux_kernel_netstack_reading:linux kernel-4.17协议栈源码阅读,阅读linux kernel 4.17 netstack,一旦开始体验可以从内核资源中获得的丰富见解,就很难摆脱Linux的迷恋-linux

    linux内核协议栈源码阅读有任何理解错误的地方,还望指出linux官网 目标理解tcp / ip的协议栈,结合RFC和代码加深理解。微信群想一起阅读的小伙伴可以加我微信sheepbao-520 ,加入阅读群,备注阅读linux ...

    追踪Linux.TCP/IP代码运行:基于2.6内核

    《追踪Linux TCP/IP代码运行·基于2.6内核》以应用程序为线索,详细描述了数据包在协议栈的分段、重组、发送、接收过程,同时分析了路由的初始化和设置过程,主要包括socket应用程序、TCP/IP协议、路由、通知链、...

    ZeroMQ一个强大的Socket库

    ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装。ZMQ让编写高性能网络应用程序...

    嵌入式Linux C编程入门(第2版) PPT

    第1章 嵌入式系统基础知识 .1 1.1 嵌入式系统概述 1 1.1.1 嵌入式系统的发展史 2 1.1.2 嵌入式系统的定义与特点 3 1.1.3 嵌入式系统的特点 4 1.2 嵌入式系统的组成 5 1.2.1 嵌入式系统的硬件架构...

    追踪Linux TCPIP代码运行完整pdf扫描版

    《追踪Linux TCP/IP代码运行·基于2.6内核》以应用程序为线索,详细描述了数据包在协议栈的分段、重组、发送、接收过程,同时分析了路由的初始化和设置过程,主要包括socket应用程序、TCP/IP协议、路由、通知链、...

Global site tag (gtag.js) - Google Analytics