当前位置: 首页 > news >正文

linux内核 devtmpfs介绍

文章目录

    • 概要
    • 整体架构流程
    • 技术细节

概要

提示:这里可以添加技术概要
linux内核中 devtmpfs实现介绍
内核版本:5.10

Devtmpfs在Linux中是一个特殊的设备文件系统,主要用来linux内核中加速启动过程和管理设备节点。高版本的linux基本都是使用devtmpfs来管理设备节点。

devtmpfs(device temporary file system)是在 Linux 内核 2.6.33 版本中引入的。 devtmpfs 的引入是为了简化设备节点的创建过程,并且减少对用户空间程序(如 udev)的依赖,使得设备节点能够在系统启动早期就可用。

整体架构流程

代码流程如下:

devtmpfs是和tmpfs类似,是存在内存中的,不会存储到硬盘,主要功能是:创建和删除设备节点(mknod)

技术细节

在这里插入图片描述

1,初始化:
devtmpfs_init
vfs_kern_mount(&internal_fs_type, 0, “devtmpfs”, opts);
register_filesystem(&dev_fs_type); // 注册文件系统
kthread_run(devtmpfsd, &err, “kdevtmpfs”); //创建kthread处理setup和loop。

Devtmpfs初始化时候先vfs_kern_mount产生一个挂载点描述结构vfsmount mnt结构,然后注册dev_fs_type文件系统,最后再创建devtmpfsd的kthread。

2,devtmpfsd线程代码:
Devtmpfsd
devtmpfs_setup
devtmpfs_work_loop();

Devtmpfsd会先调用devtmpfs_setup函数挂载devtmpfs到 “/” 目录,然后进入work_loop,等待请求去创建和删除设备文件。

创建/删除设备文件接口:
devtmpfs_create_node
devtmpfs_delete_node

在内核启动init进程(systemd)后,由systemd将devtmpfs挂载到 /dev 目录。

线程实现细节:
有一个全局的 requests 结构来接收发送的请求,这个结构是个 链表,新的请求将插入头部,request指向当前设置的req,然后唤醒等待的处理线程,等待处理完成。
线程处理会加自旋锁然后 一次性将链表中所有请求 处理完成。提交请求和处理请求均有加锁操作spin_lock。

static struct req {struct req *next;struct completion done;int err;const char *name;umode_t mode;	/* 0 => delete */kuid_t uid;kgid_t gid;struct device *dev;
} *requests; //链表  从头部加数据   线程处理一次性将链表中所有请求处理完成static int devtmpfs_submit_req(struct req *req, const char *tmp)
{init_completion(&req->done);spin_lock(&req_lock);req->next = requests;requests = req;spin_unlock(&req_lock);wake_up_process(thread);wait_for_completion(&req->done); //等待请求完成kfree(tmp);return req->err;
}static void __noreturn devtmpfs_work_loop(void)
{while (1) {spin_lock(&req_lock);while (requests) {struct req *req = requests;requests = NULL;spin_unlock(&req_lock);while (req) {struct req *next = req->next;req->err = handle(req->name, req->mode,req->uid, req->gid, req->dev);complete(&req->done);// 完成请求req = next;}spin_lock(&req_lock);}__set_current_state(TASK_INTERRUPTIBLE);spin_unlock(&req_lock);schedule();}
}

并不是所有的device都会创建设备节点
只有分配设备号的设备会创建,net设备不会创建
在这里插入图片描述
设备节点(dev目录下的设备文件)本质是由vfs_mknod创建
字符设备c和块设备b文件,fifo和socket文件也是vfs_mknod实现。
在这里插入图片描述

小结
以上介绍了devtmpfs基本概念和实现细节,有需要可以参考devtmpfs的单线程req实现内核线程相关操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【学习资料】袋中共36个球,红白黑格12个,问能一次抽到3个红4个白5个黑的概率是多少?
  • springboot家政服务管理系统—计算机毕业设计源码34242
  • 苹果CMS插件:优化蜘蛛访问内容,提升百度收录率
  • 设计模式之外观设计模式
  • 基于菜鸟教程的flask学习记录 —— Flask视图函数
  • 零基础考过软考信息系统项目管理师经验分享
  • saltstack高级用法
  • MATLAB基础:5脚本与函数
  • 鸿萌数据恢复服务:Synology Hybrid RAID 的容错、优势和数据恢复
  • 【Java算法】二叉树的深搜
  • 数据结构修炼——顺序表和链表的区别与联系
  • 【目标检测】labelimg图像标注软件的使用流程
  • Vue3:reactive丢失响应式,数据有更新但表单没有更新
  • 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
  • Python模块和包:标准库模块(os, sys, datetime, math等)②
  • angular组件开发
  • create-react-app项目添加less配置
  • ES6之路之模块详解
  • iOS小技巧之UIImagePickerController实现头像选择
  • Javascript编码规范
  • js如何打印object对象
  • js作用域和this的理解
  • spring boot下thymeleaf全局静态变量配置
  • vue-router的history模式发布配置
  • webpack+react项目初体验——记录我的webpack环境配置
  • yii2中session跨域名的问题
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 复杂数据处理
  • 关于Java中分层中遇到的一些问题
  • 基于Android乐音识别(2)
  • 记一次和乔布斯合作最难忘的经历
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端技术周刊 2019-02-11 Serverless
  • 我有几个粽子,和一个故事
  • 《码出高效》学习笔记与书中错误记录
  • #{}和${}的区别是什么 -- java面试
  • #Z2294. 打印树的直径
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (12)Hive调优——count distinct去重优化
  • (2)空速传感器
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (27)4.8 习题课
  • (第61天)多租户架构(CDB/PDB)
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)Linux Shell编程——输入输出重定向
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .NET : 在VS2008中计算代码度量值
  • .net 发送邮件
  • .NET 中创建支持集合初始化器的类型
  • .net开发日常笔记(持续更新)