Linux sys_stat vfs_statx与cp_new_stat64填充
Linux sys_stat vfs_statx与cp_new_stat64填充stat(2) 系列系统调用在内核的统一入口是 vfs_statx。64 位架构上通过 ksys_stat 进入clong ksys_stat(const char __user *filename, struct kstat __user *statbuf){struct kstat stat;int error;error vfs_stat(filename, stat);if (error)return error;return cp_new_stat(stat, statbuf);}vfs_stat 是对 vfs_statx 的简单的封装cint vfs_stat(const char __user *name, struct kstat *stat){return vfs_statx(AT_FDCWD, name, 0, stat, STATX_BASIC_STATS);}vfs_statx 是 VFS stat 路径的核心函数cint vfs_statx(int dfd, const char __user *filename, int flags,struct kstat *stat, u32 request_mask){struct path path;unsigned int lookup_flags 0;int error;if (flags ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT | AT_EMPTY_PATH |AT_STATX_SYNC_TYPE))return -EINVAL;if (flags AT_SYMLINK_NOFOLLOW)lookup_flags | LOOKUP_FOLLOW;retry:error user_path_at(dfd, filename, lookup_flags, path);if (error)goto out;error vfs_getattr(path, stat, request_mask, flags);path_put(path);if (retry_estale(error, lookup_flags)) {lookup_flags | LOOKUP_REVAL;goto retry;}out:return error;}user_path_at 使用 path_init link_path_walk 的路径遍历机制将用户态路径解析为 struct path包含 dentry 和 vfsmount。如果文件名是/proc/self/exe或包含符号链接路径遍历会在适当位置跟踪符号链接。vfs_getattr 是获取文件属性的调度中心cint vfs_getattr(const struct path *path, struct kstat *stat,u32 request_mask, unsigned int query_flags){struct inode *inode d_backing_inode(path-dentry);memset(stat, 0, sizeof(*stat));stat-result_mask 0;if (inode-i_op-getattr)return inode-i_op-getattr(path, stat, request_mask, query_flags);generic_fillattr(inode, stat);return 0;}大多数文件系统都实现了自己的 getattr。ext4 的 ext4_getattr 在调用 generic_fillattr 之前额外检查 inode 是否具有 EXT4_EA_INODE_FL 标志并报告 i_projidproject ID给 statx。generic_fillattr 将 inode 中的原始信息填入 struct kstatcvoid generic_fillattr(struct inode *inode, struct kstat *stat){stat-dev inode-i_sb-s_dev;stat-ino inode-i_ino;stat-mode inode-i_mode;stat-nlink inode-i_nlink;stat-uid from_kuid_munged(init_user_ns, inode-i_uid);stat-gid from_kgid_munged(init_user_ns, inode-i_gid);stat-rdev inode-i_rdev;stat-size i_size_read(inode);stat-atime inode-i_atime;stat-mtime inode-i_mtime;stat-ctime inode-i_ctime;stat-blksize i_blocksize(inode);stat-blocks inode-i_blocks;}struct kstat 是内核内部的通用结构体包含 64 位的时间戳、块大小和块计数等信息不依赖架构。但用户态的 struct stat 在不同架构上布局不同。cp_new_stat 负责将 kstat 转换为用户态可见的格式cstatic int cp_new_stat(struct kstat *stat, struct stat __user *statbuf){struct stat tmp;tmp.st_dev new_encode_dev(stat-dev);tmp.st_ino stat-ino;tmp.st_mode stat-mode;tmp.st_nlink stat-nlink;tmp.st_uid from_kuid_munged(init_user_ns, stat-uid);tmp.st_gid from_kgid_munged(init_user_ns, stat-gid);tmp.st_rdev new_encode_dev(stat-rdev);tmp.st_size stat-size;tmp.st_atime stat-atime.tv_sec;tmp.st_mtime stat-mtime.tv_sec;tmp.st_ctime stat-ctime.tv_sec;#ifdef STAT_HAVE_NSECtmp.st_atime_nsec stat-atime.tv_nsec;tmp.st_mtime_nsec stat-mtime.tv_nsec;tmp.st_ctime_nsec stat-ctime.tv_nsec;#endiftmp.st_blocks stat-blocks;tmp.st_blksize stat-blksize;return copy_to_user(statbuf, tmp, sizeof(tmp));}在 x86_64 架构上struct stat 的大小为 144 字节包含 st_atime_nsec 等纳秒字段。new_encode_dev 将内核使用的 dev_t包含 major 和 minor 号编码为用户态可理解的形式。对于 32 位用户态在 64 位内核上运行CONFIG_COMPAT需要 compat_sys_stat64 或 compat_sys_newfstatat 等入口。compat 版本使用 struct compat_stat64其字段宽度与 32 位 glibc 对齐避免在 64 位内核和 32 位用户态之间传递错误布局的数据。statx(2) 系统调用提供了更细粒度的控制。它不经过传统的 vfs_stat 路径而是直接调用 vfs_statx 后返回 struct statx 给用户态。struct statx 包含 stx_mask 位图标记哪些字段有效允许调用方只请求自己关心的属性request_mask在网络文件系统等场景下减少 RPC 开销。

相关新闻

3分钟掌握Stable Diffusion Prompt Reader:轻松提取和管理AI绘画提示词

3分钟掌握Stable Diffusion Prompt Reader:轻松提取和管理AI绘画提示词

3分钟掌握Stable Diffusion Prompt Reader:轻松提取和管理AI绘画提示词 【免费下载链接】stable-diffusion-prompt-reader A simple standalone viewer for reading prompts from Stable Diffusion generated image outside the webui. 项目地址: https://gitcode…

2026/7/21 10:15:50阅读更多 →
抖音下载器完整指南:告别手动保存,3步实现批量无水印下载

抖音下载器完整指南:告别手动保存,3步实现批量无水印下载

抖音下载器完整指南:告别手动保存,3步实现批量无水印下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser …

2026/7/21 10:15:50阅读更多 →
智能炉石传说脚本:5分钟自动化你的卡牌对战体验

智能炉石传说脚本:5分钟自动化你的卡牌对战体验

智能炉石传说脚本:5分钟自动化你的卡牌对战体验 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 你是否曾经因为重复的日常任务而感到疲惫&a…

2026/7/21 10:15:50阅读更多 →
如何在Windows上打造最佳B站体验?Bili.UWP深度评测

如何在Windows上打造最佳B站体验?Bili.UWP深度评测

如何在Windows上打造最佳B站体验?Bili.UWP深度评测 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp 你是否厌倦了在浏览器中观看B站视频时频繁的广告弹窗和卡顿?是否渴望在Windows平…

2026/7/21 18:06:22阅读更多 →
nebula.gl GeoJSON编辑实战:5分钟创建你的第一个可编辑地图应用

nebula.gl GeoJSON编辑实战:5分钟创建你的第一个可编辑地图应用

nebula.gl GeoJSON编辑实战:5分钟创建你的第一个可编辑地图应用 【免费下载链接】nebula.gl A suite of 3D-enabled data editing overlays, suitable for deck.gl 项目地址: https://gitcode.com/gh_mirrors/ne/nebula.gl 你是否想要快速构建一个功能强大的…

2026/7/21 18:06:22阅读更多 →
告别复杂金融模型!Kronos:让普通投资者也能用AI预测股市的终极指南

告别复杂金融模型!Kronos:让普通投资者也能用AI预测股市的终极指南

告别复杂金融模型!Kronos:让普通投资者也能用AI预测股市的终极指南 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 你是否曾经看着…

2026/7/21 18:06:22阅读更多 →
FlashAttention终极指南:5步搞定高性能注意力机制编译与优化

FlashAttention终极指南:5步搞定高性能注意力机制编译与优化

FlashAttention终极指南:5步搞定高性能注意力机制编译与优化 【免费下载链接】flash-attention Fast and memory-efficient exact attention 项目地址: https://gitcode.com/GitHub_Trending/fl/flash-attention 在当今大模型时代,Transformer架构…

2026/7/21 18:06:22阅读更多 →
AutoX:5大理由让你选择这款安卓自动化神器

AutoX:5大理由让你选择这款安卓自动化神器

AutoX:5大理由让你选择这款安卓自动化神器 【免费下载链接】AutoX A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具) 项目地址: https://gitcode.com/gh_mirrors/au/AutoX AutoX 是一款强大的安卓平台自动化工具&…

2026/7/21 18:06:22阅读更多 →
5分钟快速上手next-data-hooks:简化Next.js数据获取的完整教程

5分钟快速上手next-data-hooks:简化Next.js数据获取的完整教程

5分钟快速上手next-data-hooks:简化Next.js数据获取的完整教程 【免费下载链接】next-data-hooks Use getStaticProps/getServerSideProps as react-hooks 项目地址: https://gitcode.com/gh_mirrors/ne/next-data-hooks next-data-hooks是一个专为Next.js设…

2026/7/21 18:04:22阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →