naos的device.c源码:设备注册、子类型查找与驱动回调转发

LinuxCNC---在PC端显示开发板LinuxCNC界面   今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i 阅读详情

我原来把这个文件看成“安装设备,加上一组统一转发函数”。这个理解仍然是主线,但要把它用起来,还得分清三个东西:设备表位置、设备号,以及设备大类/子类型。

本次核对本地na-kernel的历史版本 490d5f0d3adf83c5670a181a2708a5c4a670d4c6,文件为 kernel/src/dev/device.c 和 device.h。其设备表、编号公式和转发结构与原截图对应;没有证据证明原截图恰好来自同一个提交,不把不同日期的块设备代码强行拼成一个可运行版本。历史源码。

1. 设备表不是设备号数组

原图:设备表与每个子类型的计数

devices保存device_t结构,devices_idxs记录各子类型已经分配的次编号。设备在devices里的下标不等于dev字段。这个版本查找设备号时是线性扫描,而不是直接用dev当数组下标。

原图:初始化设备表

原文说“name设置为null”不准确:这里name被复制字符串 "null",并不是名字指针被设为NULL。type/subtype设为DEV_NULL、dev置零,部分回调置NULL。

devices是静态存储对象,首次启动时其未显式写的字段也会零初始化;但device_init并没有显式重置ptr、poll、map全部字段。所以不能从“第一次初始化没问题”推导出它支持随时完整重置设备表。本次测试不修改内核实现,仅标明这个边界。

2. 安装是取得槽位、填写字段,再注册到devfs

原图:从1开始找空设备槽位

get_null_device从下标1开始,用type==DEV_NULL判断空闲,找不到返回NULL。保留槽位0和给设备号赋值是两件事。

原图:device_install安装流程

ptr不是指向device_t自身的必然指针,它由驱动传入,可以指向私有状态。统一层只保存它,之后再原样交回回调。name、parent和各回调也都在此时填入,最后调用devfs_register_device。

这份历史代码没有在取槽后检查NULL,也未在此函数内验证subtype范围、长名称的终止情况或并发分配。阅读时要记录这些前置条件;本文不执行越界或空指针输入,不把“正常路径测试通过”说成注册接口已经健壮。

原图:设备号编码

编号公式是 (subtype << 8) | minor,minor来自该子类型的计数再自增。它是这个内核的编码方式,不是现代Linux dev_t的通用布局。当前表共256槽、安装跳过槽0;若以后扩大容量或支持反复注销安装,也需重审minor位宽与编号唯一性。

3. device_find按子类型枚举,不按大类筛选

原图:device_find比较的是subtype

这是原文最需要修正的一句:device_find(DEV_BLOCK, 0) 并不表示“第一块设备”。DEV_BLOCK是type枚举,函数比较的是subtype,应传DEV_DISK、DEV_PART等具体子类型。

device_t *first_disk = device_find(DEV_DISK, 0);
device_t *second_disk = device_find(DEV_DISK, 1);

idx表示按设备表扫描顺序遇到的第几个匹配项,不是设备号minor字段的查询条件。这份只安装不注销的正常流程可能让两者恰好一致,但函数实现并没有比较minor。

原图:device_get按完整设备号查找

device_get扫描dev字段。初始化后大量空槽dev都是0,因此这个版本 device_get(0) 可以返回槽位0,不会自动得到NULL。调用者不能把“非NULL”直接当作“已安装的活跃设备”。

4. 统一转发层要看三个分支

原图:ioctl统一入口

状态ioctl/read/write/poll统一层的行为
找不到设备号返回-ENODEV
找到设备但对应回调为空返回-ENOSYS
回调存在传入device->ptr和操作参数,返回驱动结果

“不存在”和“不支持”不是一个错误。回调自己的负错误码也应原样传回,不能在封装层吞掉变成成功。

已确认的局部链路:
device_ioctl(dev, cmd, args)
  -> device_get(dev)
  -> device->ioctl(device->ptr, cmd, args)

原文写“用户ioctl -> VFS -> device_ioctl”,那是一条需要继续查调用者的更长链路,仅凭这个文件不能证明系统调用、文件描述符与devfs上层都已经接通。本文的实测止于上面的局部接口。

原图:块设备ioctl分发示例,签名与本版本device.h不同

这张历史块设备图使用整数drive/cmd/arg,而本版本device.h中的ioctl签名是 int (*)(void *, int, void *)。它能展示“按操作号分发”的思路,但不能据图断言两个版本的函数可直接互换。本次驱动桩严格使用device.h的回调签名。

原图:poll转发

原图:read转发

原图:write转发

read/write的返回类型是ssize_t,允许表示负错误;idx、count、flags都被继续传入。统一层本身并不转换字节与扇区单位,单位要查具体驱动的约定。

原图:map用指针返回值承载错误

map不能照搬普通read的返回值判定:这里用转换为指针的负错误值表示失败,上层必须遵循该内核的错误指针约定,不能只判断NULL就把它当可访问地址。这个约定与可移植C接口也要分开看。

5. 怎么验证,不用真的去访问磁盘

本次从历史提交提取真实device.c与device.h,仅把三个内核头文件依赖换为宿主测试头,EXPORT_SYMBOL在测试中置空;注册devfs使用记录调用的桩。没有另写一份相似的设备层代替原代码。

驱动桩保存一个可识别的状态对象:ioctl验证收到的ptr、cmd、args;read/write/poll/map也记录各自参数和返回值。这样能发现“驱动被调用了,但拿到的却是错误对象或参数”。

测试项核对内容
安装两种子类型空槽从1分配;计数按子类型独立;devfs桩得到同一设备对象
find/get按子类型找第0/1项;按dev找原对象;越过已安装数量返回NULL
正常与缺失回调私有状态及操作参数不丢失,驱动返回值原样传回
不存在设备四种整数返回接口及map的错误表示
初始化约定首次静态零初始化;device_get(0)确实命中空槽;不声称完整重置

宿主环境用GCC编译并运行断言。这个版本的注册参数使用void*传入回调,依赖内核工具链支持,不能把测试通过说成ISO C对任意平台都保证这种转换。

本次不是启动naos,不是硬件读写,也没有验证VFS系统调用端到端。它证实的是对应历史实现的注册和转发行为;缺失的容量检查、重置语义与版本差异仍然是审查发现,不因正常测试通过就被抹掉。

和device.h分析一起看,头文件定义了驱动能力,device.c把能力装进统一入口。读这种封装层,除了看“它转发了”,还要追问:它找的是谁,传给谁的什么状态,失败如何向上表示。

基于LSTM的股票价格预测系统,Django框架,Web的股票预测系统,训练+数据集+源码(无需安装环境版) 股票价格预测是投资领域的一个重点关注课题。由于股票价格受到诸多非线性因素的影响,得到精确的预测结果较为困难。使用 PyCharm 作为代码开发工具,通过下载好的股票金融数据,进行数据预处理,构建 LSTM 网络模型,训练模型并训练出最优模型,输出股票未来收盘价波动的走势,最后在训练好的模型上,设计股票模型应用系统,运行效率较高,对股票预测具有一定的积极意义。 阅读详情

相关推荐

Cass三角网法土方计算优化技巧:如何根据地形特点调整边界采样间距

本文深入探讨了Cass软件中三角网法(DTM法)土方计算的优化技巧,核心在于如何根据地形的复杂程度动态调整边界采样间距。针对平坦、复杂及人工构造物等不同地形特征,提供了具体的间距调整策略与精度验证方法,旨在帮助工程师在计算精度与效率间找到最佳平衡,实现精细化土方计算。

weixin_29294975的博客 522

naos-riscv源码分析:device.h如何把设备注册、查找与读写串起来

从原来的设备结构截图出发,对照历史实现梳理注册、设备号、私有数据与函数指针分发,并解释它与 block.h 的区别。

doting__的博客 240

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 669

在Codex 让AI模型 拥有长期智能记忆

本文介绍Claude-Mem V15新功能——智能记忆召回,解决AI遗忘、重复提示、执行不一致等问题。通过本地部署claude-mem,实现自动记录决策(如数据库选型)、跨会话智能召回,支持记忆写入、检索、遗忘全流程闭环。相比传统记忆方案,其基于Hooks自动捕获工具调用,结构化存储,可追溯、可共享、可清理,显著提升工程效率与协作一致性,是长期项目中理想的“工作黑匣子”与“工程脑”。

米莱虾 249

高等数学第五章---定积分(§5.3定积分的计算方法)

这篇博客详细讲解定积分的计算方法,包括直接法、凑微分法、变量代换法和分部积分法。通过典型例题演示如何运用这些技巧计算定积分,特别强调换元必换限的原则和奇偶函数的简化处理。内容涵盖代数变形、三角代换、分段函数积分等常见题型,并附有详细的解题步骤和常见错误分析。适合微积分学习者系统掌握定积分计算技巧,提升解题效率。文中还包含积分等式证明和变限积分函数求导等进阶内容,帮助读者深入理解定积分的应用。

2302_77045867的博客 4326

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 737

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 187

5分钟搞定DataDome滑块验证码:最新Capsolver API实战教程(含代理配置)

本文提供了一份利用Capsolver API快速自动化破解DataDome滑块验证码的实战教程。文章深入剖析了DataDome验证码的环境指纹与行为分析机制,并重点详解了确保成功率的住宅代理配置、API集成步骤及令牌使用等核心环节,帮助开发者高效集成稳定可靠的自动化解决方案。

milk8的博客 491

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 108

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

其中 Transmit Engine 从 AXI-Stream TX 接口接收数据,并添加前导码 Preamble、帧起始界定符 SFD、帧校验序列 FSC 等,并在必要时(长度小于最小 MAC 帧长度)填充数据,因此在使用 TEMAC 时,MAC 帧的这几个部分就不需要我们自己添加了(不过其他的 MAC 帧部分,可选的帧过滤器 Frame Filter 用于过滤与一组可配置过滤器匹配的帧,一般用于过滤掉目的 MAC 地址与本设备不一致的帧,TEMAC 默认开启帧过滤器。默认值为使用64位宽的计数器。

lzr232的博客 1767

强化学习在视觉导航中的应用

强化学习在视觉导航中的应用​ ,人工智能,计算机视觉,大模型,AI,强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境进行交互,以最大化累积奖励为目标的机器学习范式。它不依赖于预定义的规则或大量标注数据,而是让智能体在试错过程中学习最优策略。计算机视觉(Computer Vision)则赋予智能体 “观察” 环境的能力,使其能够从图像或视频中提取有用信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

45-存储过程与函数

匿名块跑完就没了,想下次再用只能复制粘贴。给块起个名字存进数据库,就成了存储过程与函数:一次编译、处处调用、权限收口,还能让 Java 侧少拼 SQL。这篇讲封装、调用、限制与排错的完整套路。CREATE OR REPLACE 覆盖式创建,事务由调用方控制;参数三模式 IN 只进、OUT 只出、IN OUT 双向,OUT 参数调用时要备好变量接;调用三姿势 EXEC、CALL、匿名块,命名传参=>最清晰;函数必有 RETURN,想在 SQL 里调用就不能碰 DML 和事务控制;

yuhou25的博客 151

Flink 运维监控与指标采集实战(Prometheus + Grafana 全流程)

Flink运维监控在实时计算场景中至关重要,因为Flink作业需要7×24小时稳定运行,对性能、资源、故障感知和状态变化的实时监控是保障系统稳定的关键。Flink自带的Metrics系统提供了基本的监控能力,但为了更全面的监控,Prometheus+Grafana成为最主流的解决方案。通过配置PrometheusReporter和Grafana仪表盘,可以实现对Flink作业的全面监控,包括CPU、内存、吞吐量、Checkpoint状态、KafkaSink性能等关键指标。此外,自定义指标采集和报警机制的配置

晴天彩虹雨的博客 1368

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 389

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大数据工具介绍

Hive作为离线数仓的元数据管理与SQL接口,依托HDFS存储、Spark/MapReduce计算;Spark是统一的分布式计算引擎,承担复杂数据处理;DataX实现异构数据源间离线同步;ClickHouse擅长极速单表分析;Doris则提供实时、多表关联的综合分析能力;Flink作为原生流处理引擎,支持毫秒级实时计算与状态管理。两者共同构建起从离线批处理到实时流处理的完整数据链路。

yyk33324的博客 259

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 298

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 303

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 345

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 176

WordPress 全站 HTTPS 后仍显示「不安全」或锁被划掉:先清混合内容,再核证书链与强制跳转

浏览器地址栏仍提示「不安全」、锁被划掉或控制台 Mixed Content 告警——明明证书已装、后台也勾了全站 HTTPS——这和今天槽位里写过的表单「提交成功但收不到邮件」、「建立数据库连接时出错」,以及登录 Cookie/CDN 重定向环、502/503、PHP 白屏、WP-Cron、媒体上传、固定链接 404、Woo 支付回调不是一类故障。PHP 与数据库多半正常,卡在。更稳的顺序是:先分清是→ 用开发者工具清出所有http://

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 374

48-逻辑结构表空间段区块

默认 10%,意思是块里的空闲空间低于 10% 时就不再插入新行,留着给已有行的 UPDATE 变胖用。注意 INSERT 过程中每次申请新区,都是一次潜在的空间报错点,如果表空间满了,此刻就会抛 ORA-01653。剩下的空间被谁占了?段的每个区可以落在表空间的任一数据文件,所以 2T 的表在 32G 单文件上限(smallfile)的世界里照样能活——多加文件就行。,一张只有两个 CLOB 字段的表,实际在库里是三个段(表段 + 两个 LOBSEGMENT),空间统计漏算 LOB 段是新手常犯的错。

yuhou25的博客 282

市场调查与统计分析专业大学期间考证怎么安排?

市场调查与统计分析专业的考证规划,适合从一份完整的调查报告倒推:能不能设计问卷、判断样本是否合理、清洗数据,再把分析结果转化为业务建议?围绕这条能力链安排证书,比单纯按“热门程度”报名更有针对性。结合2026年的学习安排,并为2027年的实习、升学和求职预留时间,大学期间可以重点考虑六类证书:全国计算机等级考试证书、大学英语四级或六级成绩报告单、CDA数据分析师、初级统计专业技术资格证书、微软办公软件国际认证中的Excel相关证书,以及软考数据库系统工程师资格证书。

cc572502653的博客 157

QT(了解各个控件及布局)下

练习工程里加一个“确认发送”按钮点击后弹出一个自己写的对话框:一句提示 + “确定”/“取消”确定 → 打印“已确认”,继续发送;取消 → 打印“已取消”,不发送点窗口右上角 X = 取消对话框弹出期间,主窗口点不动(模态)首先我们要在原项目的基础上,新建一个类,就是一个新的小对话框窗口,如下:然后系统会帮我们创建这个新类的头文件和源文件,接着我们到利用ui编辑器设计这个新窗口的界面,如下:如果要实现文字居中,就要设置到QLabel的属性设置这个alignmen为水平中心对齐。

lhbweilai的博客 211

Oracle 19c 在线重定义后旧表空间清理及 ASM 存储资源回收 SOP

Oracle 19c 在线重定义后旧表空间清理与 ASM 存储资源回收 SOP

「YYL DBA手记」 数据库 · 架构 · 运维 · 实战 yyldba.blog.youkuaiyun.com 472

AI Agent记忆从不是向量库:Oracle拆解读写分离与记忆晋升门,终结无脑存聊天的伪智能——读Wojtek Pluta演讲

在过去一年里,绝大多数团队在为自己的 AI Agent 增加“记忆能力”时,做法几乎如出一辙:开一个向量数据库(Pinecone / Milvus / Chroma),在每轮对话结束时,把用户的提问和 Agent 的回复转成 Embedding 向量直接往里塞;<summary> 审查 Kyle 的贷款完整性,审批未通过,等待补件。这种记忆能力完全脱离了脆弱的会话上下文窗口,靠的是数据库底座驱动的显式记忆装配。在写路径中,决定一条信息能否从“临时上下文”跃升为“长期持久化记忆”的核心关卡,正是。

鲜衣怒马楼兰月 123

Spring事务和事务传播机制

3. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.p1事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚.

txxzjmzlh的博客 201
上一篇: naos-riscv源码分析:block.h如何把字节请求交给块设备驱动
下一篇: naos-riscv源码分析:device.h如何把设备注册、查找与读写串起来
咔_
博客等级 码龄4年 948粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值