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

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通过引入三个门(输入门、遗忘门和输出门&#xff09…...

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&#xff…...

使用Python爬虫获取1688商品拍立淘API接口(item_search_img)的实战指南

在电商领域,通过图片搜索商品(拍立淘)已经成为一种重要的商品检索方式。1688平台的item_search_img接口允许用户通过上传图片来搜索相似商品,这为商品信息采集和市场分析提供了极大的便利。本文将详细介绍如何使用Python爬虫技术调…...

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档?文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获&#xff0…...

使用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.批量读取 学…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...