`
diecui1202
  • 浏览: 98958 次
  • 性别: 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-1.2.13 网络协议栈源码

    在Linux内核中,网络协议栈是负责处理网络数据传输的关键部分,它实现了TCP/IP协议族的各个层次,包括链路层、网络层、传输层以及应用层。 1. 链路层:在这个层次,主要涉及的是以太网协议,如Ethernet和ARP(地址...

    linux内核协议栈源码解析(2.6.18内核)

    《Linux内核协议栈源码解析(2.6.18内核)》是一本针对Linux内核网络协议栈深入解析的重要参考资料,尤其适合那些希望深入理解Linux内核以及网络通信机制的IT专业人士。该书详细阐述了Linux 2.6.18版本内核中的网络...

    Linux网络体系结构 Linux内核中网络协议的设计与实现

    Linux内核通过socket API为上层应用提供了与网络协议栈交互的接口。 在设计与实现方面,Linux内核的网络协议栈采用了模块化和层次化的结构,使得代码易于维护和扩展。例如,协议处理函数可以通过注册和注销机制动态...

    linux内核协议栈分析

    Linux内核协议栈是Linux操作系统中负责处理网络数据包传输的核心组件。...通过文档的阅读,可以为研究和开发人员提供参考,帮助他们理解网络数据包在网络协议栈中的处理流程以及在Linux内核中的具体实现。

    linux-2.6.18内核基础上分析网络协议栈,适合初学者看

    在Linux操作系统中,网络协议栈是其核心组件之一,它负责处理系统与外界的网络通信。对于初学者来说,理解Linux-2.6.18内核中的网络协议栈至关重要,因为这能帮助他们深入理解数据在网络中的传输过程。本文将基于这...

    《linux内核网络栈源代码情景分析》.(曹桂平).[PDF].&ckook;.pdf.zip

    《Linux内核网络栈源代码情景分析》是曹桂平撰写的一本深入解析Linux内核网络处理机制的著作。这本书详细介绍了Linux操作系统如何处理网络数据包,从硬件接口到高层协议栈的每一个环节,帮助读者理解Linux网络内核的...

    基于Linux网络协议栈的嵌入式开发

    3. **集成到Linux内核中**:将VSP协议栈作为模块加载到Linux内核中,确保它与现有的网络协议栈兼容并行。 4. **测试与优化**:进行详尽的测试以确保新协议栈的稳定性和性能,根据测试结果进行必要的调整和优化。 ##...

    Linux内核1.2.13网络协议栈初始化及源码剖析

    主要涵盖了Socket编程基础知识和Linux内核网络协议栈的工作方式,其中包括协议实现模块和网络设备驱动的初始化过程;探讨了数据链路层的功能,以及客户端、服务器的简单Socket程序和多线程并发模型的设计与注意事项...

    linux-网络协议栈流程.pdf

    Linux内核中的网络驱动负责与物理网络设备交互,接收网络帧并将其传递给上层的网络协议栈。这一过程涉及中断处理和DMA(Direct Memory Access)等技术,以确保数据能高效地从网络设备传输到内存中。 接着,数据包在...

    Linux TCP IP 协议栈分析

    - 虚拟文件系统(VFS)是Linux内核的一部分,它为不同的文件系统提供了一个统一的接口,使得用户可以透明地访问不同的文件系统。 - **网络协议栈各部分初始化** - **网络基础系统初始化** 包括初始化网络相关的...

    Linux内核 tcp ip协议栈源码分析

    总之,《Linux内核TCP/IP协议栈源码分析》是一个深入理解网络通信、优化系统性能的重要课题。通过对源码的研读,我们可以更有效地排查网络问题,理解和设计高效的网络应用程序,并为未来的网络技术发展打下坚实基础...

    深入分析linux tcp/ip协议栈

    Linux TCP/IP协议栈是Linux操作系统核心中的重要组成部分,它负责处理网络通信,使得系统能够进行数据包的发送和接收。本篇文章将深入探讨Linux TCP/IP协议栈的工作原理、主要组件以及其在源码层面的实现细节。 ...

    Linux内核TCP-IP协议栈分析.rar

    Linux内核中的TCP/IP协议栈是操作系统的心脏,负责处理所有网络通信。它是一套复杂的软件,用于实现互联网协议族,使得Linux系统能够与其他设备进行数据传输。在本资料"Linux内核TCP/IP协议栈分析"中,我们将深入...

    linux网络协议栈完全实现

    在这个主题中,我们将深入探讨Linux内核中的网络协议栈实现,包括TCP/IP协议族的主要组件和工作流程。 首先,我们要理解TCP/IP协议族是一个四层模型,包括应用层、传输层、网络层和数据链路层。在Linux中,这些层...

    linux内核图解-linux内核图解

    Linux内核是操作系统的核心部分,它负责管理系统的硬件资源,调度进程,以及提供系统调用接口等关键功能。本文将深入探讨Linux内核的主要组成部分、工作原理及其在系统中的作用。 1. 内核架构 Linux内核采用微内核...

    Linux下协议栈源码分析

    《Linux2.6协议栈源代码分析》是一本深入解析Linux内核网络协议栈的专著,主要关注于Linux 2.6版本的协议栈实现细节。该书不仅对网络协议栈进行了全面的介绍,还详细分析了其源代码,对于想要深入了解Linux网络编程...

    linux 内核精髓-精通linux内核必会的75个绝技

    6. **网络编程**:涵盖网络协议栈,从网络接口层到应用层,包括TCP/IP协议、套接字编程、网络服务的实现,以及socket选项和错误处理。 7. **系统调用与内核接口**:解析系统调用的原理,讲解如何利用strace等工具...

    Linux协议栈初步分析之路由子系统

    在 Linux 内核初始化过程中,系统会调用 kernel_init() 函数,该函数会初始化系统的核心组件,包括网络协议栈。Early Initialization 阶段主要完成了网络协议栈的基础初始化工作,包括 sock_init()、proto_init() 等...

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

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

Global site tag (gtag.js) - Google Analytics