#include <linux/module.h>
#include <linux/fs.h>
#define DEVICE_NAME "mydevice" // 设备名称
#define BUF_LEN 1024 // 缓冲区大小
static int major_num = 0; // 主设备号
static char buffer[BUF_LEN]; // 缓冲区
// 初��化函数
static int mydevice_init(void)
{
printk(KERN_INFO "mydevice: Initializing...\n");
// 分配主设备号,设为0表示自动分配
major_num = register_chrdev(0, DEVICE_NAME, &mydevice_fops);
if (major_num < 0) {
printk(KERN_ALERT "mydevice: Failed to register a major number\n");
return major_num;
}
printk(KERN_INFO "mydevice: Registered successfully with major number %d\n", major_num);
return 0;
}
// 设备打开函数
static int mydevice_open(struct inode *inodep, struct file *filep)
{
printk(KERN_INFO "mydevice: Device opened\n");
// 创建并初始化私有数据
filep->private_data = kmalloc(BUF_LEN, GFP_KERNEL);
memset(filep->private_data, 0, BUF_LEN);
return 0;
}
// 设备释放函数
static int mydevice_release(struct inode *inodep, struct file *filep)
{
printk(KERN_INFO "mydevice: Device released\n");
// 清理私有数据并释放内存
kfree(filep->private_data);
return 0;
}
// 设备读取函数
static ssize_t mydevice_read(struct file *filep, char *buffer, size_t len, loff_t *offset)
{
int bytes_read = 0;
// 从设备中读取数据到用户空间的缓冲区中
bytes_read = snprintf(buffer, len, "%s", (char*)filep->private_data);
printk(KERN_INFO "mydevice: Read %d bytes from device\n", bytes_read);
return bytes_read;
}
// 设备写入函数
static ssize_t mydevice_write(struct file *filep, const char *buffer, size_t len, loff_t *offset)
{
// 将用户空间的缓冲区中的数据写入到设备中
strncpy((char*)filep->private_data, buffer, len);
printk(KERN_INFO "mydevice: Wrote %zu bytes to device\n", len);
return len;
}
// 设备操作函数
static struct file_operations mydevice_fops = {
.owner = THIS_MODULE,
.open = mydevice_open,
.release = mydevice_release,
.read = mydevice_read,
.write = mydevice_write,
};
// 注销函数
static void mydevice_exit(void)
{
unregister_chrdev(major_num, DEVICE_NAME);
printk(KERN_INFO "mydevice: Unregistered successfully\n");
}
module_init(mydevice_init);
module_exit(mydevice_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("作者名字");
MODULE_DESCRIPTION("一个简单的字符驱动例子);
这个驱动程序实现了一个简单的字符设备,包括初始化、设备打开、设备释放、设备读取和设备写入等功能。在驱动程序被加载到内核中时,模块初始化函数会被调用,并注册字符设备。当用户空间的应用程序使用该设备时,设备打开、读取和写入函数会被调用,用于建立设备与用户空间之间的连接并进行数据传输。最后,在驱动程序退出时,注销函数会被调用,确保设备在下次加载前能够正确地被释放和重置。