linux 2.6 驱动笔记(二)
字符设备驱动
linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分:
1. 定义一个字符类型设备驱动的结构体
struct globalmem_dev{ struct cdev cdev; /*linux 2.6 内核表示一个字符设备结构体 */ unsigned char mem[200]; };
其中cdev在cdev.h文件中定义如下:
struct cdev { struct kobject kobj; struct module *owner; struct file_operations *ops; //文件操作结构体 struct list_head list; dev_t dev; //设备号 unsigned long unsigned int count; };
2. 在驱动模块的加载、卸载函数中注册设备,同时绑定文件操作结构体
static const struct file_operations globalmem_fops = { .owner = THIS_MODULE, .llseek = globalmem_llseek, .read = globalmem_read, .write = globalmem_write, .open = globalmem_open, .release= globalmem_release}; //设备驱动加载 int globalmem_init(void){ int result; dev_t devno = MKDEV(200, 0); result = register_chrdev_region(devno, 1, "globalmem");//注册字符设备编号 globalmem_devp= kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL); memset(globalmem_devp, 0, sizeof(struct globalmem_dev)); cdev_init(&globalmem_devp->cdev, &globalmem_fops); globalmem_devp->cdev.owner = THIS_MODULE; int err = cdev_add(&globalmem_devp->cdev, devno, 1); return result; }
3. 实现文件操作的具体接口,以文件写为例:
static ssize_t globalmem_read(struct file *flip, char __user *buf, size_t size, loff_t *ppos){ //.... struct globalmem_dev *dev = flip->private_data; copy_to_user(buf, (void*)(dev->mem+p), count); //内核空间拷贝至用户空间 *ppos += count;
测试用应用代码如下:
#include<sys/types.h> #include<sys/stat.h> #include<stdio.h> #include<fcntl.h> void main(){ int fd,num; fd = open("/dev/globalmem", O_RDWR); if(fd != -1){ read(fd, &num, sizeof(int)); printf("the globalmem is %d\n", num); scanf("%d", &num); printf("the input is %d\n", num); write(fd, &num, sizeof(int)); read(fd, &num, sizeof(int)); printf("the new globalmem is %d/n", num); close(fd); }else{ printf("device err!"); } return; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)