LDD Chapter-6
文章平均质量分 89
本专栏为技术书籍翻译,个人根据经验做了整理。一边学英语,一边学技术。
DeeplyMind
图形领域、AI领域技术开发者,专注于OpenGL/Vulkan图形渲染和AI计算的GPU驱动、GPU硬件开发技术栈和实践。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
第6章:字符设备驱动的高级操作8:Device Control Without ioctl
本文探讨了字符设备驱动中通过write系统调用实现设备控制的技术方案。通过分析控制台驱动的转义序列案例,阐述了这种方式的优点(无需专用程序、支持远程控制)和缺点(可能被数据干扰)。文章比较了write解析命令与ioctl两种控制方式的适用场景:简单命令型设备适合前者,数据交互型设备需要后者。最后总结了Linux驱动设计原则——根据设备特性选择控制策略,命令型优先write,数据型必须ioctl,并强调了安全性考量。原创 2026-06-06 10:02:18 · 342 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作1:ioctl 系统调用
本章介绍了如何开发功能更完善的字符设备驱动,重点讲解了ioctl系统调用的实现。ioctl是设备控制的核心接口,允许用户空间通过文件描述符发送各种硬件控制命令。虽然ioctl因缺乏结构化而逐渐被替代,但它仍是实现设备操作最直接的方式。驱动中的ioctl方法通过switch语句处理不同命令,并要注意参数类型转换问题。此外,本章还探讨了用户空间同步、非阻塞I/O等高级功能,所有示例都基于内存虚拟设备实现,无需特定硬件即可测试。这些内容为后续开发实际硬件驱动奠定了基础。原创 2026-01-29 20:58:02 · 1554 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作2:Choosing the ioctl Commands
摘要:本文介绍了Linux字符设备驱动中ioctl命令的设计规范。为确保命令唯一性,ioctl编号应采用4个位域:8位魔数(需参考ioctl-number.txt)、8位序号、数据传输方向(无/读/写/双向)和数据大小。内核提供了_IO、_IOR、_IOW和_IOWR等宏来定义命令,并通过示例展示了scull驱动如何实现参数设置/获取功能。虽然可以直接使用标量值定义命令,但遵循位域规范更利于代码维护和内核兼容性。文中还解释了原子交换操作的实际应用场景和命令编号的设计原则。原创 2026-01-31 09:50:29 · 1593 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作3:Choosing the ioctl Commands
本文介绍了scull驱动中ioctl命令的实现方式,重点分析了不同类型命令(S/T/G/Q/X/H)的功能特点和参数传递机制。其中,S/G命令用于设置/获取参数(指针传递),T/Q命令直接传递/返回简单值,X/H实现原子操作组合。文章强调内核推荐指针传递方式,因其具有更好的错误检测和扩展性,并指出原子操作在多线程环境中的重要性。同时对比了现代位域命令号与老式标量命令号的优劣,建议遵循幻数和序号的分配规范以提高代码质量。原创 2026-01-31 11:06:04 · 1677 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作4:The Return Value And The Predefined Commands
ioctl 实现通常基于命令号的 switch 语句。当命令号不匹配有效操作时,default 分支应返回 -EINVAL("无效参数")或 -ENOTTY(POSIX 标准规定)。尽管后者更符合标准解释为"对设备执行了不恰当的 ioctl 操作",但返回 -EINVAL 的做法仍很常见。内核预定义了一些通用 ioctl 命令(幻数为 T)。原创 2026-04-19 09:30:21 · 773 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作5:Using the ioctl Argument
本文摘要主要讨论了Linux驱动程序中ioctl系统调用的安全性实现,重点围绕用户空间指针验证和高效数据传输。文章详细介绍了access_ok函数的作用,它用于验证用户空间地址是否合法,但不保证完整的内存访问安全。同时比较了put_user/get_user和__put_user/__get_user宏的区别,前者会自动验证地址,后者需要预先调用access_ok。此外还强调了错误处理的重要性,如返回-EFAULT表示无效地址,-ENOTTY表示无效命令。原创 2026-04-24 15:06:55 · 509 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作6:Capabilities and Restricted Operations
摘要: Linux内核通过能力(capabilities)机制实现细粒度的权限控制,取代传统的超级用户全权模式。设备驱动程序需主动检查用户进程是否具备特定能力(如CAP_SYS_ADMIN),以防止未授权操作(如修改磁盘块大小或格式化磁盘)。能力系统将特权分解为独立子集(如CAP_NET_ADMIN管理网络、CAP_SYS_RAWIO控制原始I/O),开发者可通过capable()函数验证权限。例如,scull驱动仅允许具备CAP_SYS_ADMIN能力的用户修改量子集大小,否则返回-EPERM。原创 2026-04-24 15:15:53 · 490 阅读 · 0 评论 -
第6章:字符设备驱动的高级操作7:The Implementation of the ioctl Commands
本文介绍了Linux字符设备驱动中ioctl命令的高级实现方法,以scull驱动为例展示了六种参数传递模式:通过指针设置(S)、直接传值设置(T)、指针获取(G)、返回值获取(Q)、指针原子交换(X)和值原子交换(H)。重点分析了权限控制机制(CAP_SYS_ADMIN能力检查)、内核空间与用户空间数据交互函数(__get_user/__put_user)以及错误处理。原创 2026-06-06 09:35:13 · 221 阅读 · 0 评论
分享