naos-riscv (dev.c)源码分析(devtmpfs)

Linux Swap 子系统:架构、内存管理与虚拟化 Swap Linux Swap机制通过将不活跃内存页移至磁盘或压缩内存,扩展系统有效内存容量,缓解内存压力。传统架构中,逻辑Swap槽与物理存储绑定,导致资源浪费,尤其在使用Zswap等压缩技术时。为此,Vswap与Xswap提出虚拟化方案:前者以XArray实现灵活映射,支持多后端迁移;后者采用稀疏映射,简化管理但容量固定。二者在架构设计、资源记账与动态扩展上各有权衡,反映了内核开发中对性能、可维护性与灵活性的深层考量。 阅读详情

设备文件系统(存在于内存)

devtmps = 存在于内存里的/dev文件系统 + 设备转发器。

devtmps做了三个核心的事情:

1、提供一个/dev目录(在内存中)。

2、/dev下的“文件“既可以是普通内存文件,也可以是设备的代理。

3、把用户程序对/dev/xxx的操作-》转发到真正的device driver。

这里是devtmpfs在vfs里面的文件系统id(fsid)。VFS用它区分”这个node属于那个fs“

mount / unmount 跨fs操作时候使用。

devtmpfs的操作锁

这里是双根目录 

fake_devtmpfs_root :系统启动初期临时/dev.

devtmpfs_root: 当真正mount后的/dev.

这里是一个占位函数,用在callback里面。(就是当前系统还不支持。暂时给个空实现)

空实现,因为devtmpfs不需要维护inode引用计数,维护open状态,也不需要私有上下文。

和open一样,devtmpfs没有打开状态(也就是资源无需释放)

第一句的if,判断如果是块设备或者字符设备。就会直接转发到驱动层。

否则就是 ”普通内存文件“。然后去读内存。

这里是devtmpfs_write和read逻辑对称:

设备->device_write.

普通内存文件->写入content,必要时候realloc。(alloc memcpy  free)

devtmpfs_readlink(符号链接解读)

从symlink内容中--》解析目标路径--》生成相对路径 

这里的devtmpfs_mkdir:简单的设置权限。

这里是创建普通内存文件(使用malloc和alloc_frames_bytes)

创建设备节点(有设备号)

if判断是块设备还是字符设备。else是普通内存文件

symlink的内容就是保存字符串name。(size存放了name的长度。同时继承了目标类型)

这里是把假/dev移到真实/dev上。同时会保护原fsid。可以回滚(unmouont)

反向操作:

把内容merge回fake_devtmpfs_root.

恢复原fsid

devtmpfs_root重置。

这里能看到都是stub。

devtmpfs不处理ioctl,只进行转发。

这里对块设备和字符设备进行device_map。对普通文件使用general_map.

这里也是对poll只进行转发。不处理poll。

这里用于truncate/ftruncate.扩容内存buffer

这就是ls -l 能显示文件大小的来源。

释放handle资源。

这里是devtmpfs挂载到VFS的函数表。

这里是为了去注册到VFS:使得mount成为可能。

从函数名翻译(输入设备事件读),再看参数buf。功能:从输入设备“事件缓冲区”读出事件数据。

cat /dev/input/event0

 circular_int_read(这是从缓冲区中读取事件)

这里是todo,输入设备通常不支持写,这里只是为了让用户写的时候不会死掉。

inputdev_ioctl:

这里进行四字段解析(采用linux ioctl 编码格式)

设备类别、输入/输出、命令号、数据长度。

这里针对事件位图进行查询。查支持的按键、支持的事件类型、支持的轴

else if:轴信息

TCFLSH:tty flush

后面是ioctl命令表:

numberioctl功能
0x01EVIOCGVERSION版本
0x02EVIOCGID设备 ID
0x06EVIOCGNAME设备名
0x07EVIOCGPHYS硬件路径
0x08EVIOCGUNIQ唯一序列号
0x09EVIOCGPROP属性
0x03EVIOCGREP重复延迟
0x18EVIOCGKEY按键状态
0x19EVIOCGLEDLED 状态
0x1bEVIOCGSW开关
0xa0EVIOCSCLOCKID设置时钟
0x91VMware 兼容
default打印并返回错误

这里是事件轮询,查询是否有可读事件。

如果有数据+用户等待读

设备节点注册:在/dev下创建节点。

1、路径拼接

2、然后建立dev node。

3、块设备,存储分区结构体

4、计算大小(块设备的)

/dev 文件系统初始化。

1、注册devtmpfs

2、创建/dev

3、设置为根

4、标记初始化完成

nulldev_read -》返回 0

nulldev_write -》丢弃

nulldev_ioctl ->no-op

等价于 /dev/null

这里进行控制台链接

标准IO初始化。

注册null设备。

初始化pty、初始化ptmx、初始化pts。

环形缓冲区 = 输入事件的队列。

这里是计算有多少可以读的字节。

把事件塞入buffer。

MAPPO实战:从理论到代码的协作智能体训练指南 本文详细介绍了MAPPO算法在多智能体协作训练中的实战应用,从理论基础到代码实现全面解析。通过对比PPO与MAPPO的差异,深入讲解CTDE框架、网络架构设计、参数调优等关键环节,并提供实际项目中的调参经验和常见问题解决方案,帮助开发者快速掌握这一强化学习前沿技术。 阅读详情

相关推荐

【OWL部署】Manus又一开源平替OWL真的很好用吗?手把手带你部署并运行你的AI助手OWL(对接Qwen、硅基流动接口)

本文介绍了通用人工智能OWL的部署及国内接口对接,全篇干货满满,手把手教学。

MosuoLc的博客 4041

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 318

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 686

Linux 磁盘满了怎么排查?df / du / find 三步定位大文件

Linux 磁盘满排查三步法:df -h 定位分区、du 逐层下钻、find 按大小和时间抓大文件,附 inode 耗尽、文件已删未释放、du 与 df 不一致等经典坑的解决方案。

weixin_38291577的博客 213

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

支付漏洞防护绕过的一种方式

放完包后就到了提交订单的地方,可以发现,金额确实小了很多,合理的搭配的话还可以更低,再次前进可以发现,金额确实是这么多,后面就不支付了,到此就结束了。也就是说数量可以为负数,但是金额不能为0或者0以下,有什么方法可以绕过这个限制吗,其实并不难,既然可以为负数,只是对金额不能为0或者负数做了限制。我们可以尝试拼接法,利用负数加上正数让他的值变得很低,但是又大于0就可以了,这里利用购物车的结算方法,随机加一些在购物车里。这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包。

2301_80115097的博客 1527

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 81

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7872

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 282

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 637

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 205

短信验证码接收平台完整搭建教程(超详细版,附完整源码)

在网站注册、用户登录、找回密码等功能中,验证码(特别是短信验证码)已成为验证用户身份的常见方式。本教程将详细介绍如何从零搭建一个短信验证码接收平台,用于保存、展示并管理来自短信网关或中间转发程序提交的验证码数据。✅ 教程适合有基本 Python/HTML 基础的开发者🚫 禁止用于任何违法用途,仅供学习参考✅ 支持通过 POST 接口接收短信验证码✅ 支持通过网页实时查看验证码历史记录✅ 验证码信息保存在 SQLite 数据库✅ 支持时间戳排序、查询最新验证码。

weixin_52548902的博客 4543

Linux rm 误删文件恢复实操教程

Linux使用rm删除文件时,并不会直接抹除磁盘上的数据,只是移除文件索引,让系统不再识别这块空间。只要没有写入新数据,原有扇区内容就会保留。新文件写入才有可能覆盖这些区域,一旦覆盖就很难找回。恢复的本质就是扫描磁盘,找到这些还存在、但索引丢失的数据条目,再把它们导出保存到其他分区。越早停止写入,恢复成功的概率越高。

海天数据恢复-winhex数据恢复教程 200

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Windows/Linux下强实时运动控制内核(二):基于Qt的Delta机械手的开发应用

强实时运动控制内核MotionRT750下Qt开发Delta机械手的完整开发流程。

weixin_57350300的博客 238

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux sudo

如果输出 → 无 sudo 权限 如果输出 → 拥有全部 sudo 权限 辅助验证命令 ⚠️ 注意:在 wheel 组 ≠ 一定能 sudo,必须 开启 Ubuntu/Debian: ✅ 重要:修改组之后,用户要重新登录才生效! 或者执行 临时生效 看到这行(没有 #注释)才生效: 方式 2:visudo 直接单独给用户授权(精细化权限) 找到 ,下面添加一行: 自带语法校验,写错会告警,不要直接 vim 改 ,写错直接 sudo 炸掉! 想免密 su

fengliyang_的博客 176

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux 磁盘 100% 但 du 查不出东西,五种情况逐个排

监控告警说根分区 100%,登录上去 du -sh /* 加起来只有 12GB,df 显示 40GB 已用。差了快 30GB,du 找不到任何东西。这种情况基本都是"文件被删了但进程还开着",但也可能是别的原因。这篇按可能性排一下顺序。

2408_89646393的博客 160

【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚

DNS 让名字与网络资源建立联系,ICMP 让部分网络状态有机会被看见。真正排查问题时,我们需要的不是一条万能命令,而是把每次观测放回它对应的层次。看到一个 DNS 结果,先问“谁回答的、什么类型、缓存多久”;看到一次 ping 回复,先问“哪个地址、哪个方向、证明了哪一次往返”;看到一份 traceroute,先问“用了什么探测、哪些节点回应、星号还有哪些解释”。当这些问题能被分别回答,“网络通不通”就不再是一个模糊判断,而会变成一条可以逐步验证的分析路径。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 490

Linux 网络基础详解:IP、子网、路由与 ip、ss 命令实战

建库建表、增删改查、连接查询(内连左连右连)、聚合函数、权限控制 GRANT/REVOKE,每条命令配可运行示例,零基础也能跟着敲会 SQL 基础。

2502_91473995的博客 607

Linux、Shell、MySQL 测试卷逐题细讲(下篇:MySQL)

本文为Linux、Shell、MySQL测试卷下半段MySQL部分逐题讲解,包含填空、选择与SQL分析三类题型。填空题覆盖COUNT、HAVING、DISTINCT、事务、约束、索引等核心语法;选择题辨析存储过程、索引类型、ACID、存储引擎、用户管理等考点。SQL大题围绕员工、部门、职位、地点四张关联表,考察多表连接、分组聚合、自连接、相关子查询、NULL处理等高频写法,标注LEFT JOIN统计计数、NULL判断、子查询别名等易错坑点,同时梳理试卷OCR识别带来的干扰问题,重点提示SQL实操中的常见失误

dongziwen1的博客 179

Linux 下 OpenCode 接入自定义大模型 API 教程:以 DeepSeek-V4.1-Flash-1017 为例

本文介绍在Linux下通过Python脚本配置OpenCode接入自定义大模型API(以DeepSeek-V4.1-Flash-1017为例),实现永久化、非侵入式配置。通过修改~/.config/opencode/opencode.json文件,添加OpenAI兼容服务商BLSC,注册模型并设置APIKey。支持命令行测试、默认模型设定及安全权限控制,操作简单且不影响原有配置。适用于各类支持OpenAI接口的自定义模型服务,提升开发灵活性与安全性。

qq_15060477的博客 118

【Linux 命令实战(02):文件与目录操作,掌握 pwd、ls、cd 三个核心命令】

命令作用cd /进入根目录cd ~进入当前用户家目录cd返回当前用户家目录cd …返回上一级目录cd …/…返回上两级目录cd -返回上一次所在目录进入指定目录命令核心用途常用参数pwd查看当前目录-L、-Pls查看文件和目录cd切换目录…、~、-Linux 文件系统的基本结构。绝对路径与相对路径的区别。Tab 自动补全。Shell 通配符。使用&&组合命令。这篇文章主要解决的是如何在 Linux 文件系统中快速定位目录。

一些微不足道的见解、希望能帮助各位 185

Linux Day29——HTTP与网络排障

*实测**:`traceroute -n -m 8 8.8.8.8` 的输出:第 1 跳 `172.17.144.1`(本机网关)、第 2 跳 `10.32.0.1`、第 3 跳 `10.50.255.253`、第 4 跳 `* * *`、第 5 跳 `221.226.71.193`、第 6 跳 `* * *`、第 7、8 跳有地址但夹着星号。`ping` 和 `traceroute` 都靠它。**实测**:`ss -lta` 看到三行 `domain`,加 `-n` 后变成 `53`。

2503_94114317的博客 147

Linux-IPC进程间通信

进程间通信(IPC)因进程空间独立但需数据共享而必要。主要方式包括:管道(无名/有名,基于队列)、信号(异步通知)、消息队列、共享内存(高效读写,需配合信号量同步)及Socket(网络通信)。无名管道用于亲缘进程,有名管道支持任意单机进程;共享内存提供高速共享,但需同步机制避免冲突。各类IPC各有特性,适用于不同场景。

2401_86256335的博客 159

【Linux指南】进程通信系列(七):System V 信号量 —— 同步互斥的内核原语

System V 三兄弟的压轴成员 —— 信号量(Semaphore) —— 是最特别的一位:它根本不传数据。消息队列传消息、共享内存传字节,信号量只干一件事:当保镖。

倔强的石头的博客 4250

【Linux】进程间通信的基础概念及基于匿名管道的进程池

前面我们介绍了进程的创建、退出和等待,接下来看看进程之间怎样传递数据。这篇从匿名管道入手,再用管道把父子进程联系起来,写一个简单的进程池小demo。而且我把发行版从CentOS切换成Ubuntu了,主要是CentOS已经不维护了,可惜了。。。

qeen87的博客 307
上一篇: naos-riscv源码分析:device.h如何把设备注册、查找与读写串起来
下一篇: 登录锁定60秒:测试都通过了,怎样知道它真的能抓住Bug?
咔_
博客等级 码龄4年 948粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值