linux内核网络源码-用户空间与内核的接口

内核通过各种不同的接口把内部信息输出到用户空间,除了程序员用于请求特定信息的经典系统调用外,还有三个特殊接口,而其中两个是虚拟文件系统:

procfs 文件系统

这是一个虚拟文件系统,通过是挂在proc ,允许内核以文件的形式向用户空间输出内部信息,这些文件并没有实际存在于磁盘中,但是可以通过cat或more以及 shell重定向符予以写入。这些文件甚至可以像真实文件一样指定其访问权限。因此,创建这些文件的内核组建可以说明任何一个文件可由谁读取或者写入。目录则不能被写入。多数linux发行套件的默认内核都支持procfs.procfs不能编译成为一个模块。配置菜单中相关的内核选项为Filesysrtem=>pseudo filesystem=?proc file system support

sysctl

此接口允许用户空间读取或修改变量的值。不能用此接口对每个内核变量进行操作;内核应明确指出那些变量从此接口是可见的。从用户空间,你可以用两种方式访问sysctl输出的变量。一种是sysctl系统调用,而另一种是procfs。当内核支持procfs时,会在/proc中添加一个特殊目录/proc/sys为每个由sysctl所输出的内核变量引入一个文件。

procps 包随附的sysctl命令可用于配置由sysctl接口所输出的变量。此命令通过写入/proc/sys与内核对话。多数linux发行套件默认内核都支持sysctl。sysctl不能编译成为一个模块。配置菜单中相关的内核选项为General setup-> Sysctl support。

sysfs

procfs和sysctl已经被滥用了多年,这就导致引入了一种的文件系统:sysfs。sysfs 以非常干净而有组织的方式输出很多信息,如你所期望的,当前由sysctl所输出的部分信息可以移植到sysfs。 内核对sysfs的支持只是在2.6版本才开始。多数linux发行套件默认内核都支持sysfs。sysfs不能编译成为一个模块。配置菜单中相关的内核选项为Gernal setup _. configure standard kernel features 选项,才能看得到上述选项。

在O Reilly最新的《linux设备驱动程序》书中可以找到对应sysfs 的详尽分析。在第十七章中,我们将看到桥接代码如何使用sysfs。

你也可以使用下列接口吧命令传给内核,配置某事或者倾卸某事的配置内容。

ioctl 系统调用操作的对象是一个文件,通常是用于实现特殊设备所需但是标准文件系统没有提供的操作,你可以把socket系统调用返回的套接字描述符传给ioctl。而这也是忘了代码使用ioctl的方式,此接口也是由老一代命令所用,如ifconfig和route等。

netlink套接字

这是网络应用程序与内核通信时最新的首选机制,IPROUTE2包中大多数命令都使用此接口,对linux而言, netlink 代表的就是BSD世界中的路由套接字,多数网络内核功能都可以用Netlink或者ioctl接口进行配置,因为内核支持比较新的配置工具,以及老式工具。

profs与sysctl

procfs和sysfs 都输出内核内部信息,但是prcfs 主要是输出只读数据,而大多数sysctl 信息都是可写入的,但是只有超级用户能写入。

就输出只读数据而言,procfs和sysctl之间的选择依赖于有多少信息应该输出,与一个简单的内核变量或者数据结构相关的一些文件,可以用sysctl输出,其他涉及更为复杂的数据结构而且需要特殊格式时,就可以procfs输出,例如缓存和统计数据。

profs

大多数网络功能在其初始化时都会在/proc中注册一个或者多个文件,不是在引导时就是在模块加载时,当一位用户读取该文件时,会引起内核间接运行一组内核函数,以返回某种输出内容,网络代码所注册的文件位于/proc/net。

/proc 中的目录可以使用Proc_mkdir创建,/proc/net中的文件可以使用定义在Include/linux/proc_fs.h 中的proc_net_fops_create和proc_net_remove 予以注册和除名。

这两个函数都是包裹函数,其中含有通用的API,create_proc_entry和remove_proc_entry, 特别是,proc_net_fops_create负责创建文档 用proc-net_create, 然后初始化其文件操作处理函数。我们来看一个实例。

以下是ARP协议如何在/proc/net中注册其arp文件。

static struct file_operations arq_seq_fops =

{

.owner = THIS_MODULE,

.open = arq_seq_open,

.read = seq_read,

.llseek = seq_lseek

.release = seq_release_private

}

static int __init arq_proc_init(void)

{

if (!proc_net_fops_create("arp", S_IRUGO, &arq_seq_fops))

return 0;

}

由proc_net_fops_craete 的三个输入参数可知,文件名为arq,权限必须指定为只读,

而且该组文件操作处理例程是arq_seq_ops, 当一个用户读取文件时,使用file_operations 数据结构,允许procfs返回相当多的数据给用户,当数据由一群相同类型的对象组成时会很有用,例如,ARQ缓存在返回时一次只返回一项,而路由表在返回时一次只返回跳路径。

open所初始化的例程会做另一次重要的初始化;注册一个函数指针数组,包括procfs用于便利要传回给用户数据的所有例程;一个例程启动倾卸,另一个推进到一个项目,而另一个再倾卸以一个项目。这些例程内部负责保存必要的环境信息,这些信息会就是倾泄点以及从正确位置重新继续倾斜所必需的。

static struct seq_operations arq_seq_ops = {

start = clip_seq_start

next = neigh_seq_next

stop = neight_seq_stop

show = clip_seq_show

};

static int arq_seq_open(struct inode *inode, struct file *file)

{

rc = seq_open(file, &arq_seq_ops);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/3300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解Qt中的鼠标事件

在Qt中,处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数,允许开发者捕获鼠标的各种动作,如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项,并附带C代码示例。 基础使用方法…

GDB多线程调试:Redis的IO多线程

Redis采用的网络模型是单线程的Reactor网络模型,异步处理,因为性能很高。 Reactor先从客户端获取请求,然后dispatch给具体的执行的线程。处理的流程即为read->decode->compute->encode->send。 而Redis的IO多线程的处理时&…

【C++】:拷贝构造函数和赋值运算符重载

目录 一,拷贝构造函数1. 什么是拷贝构造函数2. 拷贝构造函数的特性3. 实践总结 二,赋值运算符重载2.1 运算符重载2.2 赋值运算符重载 一,拷贝构造函数 1. 什么是拷贝构造函数 拷贝构造函数是特殊的构造函数。是用一个已经存在的对象&#x…

什么是哈希表

为了解力扣第一题自学哈希表,做总结。 哈希函数的原理: 如果输入一个参数,那么哈希函数就会输出一个数字,并且不同的输入会有不同的输出,相同的输入会有相同的输出。例如: 苹果————89 苹果————…

SAP采购订单-条件类型-配置开发步骤

由于采购业务变更,需要创建新的价格类型,并添加新的计算逻辑计算。首先在例程(VOFM)中创建计算逻辑,然后在系统配置(SPRO)中找到配置点,创建新的条件类型‘ZMM00’,创建定价过程‘ZM…

SpringCloud系列(16)--将服务提供者Provider注册进Zookeeper

前言:在上一章节中我们说明了一些关于Eureka自我保护模式,而且自上一章节起关于Eureka的知识已经讲的差不多了,不过因为Eureka已经停更了,为了安全考虑,我们要用还在更新维护的注册中心来取代Eureka,而本章…

Flink面试(2)

Flink面试(1)-CSDN博客 9. Flink 状态如何存储? 在 Flink 中,状态存储 被叫做 StateBackend,它具备两种能力: 在计算过程中提供访问 State 能力,开发者在编写业务逻辑中能够使用 StateBacken…

Python IO流

1.什么是IO? IO(输入/输出)是计算机程序与外部世界进行数据交换的一种方式。在Python中,IO操作通常涉及文件、网络、标准输入和输出等。Python的IO操作可以分为两种类型:文本IO和二进制IO。 文本IO:用于读…

网络数据包嗅探器工具

组织的网络非常庞大,包含服务器、交换机、路由器和接入点等众多节点,由于许多资源和流量不断通过这些节点,因此很难确定大量流量是真实的还是安全攻击的迹象,了解和了解组织的网络流量至关重要,一个有用的资源是网络数…

MySQL--mysql的安装(压缩包安装保姆级教程)

官网下载:www.mysql.com MySQL :: Download MySQL Community Server (Archived Versions) 1.MySQL下载流程: 第一步:点击download, 下滑找到MySQL community(gpl)Downloads>> 第二步:点…

通俗易懂,十分钟让你了解并上手 Docker

通俗易懂,十分钟让你了解并上手 Docker 一、Docker 能拿来解决什么问题二、Docker 的概念与模型1. 容器化技术2. 镜像的概念3. Docker与虚拟机 三. Docker的使用1. 环境安装2. 制作镜像3. 镜像管理(1) 图形界面(2) 命令…

MySQL 8.0性能优化实战培训

课程介绍 【云贝独家】MySQL 性能优化进阶课程,引领你的职业巅峰! 同学们,你们是否被各种工作中的性能问题困扰?是否渴望提升自己在MySQL数据库方面的技术能力,掌握最新最前沿的技术知识呢? 我们讲师为你带…

深度学习中的黑科技:自监督学习(Self-Supervised Learning)

在人工智能领域,深度学习已成为推动技术革新的核心力量。然而,深度学习的一个重要瓶颈是对大量标记数据的依赖性。在这个背景下,自监督学习(Self-Supervised Learning, SSL)作为一种新兴的学习范式,越来越受到研究者的关注。自监督…

Java23种设计模式-创建型模式之工厂方法模式

工厂方法模式(Factory Method Pattern) 一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定将哪一个类实例化,从而将产品的实例化推迟到子类中。这种模式的主要角色包括: 角色1:抽…

内核技术解析

GitHub - floesen/KExecDD: Admin to Kernel code execution using the KSecDD driver https://security.stackexchange.com/questions/270383/how-does-the-av-inject-their-own-dll-in-each-new-process

spdlog 日志库部分源码说明——让你可以自定义的指定自动切换日志时间

前言 针对 网络上spdlog日志库目前存在的使用方式固定,不能发挥这个库本身应有价值的情况,这里对一些支持场景进行说明,以供初学者省去阅读源码的时间,直接上手使用 涉及源码 在说明过程中使用spdlog库自身提供的使用说明示例&…

Coursera: An Introduction to American Law 学习笔记 Week 03: Property Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 03: Property LawKey Property Law TermsSupplemental Re…

主从模式与AI大模型的结合

主从模式是一种分布式计算的模式,其中一个节点作为主节点负责接收和分发任务,其他节点作为从节点负责执行任务并将结果返回给主节点。AI大模型是指参数量非常庞大的人工智能模型,如深度学习的神经网络模型。 将主从模式与AI大模型结合可以实…

Revit二次开发环境Addin和Lookup配置快速上手教程

一、背景 经常有小伙伴被开发环境的配置难倒,总不能让这些兄弟倒在第一步吧,骑士特意做了一个傻瓜式的教学,希望对初学者有所帮助! 二、教程 Revit开发利器Addin和RevitLookup快速安装教学 https://www.bilibili.com/video/BV1…

vue实现弹窗的动态导入(:is=“dialogName“)

组件的动态挂载 弹窗aaa.vue <template><el-dialogwidth"700px "v-dialog-outdestroy-on-closev-if"dialogVisible":title"title":visible"dialogVisible":before-close"hideDialog":close-on-click-modal"…