第10章 无持久存储的文件系统 (3)

news2024/11/16 2:38:01

目录

10.2 简单文件系统

10.2.1 顺序文件

10.2.2 用libfs编写文件系统

10.2.3 调试文件系统

10.2.4 伪文件系统

10.3 sysfs

10.3.1 概述

10.3.2 数据结构

10.3.3 装载文件系统

10.3.4 文件和目录操作

10.3.5 向sysfs添加内容

10.4 小结


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

10.2 简单文件系统

如:libfs,seq_file,debugfs。

10.2.1 顺序文件

读写 proc 文件时,默认只使用一页内存。若proc文件太大,则用 seq_file。

seq_file优点:

        不需要开发者直接管理保存数据的内存缓冲区。

        简化了向用户空间输出内核数据。

1. 编写顺序文件处理函数

proc_create("netlink",   0,   net->proc_net,   &netlink_seq_fops);

struct   file_operations    netlink_seq_fops   =   {

        .open    =    netlink_seq_open,

        .read    =    seq_read,

                //将调用struct   seq_operations 中 start,next,stop,show等函数指针。

        .llseek  =    seq_lseek,

};

struct   seq_operations   netlink_seq_ops   =   {

        .start    =    netlink_seq_start,         //开始读数据项。

        .stop    =    netlink_seq_stop,         //停止数据项。

        .next    =    netlink_seq_next,         //遍历下一个要处理的数据项。

        .show   =    netlink_seq_show,         //打印数据项到临时缓冲区。

};

若 file_operations 中 .llseek   =   no_llseek() ;

        表示设备无法seek。

Kprobe介绍:

        作用:

                1. 内核调试。

                2. 收集内核和应用程序的性能信息,如函数执行时间、调用次数等。

        原理:

                在指定函数中插入探测点,可在探测点前或探测点后执行对应回调函数。

        注意:

                需要硬件架构支持。

struct   kprobe   {

        kprobe_opcode_t            *addr;                      // 探测点位置。

        kprobe_pre_handler_t     pre_handler;           // 探测指令被执行前的回调。

        kprobe_post_handler_t    post_handler;         // 探测指令执行完毕后的回调。

        kprobe_fault_handler_t    fault_handler;         // 当内存访问出错时被调用。

}

struct   file_operations    debugfs_kprobes_operations   =   {

        .open     =    kprobes_open,

        .read      =    seq_read,

        .llseek    =    seq_lseek,

        .release  =    seq_release,

};

struct    seq_operations    kprobes_seq_ops   =   {

        .start    =   kprobe_seq_start,

        .next    =   kprobe_seq_next,             // 偏移+1=索引+1。

        .stop    =   kprobe_seq_stop,             // 什么也不做。

        .show   =  show_kprobe_addr,        // 生成文件内容。

};

int   kprobes_open(struct   inode    *inode,    struct   file    *filp)

{

        return    seq_open(filp,   &kprobes_seq_ops);

}

Kprobe将事件发生时将相关数据记录到文件中。

举例:

使用Kprobe跟踪网络流量。

        1. 跟踪TCP连接事件:

                使用Kprobe在内核TCP连接函数中插入断点,当TCP连接建立或关闭时,将信息记录到顺序文件中。

                记录的信息包括:源地址、目标地址、连接建立 / 关闭时间戳等。

        2. 跟踪收发包:

                在收发包函数中插入断点,当有数据传输时,记录相关信息到顺序文件中。

                记录的信息包括:源地址、目标地址、数据包大小、协议类型等信息。

Jprobe:Kprobe一个扩展。

编程举例:

struct   jprobe    tcp_conn_open_probe   =   {

        .entry   =   (kprobe_opcode_t *) tcp_conn_open,         //自定义的断点处理函数。

        .kp       =     {

                .symbol_name     =    "tcp_v4_connect",             //需要跟踪的内核函数。

        },

};

struct   jprobe    tcp_conn_close_probe   =   {

        .entry    =    (kprobe_opcode_t *) tcp_conn_close,

        .kp        =     {

                .symbol_name    =   "inet_csk_destroy_sock",

        },

};

int    tcp_conn_init(void)

{

        register_jprobe( &tcp_conn_open_probe );

        register_jprobe( &tcp_conn_close_probe );

}

void   tcp_conn_exit(void)

{

        // 取消注册Kprobe

        unregister_jprobe(&tcp_conn_open_probe);

        unregister_jprobe(&tcp_conn_close_probe);

}

10.2.2 用libfs编写文件系统

libfs:一个库,用于创建特定用途的小型文件系统,适合无后备存储器。

编程举例:

struct   file_operations    simple_dir_operations   =   {

        .open         =    dcache_dir_open,

        .release     =   dcache_dir_close,

        .llseek        =   dcache_dir_lseek,

        .read          =   generic_read_dir,

        .readdir      =   dcache_readdir,

        .fsync         =   noop_fsync,

};

struct   inode_operations    simple_dir_inode_operations = {

        .lookup   =   simple_lookup;

};

10.2.3 调试文件系统

DebugFS:

        原理:

                基于libfs实现。

        使用场景:

                快速查看或修改模块/内核的变量,无需重新编译内核或模块。

        对应目录:

                /sys/kernel/debug

        编译选项:

                CONFIG_DEBUG_FS

        编程接口:

                debugfs_kprobe_init

                debugfs_create_file

                debugfs_create_dir

                debugfs_create_symlink

10.2.4 伪文件系统

如:bdev文件系统。

bdev作用:

        集群块设备所有的inode,只有内核可见。

struct   file_system_type     bd_type   =   {

        .name     =    "bdev",

        .mount    =    bd_mount,

        .kill_sb    =    kill_anon_super,

}

struct   dentry    *bd_mount(struct   file_system_type    *fs_type,    int    flags,    char    *dev_name,  void    *data)

{

        return    mount_pseudo(fs_type,   "bdev:",   &bdev_sops,   NULL,   BDEVFS_MAGIC);

}

10.3 sysfs

作用:

        向用户层导出内核对象。

        显示kobject拓扑。

        提供装载点/sys。

10.3.1 概述

kobject被层次化组织。

如果一个kobject没有父对象,将其放置到所在kset所属的kobject对应目录中。

每个kobject表示sysfs中一个目录。而attribute表示sysfs中一个文件。

kobject_add函数

        作用:导出kobject到sys文件系统。

10.3.2 数据结构

属性:

struct   attribute    {         //代表sysfs中一个文件

        const char         *name;

        umode_t            mode;          //文件访问权限。

};

10.3.3 装载文件系统

struct   file_system_type    sysfs_fs_type   =   {

        .name    =   "sysfs",

        .mount   =   sysfs_mount,

        .kill_sb   =   sysfs_kill_sb,

};

sysfs_mount -> sysfs_fill_super

创建根目录的inode

int  sysfs_fill_super(struct super_block   *sb,    void  *data,    int  silent)

{

        inode   =   sysfs_get_inode(sb,   &sysfs_root);

        //inode->i_fop   =   &sysfs_file_operations;

}

sysfs_file_operations:后续介绍

10.3.4 文件和目录操作

struct  file_operations    sysfs_file_operations   =   {

        .read   =   sysfs_read_file,

                //调用ops->show(kobj, attr_sd->s_attr.attr, buffer->page);

        .write   =   sysfs_write_file,

        .open   =   sysfs_open_file,

}

struct   kobj_type   brport_ktype   =   {

        .sysfs_ops   =   &brport_sysfs_ops,

};

ops->show();为不同文件自定义,如/sys/bridge

struct   sysfs_ops   brport_sysfs_ops   =   {

        .show   =   brport_show, //调用brport_attr->show(p, buf);

        .store   =   brport_store,

};

而 brport_attr->show(p,   buf); 是/sys/bridge下不同文件各自定义的,如:

BRPORT_ATTR(multicast_router,   S_IRUGO | S_IWUSR,   show_multicast_router,   store_multicast_router)

10.3.5 向sysfs添加内容

struct   kobj_attribute   {

        struct attribute         attr;         //包括文件名,文件权限。

        ssize_t (*show)(struct kobject  *kobj,   struct kobj_attribute  *attr,  char  *buf);

        ssize_t (*store)(struct kobject  *kobj,   struct kobj_attribute  *attr,   const char  *buf,   size_t count);

};

10.4 小结

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

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

相关文章

Node.js及mysql的安装,建立页面,javascript对mySQL数据库的操作过程

具体动态效果看视频 node.js连接MySQL数据库操作 第一部分;配置服务器环境 Nods.js, NPM,CNPM,mysql2,express的安装 前往 Node.js 官方网站(https://nodejs.org/)下载并安装最新的稳定版本,确定配置好path环境变量,其…

Linux网络环境搭建,开发板网线直连电脑网口,电脑WIFI上网

开发板网线直连电脑网口(电脑自带,一般有PCI,不是USB网卡),电脑WIFI上网 因为电脑是 WiFi 上网,所以需要添加一个网络适配器并设置成 NAT 模式,供虚拟机上网。 设置双网卡,注意双网卡…

SQL 时间盲注 (injection 第十五关)

简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…

visual studio使用技巧:快速生成Json、XML对应类

visual studio快速生成Json、XML对应类 在项目中经常用到json或者xml作为配置文件,进行序列化和反序列化就需要有对应的类,重新写一遍类就比较麻烦,这里就讲一下通过visual studio快速生成json或者xml对应类型的方法。 自动生成Json类 复制…

大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【Python】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

【Python】成功解决AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘ 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博…

MySQL集群+Keepalived实现高可用部署

Mysql高可用集群-双主双活-myqlkeeplived 一、特殊情况 常见案例:当生产环境中,当应用服务使用了mysql-1连接信息,在升级打包过程中或者有高频的数据持续写入【对数据一致性要求比较高的场景】,这种情况下,数据库连接…

STM32之继电器与震动传感器的使用,实现震动灯

在STM32的外设应用中,继电器扮演着重要的角色。继电器作为一种电控制器件,其主要作用是通过小电流控制大电流的通断,实现电路的自动控制和保护。具体来说,继电器在STM32外设中的作用可以归纳为以下几点: 电路隔离与保…

在线学习考试设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家,服务很多代码文档,百分百好评,战绩可查!!入职于互联网大厂,可以交流,共同进步。有保障的售后 代码参考数据库参…

“CSS”第一步——WEB开发系列13

CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css。 一、什么是 CSS&a…

ubuntu x86_64系统上安装运行aarch系统的虚拟机

安装qemu-system-aarch64 创建sda.qcow2 虚拟磁盘 运行命令启动虚拟机 sudo qemu-system-aarch64 -M virt-4.0 -m 4G -cpu cortex-a57 -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -cdrom ~/下载/openEuler-24.03-LTS-aarch64-dvd.iso -drive ifnone,filesda.qcow2,idhd0…

王老师 linux c++ 通信架构 笔记(五)编译后生成的 nginx 可执行程序的启动

(22) 启动 nginx : 上网测试一下: 端口号 介绍: (23) 因为 nginx 监听知名端口号 80 ,http 服务。也可以知名端口号,格式如下: 生产环境下可以设置 ngi…

Pulsar官方文档学习笔记——架构概览

架构概览 在最高配置下,pulsar服务应该由一个或多个pulsar集群组成。 一个pulsar集群可以包括如下组件 一个或多个broker。broker会将生产者 的消息分派给消费者。与pulsar配置存储通信来协调各种任务。将消息 存储在 BookKeeper实例中 (也可以叫book…

计算机毕业设计选什么题目好?springboot 基于Java的学院教学工作量统计系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

java生成随机数字,生成随机ID

java在代码中生成随机数字和ID的两个方法 import java.util.UUID; import java.util.Random; public class randomID {public static void main(String[] args) {// TODO Auto-generated method stubUUID uuid UUID.randomUUID();String randomId uuid.toString();System.ou…

Qt自定义控件之提升法

1、参考:Qt之实现自定义控件的两种方式——提升法 2、概述:自定义控件是常需要使用到的技能,在既有的Qt控件不能满足开发的前提下,自定义控件给了程序员很多的发挥空间和便利。自定义控件有两种方式,一种是通过提升法来…

记录win10下 yolov8 tensorrt模型部署

前言 我的环境是 CUDA11.6 cudnn8.4 python3.8 vs2022 tensorRT8.4.2.4 实现 参考了下面这个视频和文章(跟着视频做为主,文章为辅)一遍成功,因为这个博主写的很详细,很赞,我就不再重复去写了。 视频&…

C++ Primer 总结索引 | 第十八章:用于大型程序的工具

1、大规模应用程序的特殊要求包括: 在独立开发的子系统之间 协同处理错误的能力使用各种库(可能包含独立开发的库)进行 协同开发的能力对比较复杂的应用 概念建模的能力 对应 异常处理、命名空间和多重继承 1、异常处理 1、异常处理机制 …

【算法】令牌桶算法

一、引言 令牌桶算法(Token Bucket Algorithm, TBA)是一种流行于网络通信领域的流量控制和速率限制算法。它允许一定程度的突发传输,同时限制长时间内的传输速率。令牌桶算法广泛应用于网络流量管理、API请求限流等场景。其基本原理是通过一个…

vue3 响应式 API:computed()

介绍 基本概念: computed()接收一个 getter 函数或者一个包含 getter 和 setter 函数的对象作为参数,并返回一个基于原始响应式数据计算得到的新的响应式数据对象。计算属性的值会根据其依赖的响应式数据自动更新,当依赖的数据发生变化时&am…