32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
背景
接上篇wiki
31、【OS】【Nuttx】OSTest分析(1):stdio测试(一)
继续stdio测试的分析,上篇讲到标准IO端口初始化,单从测试内容来说其实很简单,没啥可分析的,但这几篇分析的 wiki 会另辟蹊径,从文件系统的角度进行分析标准IO端口的初始化过程,后续再分析文件系统的时候,相关知识点会直接引用这几篇wiki,重复内容不会再出现
标准IO端口初始化
之前介绍了文件系统中 filelist 队列,下面分析 filelist 队列里面的核心成员 fl_files
file 结构体
之前wiki说过,核心成员 fl_files 为一个二维数组指针,指向了存放文件实例的内存区域,用户通过文件描述符 fd 可以索引到对应的文件实例,索引方法为 fl_files[fd / BLOCK_SIZE][fd % BLOCK_SIZE]

必选成员
核心成员 fl_files 的类型定义如下,首先看里面的4个必选成员 f_oflags,f_pos,f_inode,f_priv,其中核心成员的是 f_inode,f_inode 体现了文件系统中拓扑结构:

- f_oflags:文件的打开模式标志,决定了文件可以如何被访问(比如只读只写,可读可写,创建文件等等),解释起来比较绕,可以直接来看这个标志都支持哪些模式。 查看其模式定义如下,其中大部分模式是基于 POSIX 标准的,只有少数几个是Nuttx独有的,比如 O_RDOK,O_WROK(应该是拿来做兼容的),这意味着大部分这些打开模式,在类Unix系统,比如Linux中也存在

- f_pos:文件偏移量,表示文件当前的读写位置,对顺序读取和写入很重要,有几个关键点:
1、初始值:当文件首次打开时,f_pos 通常被初始化为 0,表示文件的开头;如果文件以追加模式打开(如上面模式定义的O_APPEND),那在每次写入之前,f_pos 会被自动设置为文件末尾,这点代码也能看出来

2、文件读取:从文件读数据时,f_pos 指定了从哪个字节开始读。每次成功调用读取函数(如 host_read()),f_pos 会自动增加所读取的字节数,这点随便找一个文件系统就能看出来,比如hostfs

3、文件写入:和文件读取一样,在写数据到文件时,f_pos 确定了数据应该被写入的位置。每次成功调用写入函数(如 host_write()),f_pos 也会相应地增加

- f_inode:file 类型中的核心成员,体现了文件系统中拓扑结构,在 Nuttx 中,每个文件和目录都有一个对应的inode。这个特定的 inode 包含了描述文件或目录所需的信息,它包含了文件的元数据,比如节点名字,层次关系、操作函数、时间戳等,在文件系统内部使用,用户通常不会直接与之交互。用户一般通过标准的文件系统API(如open, read, write等)来间接操作该数据结构。如下图所示,当用户想要注册一个文件C时,其路径为 /A/B/C,此时文件系统会自动创建三个节点:A/B/C,B/C,C,其中 A/B/C 是 B/C 的父节点,B/C 是 C 的父节点,且 A/B/C 和 /B/C 均为目录节点,C 为文件节点,最终在 C 节点上添加更详细的节点信息,如名字,操作函数等。

- f_priv:每次打开文件时特有的私有数据(注意:inode 中也有 i_private 成员,两者的差别在于,f_priv 为每个单独的实例用户提供私有空间,以保存仅对该次打开有效的数据,i_private 为整个 inode 节点的提供全局性私有数据),如图所示,不同用户可以通过不同的文件实例,操作同一个节点:

可选成员
下面来看下 file 类型的可选成员,可选成员通过配置项来决定是否启用,有 f_refs,f_tag_fdsan,f_tag_fdcheck,f_backtrace,locked 等五个成员

- f_refs:通过使用方式可以看到该成员为原子变量类型,用来追踪引用该文件结构的次数,以实现文件共享访问,确保所有对该文件的引用都消失时,再安全地释放资源。

在多核环境中,不同进程或线程可能需要同时访问同一个文件,这种共享访问须确保安全性和一致性。当用户打开一个文件时,实际上是通过文件描述符来操作文件实例,而此时另一用户也可通过相同的文件描述符来操作该文件实例。
f_refs 成员作为原子类型的引用计数器,记录有多少个用户正在引用该文件实例,每当一个新用户打开该文件时,引用计数增加;而当用户关闭该文件时,引用计数减少,当所有用户都关闭了该文件时,Nuttx 才会认为可以安全清理和释放该文件实例下的相关资源(如内存、缓冲区等)。

- f_tag_fdsan:英文全名 sanitizer ,一种并发编程中的检测工具,tsan 和 asan 比较常见
1、tsan(thread sanitizer ) 用来检测并发编程中的数据竞争和死锁等问题
2、asan(address sanitizer )用来检测内存越界、内存泄漏、使用已释放内存等问题
3、fdsan(file description sanitizer )用来检测和防止文件描述符的误用问题
具体来说,有如下检测场景:
一、防止文件实例被重复打开:可以看到,每当打开一个新文件时,f_tag_fdsan 将被 android_fdsan_exchange_owner_tag 设置成一个非0值,如果还有用户尝试打开该文件时,此时由于 f_tag_fdsan 非0,Nuttx 将进入 PANIC 恐慌


流程图如下:

二、防止文件被重复关闭:同样的,当关闭文件实例后,f_tag_fdsan 将被重新设置为0,此时由于 f_tag_fdsan 为0,如果还有用户尝试关闭该文件时,Nuttx 将进入 PANIC 恐慌


- f_tag_fdcheck:用来保证文件描述符的唯一性,设计很巧妙,下一篇wiki分析
- f_backtrace:用来跟踪打开文件的用户是谁
- locked:对具体的文件操作进行上锁,防止并发竞争
相关文章:
32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 继续stdio测试的分析,上篇讲到标准IO端口初始化,单从测试内容来说其实很简单,没啥可分析的,但这几篇…...
git push到远程仓库时无法推送大文件
一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…...
Vue.js路由管理与自定义指令深度剖析
Vue.js 是一个强大的前端框架,提供了丰富的功能来帮助开发者构建复杂的单页应用(SPA)。本文将详细介绍 Vue.js 中的自定义指令和路由管理及导航守卫。通过这些功能,你可以更好地控制视图行为和应用导航,从而提升用户体验和开发效率。 1 自定义指令详解 1.1 什么是自定义…...
NVIDIA GPU介绍:概念、序列、核心、A100、H100
概述 入职一家大模型领域创业公司,恶补相关知识。 概念 一些概念: HPC:High Performance Computing,高性能计算SoC:System on Chip,单片系统FLOPS:Floating Point Operations Per Second&am…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
C语言练习(31)
有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…...
什么是长短期记忆网络?
一、概念 长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门(输入门、遗忘门和输出门)…...
git中有关old mode 100644、new mode 10075的问题解决小结
在 Git 版本控制系统中,文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时,这通常表示文件的权限发生了变化。本文将详细解析这种情况,并提供解决方法和注意事项。 问题背景 在 Git 中,文…...
Jenkins上生成的allure report打不开怎么处理
目录 问题背景: 原因: 解决方案: Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx: 通过合理调整CSP配置&a…...
JSR303校验教学
1、什么是JSR303校验 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。…...
使用DeepSeek技巧:提升内容创作效率与质量
一、引言 在当今快节奏的数字时代,内容创作的需求不断增加,无论是企业营销、个人博客还是学术研究,高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手,凭借其强大的语言生成能力,为创作者…...
【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的贪心算法2.贪心算法3.详细的贪心代码1)一种常见的贪心算法 总结 前言 提示:这里…...
C# Winform制作一个登录系统
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…...
算法总结-哈希表
文章目录 1.赎金信1.答案2.思路 2.字母异位词分组1.答案2.思路 3.两数之和1.答案2.思路 4.快乐数1.答案2.思路 5.最长连续序列1.答案2.思路 1.赎金信 1.答案 package com.sunxiansheng.arithmetic.day14;/*** Description: 383. 赎金信** Author sun* Create 2025/1/22 11:10…...
向下调整算法(详解)c++
算法流程: 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置 大家可能会有点疑惑,这个是大根堆,22是怎么跑到…...
蓝桥杯之c++入门(一)【C++入门】
目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1:计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2:带余除法练习3:整数个位练习4:整数十位练习5:时间转换练习6ÿ…...
使用Python爬虫获取1688商品拍立淘API接口(item_search_img)的实战指南
在电商领域,通过图片搜索商品(拍立淘)已经成为一种重要的商品检索方式。1688平台的item_search_img接口允许用户通过上传图片来搜索相似商品,这为商品信息采集和市场分析提供了极大的便利。本文将详细介绍如何使用Python爬虫技术调…...
ElasticSearch-文档元数据乐观并发控制
文章目录 什么是文档?文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获࿰…...
使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?
使用Navicat Premium管理数据库时,最糟心的事情莫过于事务默认自动提交,也就是你写完语句运行时,它自动执行commit提交至数据库,此时你就无法进行回滚操作。 建议您尝试取消勾选“选项”中的“自动开始事务”,点击“工…...
【单细胞-第三节 多样本数据分析】
文件在单细胞\5_GC_py\1_single_cell\1.GSE183904.Rmd GSE183904 数据原文 1.获取临床信息 筛选样本可以参考临床信息 rm(list ls()) library(tinyarray) a geo_download("GSE183904")$pd head(a) table(a$Characteristics_ch1) #统计各样本有多少2.批量读取 学…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
