用途:该技能用于指导实现 Linux 字符设备驱动,重点覆盖 struct file_operations、cdev 注册、与用户空间的安全数据拷贝、ioctl 设计以及基础 mmap,定位比通用设备驱动技能更深入。
主要能力:
- 字符设备注册:使用 alloc_chrdev_region、cdev_init、cdev_add、class_create、device_create 等完成注册,现代驱动常在 probe 中使用 devm_* 变体。
- 安全的用户空间 I/O:实现 read/write,通过 copy_to_user、copy_from_user 访问 __user 指针,禁止直接解引用。
- ioctl 模式:用 _IO、_IOW 等宏定义命令,处理 copy_from_user,未知命令返回 -ENOTTY,双架构下推荐 compat_ioctl。
- mmap:使用 remap_pfn_range 将设备物理内存映射到用户空间,配合 pgprot_noncached;DMA 缓冲区映射需限制大小并做权限检查。
- poll 与异步 I/O:实现 poll 与 wake_up_interruptible 支持阻塞读,用 fasync_helper 支持 SIGIO。
使用方式:可通过如 /writing-char-drivers Add unlocked_ioctl SET_SPEED to existing platform driver 的方式调用该技能。
常见问题:-EFAULT 多为用户指针错误,需校验;ENOTTY 常因 ioctl magic 不匹配;主设备号冲突应改用动态分配;mmap SIGSEGV 多为缓存映射导致,需 pgprot_noncached;ioctl 中持自旋锁睡眠需先释放锁。
限制:具体价格、收费、平台支持与完整安装命令暂未提供。