LWN:kernel API 规范和验证

Linux Kernel 之一 内核架构、源码文件、API/ABI 介绍、FHS 内核架构主要有 宏内核(Monolithic Kernel)、微内核(Micro kernel)和混合内核(Hybrid kernel) 三种。Linux 系统的 Kernel 属于宏内核,而 Windows 系统的内核 Windows NT 和 macOS 的内核 XNU 都属于混合内核。 阅读详情

关注了就能看到更多这么棒的文章哦~

Kernel API specification and validation

By Jonathan Corbet
July 3, 2025
Gemini flash translation
https://lwn.net/Articles/1027811/

内核项目向其用户作出了一个坚定承诺:内核 ABI (应用程序二进制接口) 将不会以破坏用户空间 (user-space) 代码的方式进行更改。尽管偶尔会有失效的情况,但内核开发者们确实努力兑现这一承诺。然而,他们受限于一个小小的问题:没有对内核 ABI 是什么的描述,也没有一个全面的方法来测试给定的更改是否会破坏它。Sasha Levin 提出的内核 API 规范框架 (kernel API specification framework)(第二版)解决了一些这些问题,但该解决方案并不完整,也不是没有代价的。

(请注意,Levin 在这项工作中始终使用“API”而非“ABI”一词;从现在开始,本文也将使用该术语。)

内核接口非常复杂。它包含数百个系统调用 (system calls),其中许多具有复杂的参数和行为;如果一个规范要完整,所有这些都必须被完整描述。API 还有其他方面,例如 `/proc` 或 `/sys` 中的文件,由 perf-events 子系统 (perf-events subsystem) 或 io_uring 创建的内存映射区域,以及任何给定类型文件描述符可用的操作集。BPF 程序 (BPF programs) 或可加载内核模块 (loadable kernel modules) 可用的接口带来了更复杂的挑战,尽管这些接口不属于内核的 API 保证范围。Levin 的补丁集并未涵盖所有这些领域,但它提供了一个良好的开端。

规范系统调用

该框架的大部分内容,如已发布的那样,都侧重于定义系统调用。任何给定系统调用的实际规范都以一组长宏调用的形式格式化在该系统调用本身的源文件中。例如,考虑相对简单的 mlockall() 系统调用规范;它包含大量文本,在一个如下所示的代码块中:

DEFINE_KERNEL_API_SPEC() 调用开始定义一个 kernel_api_spec 类型的结构体;KAPI_END_SPEC(简单定义为“};”)结束该结构体。中间的宏调用以各种方式填充该结构体的字段。例如,KAPI_DESCRIPTION() 简单定义为:

mlockall() 只有一个参数——一个 flags 值。它被指定为:

KAPI_PARAM() 开始初始化一个嵌套在 kernel_api_spec 结构体中的 kapi_param_spec 结构体。这里,该声明表示第一个参数(编号 0)是一个名为 flags 的整型值 (int value);它是系统调用的一个输入参数。有三个有效的标志位 (flag bits),它们直接存储在 valid_mask 中,无需特殊的宏调用。对这些值的额外约束(必须设置 MCL_CURRENT 和/或 MCL_FUTURE 中的至少一个)仅以文本形式提供;在当前系统中无法指定此类约束。

这是一个相当多的全部大写文本,但这个规范才刚刚开始。它还包含描述返回值和系统调用可能返回的错误代码的声明。其他声明描述了系统调用如何响应各种信号。有六个声明块描述系统调用的副作用,五个用于“状态转换”。系统调用使用的内部内核锁 (internal kernel locks) 也被描述了。有一个声明块用于 mlockall() 所需的功能 (capabilities),一个用于示例,以及三个额外的约束。总而言之,mlockall() 的规范超过 180 行。

socket() 的规范正如人们所预期的那样,要长得多。

Sysfs 及更多

补丁集的第二个版本增加了指定 sysfs 属性 (sysfs attributes) 行为的能力。一个来自块层的简单示例如下所示:

关于 sysfs 值的可指定内容较少,因此这些描述往往会短一些。

几乎总是如此,ioctl() 是特殊的,因为每个 ioctl() 调用都不同。有一组宏用于这些调用的规范;请参阅fwctl 子系统 (fwctl subsystem) 的规范以获取示例。还有一种内部内核函数 (internal kernel functions) 规范的格式。

然后呢?

精确描述内核接口的能力本身就很有价值;它形成了一种文档(尽管与内核现有的文档系统没有集成,但这显然在未来的工作列表中)。但仅仅依靠文档似乎不太可能激励内核开发者编写和维护如此多的额外文本,甚至接受它进入他们的代码,即使是其他人来做。真正的价值来自于一旦创建了所有这些规范数据后可以做什么。

如果内核为此进行了配置,所有规范数据都将被构建到内核镜像 (kernel image) 中。每个 API 规范会增加 4KB 的内存,其结果是,一个完全规范化的内核可能包含数兆字节的额外数据。因此,这可能不是在生产内核 (production kernels) 中启用的选项,但所有这些数据在开发和测试场景中都可能非常有用。

规范数据通过 debugfs 提供;因此,一个简单的 cat 命令可以用于提取任何给定规范的人类可读渲染;JSON (JavaScript Object Notation) 和 XML (Extensible Markup Language) 渲染也可用。有特殊的 all.json 和 all.xml debugfs 文件,可用于以 JSON 或 XML 格式提取整套规范数据。

内置这些数据的内核可以配置为根据其规范验证系统调用(和内部函数)。目前,大部分验证在于确保传递给函数的参数符合规范;因此,从某种意义上说,它们是在验证调用者,而不是函数本身。此外,还对函数的返回值进行检查,如果返回意料之外的值,则能够完全使系统调用失败。有用于验证锁规范和信号处理的函数,但它们在当前实现中是存根 (stubs)。开发者还可以为特定函数提供自定义验证函数。

最后,有一个名为 kapi 的新工具,使用 Rust 编写(大部分是自动生成的),可用于获取规范数据。它能够直接从源代码、从已构建的内核镜像或从 debugfs 读取数据。输出可作为纯文本 (plain text)、JSON 或 ReStructuredText 格式提供。除了其他功能外,kapi 还可用于检查两个不同内核之间的 API 差异。

此系列补丁的关键目标之一是实现 API 破坏性更改的自动检测。然而,在其当前状态下,它似乎主要检测那些开发者已勤奋地更新规范以反映其他地方更改的情况,在这种情况下,开发者已经知道这种破坏。验证可以捕捉一些更改,但肯定会遗漏许多其他更改。

然而,总得有个开始。随着时间的推移,如果该框架显示出足够的潜力,它或许可以发展成为能够覆盖大部分内核 API 并确保其一致性的工具。未来的计划包括与静态分析 (static analysis) 集成以验证 API 规范,与模糊测试工具 (fuzzing tools) 集成以进行更智能的测试,以及可在生产内核中启用的低开销运行时验证 (run-time validation)。但是,要实现这一目标,Levin 必须说服开发社区,现有框架提供了足够的价值,足以证明添加和维护数千行规范数据的合理性。这场对话才刚刚开始。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03 需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第二百三十三篇 信号量与进程调度、磁盘/SSD调用、内存管理及I/O工作方法的系统设计理论与方程式 第六章节01

设存储系统对外暴露逻辑对象标识集合 K,对内映射到物理资源集合 P。索引函数定义为文件系统:k=(inode,offset) 或 (path),P 为数据块/extent;对象存储:k=(bucket,key,version),P 为分片/EC chunk/副本节点;块存储:k=lba 或 lba 区间,P 为磁盘/SSD 物理页、RAID 成员、卷映射项。

weixin_49199313的博客 148

Windows内核--Kernel API简析(3.1)

如果所有的内核提供的功能,内核提供进程/线程创建和终止,内存分配和释放,文件操作,网络功能,驱动程序加载和卸载等功能。这些API将在后面陆续介绍,如下先介绍Kernel提供的基础API(Kernel自身或Driver使用).类似libc malloc/free/memset系列函数。类似于libc printf.类似libc string函数.

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 989

KERNEL32 API函数

一个非常全的KERNEL32[1].DLL API函数库文档。

kernel常用API接口

1、__setup函数 //获取uboot bootargs参数

ask_true的博客 1190

libc+linux_kernel_API

libc库的pdf文档,以及linux kernel的api函数

linux-kernel-api手册,linux内核api完全手册,2.6内核版本

linux-kernel-api手册,linux内核api完全手册,2.6内核版本, 有非常详细的书签..

kernel api汇总

参考 https://www.kernel.org/doc/htmldocs/kernel-api/

myz348的博客 1032

SAP农产品增值税进项税解决方案

(三)购进农产品用于生产经营且不构成货物实体的(包括包装物、辅助材料、燃料、低值易耗品等),用于生产适用13%税率货物的扣除率为10%,用于生产适用9%税率货物的扣除率为9%。具体计算公式为: 当期允许抵扣农产品增值税进项税额=当期耗用农产品数量×农产品平均购买单价×扣除率/(1+9%)

weixin_44228539的博客 1194

内核电源管理器已启动关机转换_客户说自己的电脑晚上老是自动关机

----关注IT技术,有您想要的实战小技术。最近遇到一个问题电脑晚上老是自关机,客户说门位岗亭的收费电脑这一段时间老是自动关机。于是IT小哥,就上门查看原因了,第一次去,凭咱这么多年的经验,多数可能是系统问题。给客户安装完系统后,运行了大概有半个月,电脑又出现自动关机。心理暗想,不应该呀,刚安装的系统怎么会又电脑自动关机呢?今天中午和客户约好时间,上门查看原因。到达现场后,查看分析原因。咱也是会看...

weixin_39978257的博客 1万+

LeGO-LOAM相对LOAM的改进---地面分离的方法-算法原理+代码讲解

实际上此种地⾯分离算法有⼀些简单,我们可以结合激光雷达安装⾼度等其他先验信息进⾏优化,避免将桌子这些当作地面点。LeGO-LOAM中前端改进中很重要的⼀点就是充分利⽤了地⾯点,那⾸先⾃然是提取对地⾯点的提取。理想情况下, 应该接近0,考虑到⼀⽅⾯激光雷达安装也⽆法做到绝对⽔平,另⼀⽅⾯,地⾯也不是绝。对⽔平,因此,这个⾓度会略微⼤于0,考虑到作者实际在草坪之类的场景下运动,因此这个值被设置成。如上图,相邻的两个扫描线束的同⼀列打在地⾯上如AB点所⽰,他们的垂直⾼度差。,计算垂直⾼度差和⽔平⾼度差的⾓度。..

zysss_的博客 775

【R语言实例】物种分布模型介绍

SDM介绍

wong2016的博客 1万+

系统化跟踪Linux内核补丁:从邮件列表到Git验证

Linux内核作为基础软件的核心,其内部接口与数据结构的演进从未停歇。对驱动开发、文件系统及虚拟化方向的工程师而言,接口的静默变化往往带来编译失败或运行时行为异常。掌握补丁跟踪能力,本质上是建立对内核变化趋势的感知体系。通过邮件列表、Patchwork、kernel.org等权威渠道获取第一手信息,借助Git的增量日志与历史追溯功能精准定位关键函数或结构体的变更节点,再辅以规范的补丁应用与编译验证流程,即可将上游改动对自身项目的影响降至可评估、可控制的范围。这种能力不仅能降低升级回归风险,还能从社区高手的补

weixin_31766003的博客 218

别再手动算了!用Excel函数一键搞定AQI和首要污染物分析(附完整公式模板)

本文介绍如何利用Excel函数自动化计算AQI和首要污染物分析,大幅提升数据处理效率。通过构建标准化输入模板、智能计算IAQI、自动判定AQI与首要污染物,并生成可视化仪表盘,帮助环保工作者快速完成每日监测报告。

weixin_30443075的博客 344

CUA技术概念解析:开源驱动与跨操作系统兼容性实践

CUA作为新兴的跨操作系统(cross-OS)兼容性抽象层,本质上是一种面向异构硬件环境的统一驱动接口规范。其核心原理在于通过标准化设备发现、资源映射与策略分发机制,解耦底层驱动实现与上层应用逻辑,从而提升软硬件协同效率与部署一致性。该技术显著降低多平台适配成本,支撑云原生基础设施、边缘计算节点及AI训练集群等场景下的驱动栈统一管理。在开源驱动(open-source drivers)生态持续演进背景下,CUA正成为连接Linux、Windows与macOS设备管理层的关键桥梁,尤其适用于需规模化运维GPU

weixin_31856057的博客 310

【WILEY】从Revision到Online:逐层拆解投稿状态更新与关键文件提交实战

本文详细解析了学术论文从返修到在线发表的全过程,重点拆解了投稿系统状态更新背后的含义与应对策略。文章提供了返修稿与回复信的准备技巧、关键补充文件(如图文摘要)的提交要点,并分享了校对校样与处理出版协议的实战经验,帮助作者高效、专业地完成发表流程。

weixin_29209805的博客 713

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

OSTEP实战作战地图:从虚拟化、并发到持久性的三维穿透式学习

操作系统是软硬件协同的精密系统,其核心围绕虚拟化、并发和持久性三大原理展开。虚拟化通过页表与TLB实现资源抽象与隔离,直接影响内存访问性能与上下文切换开销;并发机制依赖内核调度、锁原语与信号处理,在多线程/多进程场景中决定响应延迟与数据一致性;持久性则贯穿I/O栈设计,涉及Page Cache、缓冲区管理与设备调度策略。这些基础原理不仅构成Linux内核行为的底层逻辑,更直接映射到Redis单线程优势、MySQL主从延迟、K8s容器内存限制等高频工程问题。本文以《操作系统导论》(OSTEP)为纲,聚焦虚拟化

weixin_33805743的博客 1076

反爬虫:POST 请求参数中 Sign 的加密机制详解,并设计带 Sign 校验的网站

本文介绍了API请求中sign签名的生成原理及实现方法。sign是通过对请求参数加密生成的一串字符串,用于验证请求合法性,防止参数篡改、重放攻击和伪造请求。其生成步骤包括参数排序、拼接字符串、加盐和哈希加密。文章还演示了如何在FastAPI后端实现带sign验证的新闻网站,包括参数校验、时间戳验证和签名比对等安全措施,有效提升API安全性,增加爬虫逆向难度。

数据知道的博客 4075

PdfCraft OCR 入门:5 分钟把扫描件 PDF 变成可搜索文档(完全离线)

扫描版 PDF 的本质是一整张图:里面的字选不中、复制不了,Ctrl+F 也永远搜不到。PdfCraft OCR 是这款纯 Rust 开源 PDF 工具箱里的"扫描与识别"功能,它给每个单词补上一层隐形文本——图像一个像素都不动,页面却从此能搜索、能复制。全程免费、完全离线,文件不会离开你的电脑。 读完这篇,你能做到三件事: - 对一个扫描件跑完一次完整的 OCR,并解释清楚每个参数在干什么

gitblog_00510的博客 249

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

手把手学Linux设备驱动:从字符设备到内核机制的完整路径

Linux设备驱动是嵌入式与物联网系统的基石,其开发涉及内核态编程、硬件交互与并发控制,学习门槛较高。驱动的核心在于理解字符设备、块设备与网络设备的框架差异,以及设备树如何描述硬件资源。内核提供的file_operations、中断机制、等待队列与锁机制,是驱动稳定运行的关键技术。掌握这些原理后,开发者可在开发板上实践GPIO、I2C、SPI等真实驱动,并借助动态调试、ftrace等工具定位问题。从基础内核模块到设备树解析,从并发安全到中断上下文,系统化的学习路径能帮助工程师快速上手。本文结合新书出版契机,

weixin_33796205的博客 453

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux内核问题驱动式调试导航图

Linux内核调试是操作系统工程实践的核心能力,其本质是将抽象机制(如进程调度、内存管理)与具体故障现象(如D状态卡死、page fault无法定位)建立可验证的因果链。理解内核源码阅读的关键不在于通读,而在于掌握‘问题—现象—路径—验证’四步法,借助内核调试工具链(ftrace、perf、crash)实现从dmesg日志到源码行号的秒级定位。技术价值体现在大幅压缩debug_cost(实测平均降低75%)、支撑多版本内核(4.19至6.1)的精准适配,并在嵌入式IoT、云原生内核模块、现场故障排查等场景中

weixin_34080571的博客 332

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

嵌入式Linux驱动开发学习路线与21天速成教材实战解析

嵌入式Linux驱动开发是嵌入式系统开发的核心技术之一,其原理基于操作系统对硬件资源的抽象管理,通过内核模块与设备树实现硬件与系统的解耦。掌握驱动开发不仅能提升系统移植与内核裁剪能力,更是嵌入式Linux面试题中的高频考察点。在工业控制、物联网网关、智能终端等场景中,驱动工程师需具备硬件分析、内核调试与并发控制等综合技能。飞凌嵌入式联合北京大学出版社推出的《嵌入式Linux系统开发21天速成》,正是围绕这一技术路径,将驱动开发、系统移植与项目实战拆解为可验证的阶段目标,帮助学习者高效跨越从入门到实战的门槛。

weixin_33979203的博客 356

从0到1:5分钟本地跑起The Delegation 3D AI办公室的完整指南

The Delegation 是一款免代码(no-code)的 3D AI 办公室实验场,让 AI 爱好者、教育工作者和创意开发者无需写一行代码,就能在一个"活"的 3D 办公室里探索、设计并交互 Agentic AI(智能体)系统:由 LLM 驱动的角色会在共享的虚拟工作区里自主协作——它们自主导航到工位坐下、干活、互相讨论,而你只需通过节点式编辑器和看板界面来指挥整个 AI 团队。 [![T

gitblog_01091的博客 493

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 442
上一篇: LWN:Fedora i686 的命运得到缓刑!
下一篇: LWN:逐步统一kselftests和KUnit!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值