实现具备读写功能的简单字符设备驱动示例

字符设备驱动的实现是 Linux 驱动开发的入门步骤之一,提供一个具备读写功能的简单字符设备驱动示例,适合初学者学习和使用。以下为驱动的核心代码及测试步骤:

代码示例

#include 
#include 
#include 
#include 

#define DEVICE_NAME "simple_char_dev"

static char device_buffer[1024];
static int dev_open(struct inode *inode, struct file *file) {
    return 0;
}
static int dev_release(struct inode *inode, struct file *file) {
    return 0;
}
static ssize_t dev_read(struct file *file, char __user *buf, size_t len, loff_t *offset) {
    size_t max_bytes = 1024 - *offset;
    size_t bytes_to_read = max_bytes > len ? len : max_bytes;
    if (copy_to_user(buf, device_buffer + *offset, bytes_to_read))
        return -EFAULT;
    *offset += bytes_to_read;
    return bytes_to_read;
}
static ssize_t dev_write(struct file *file, const char __user *buf, size_t len, loff_t *offset) {
    size_t max_bytes = 1024 - *offset;
    size_t bytes_to_write = max_bytes > len ? len : max_bytes;
    if (copy_from_user(device_buffer + *offset, buf, bytes_to_write))
        return -EFAULT;
    *offset += bytes_to_write;
    return bytes_to_write;
}
static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = dev_open,
    .release = dev_release,
    .read = dev_read,
    .write = dev_write,
};

static struct cdev simple_char_dev;
static int __init char_dev_init(void) {
    int ret;
    dev_t dev_num;
    alloc_chrdev_region(&dev_num, 0, 1, DEVICE_NAME);
    cdev_init(&simple_char_dev, &fops);
    ret = cdev_add(&simple_char_dev, dev_num, 1);
    return ret;
}
static void __exit char_dev_exit(void) {
    cdev_del(&simple_char_dev);
    unregister_chrdev_region(MKDEV(0, 0), 1);
}

module_init(char_dev_init);
module_exit(char_dev_exit);
MODULE_LICENSE("GPL");

测试步骤

  1. 编译并加载模块:使用 make 进行编译,然后通过 insmod 命令加载驱动模块。
  2. 创建设备节点:运行 mknod 命令为字符设备创建节点。
  3. 进行读写测试:使用 echocat 命令,验证字符设备的写入和读取功能。

注意事项

  • 确保具有相应的权限加载和操作字符设备。
  • 在写操作时需要考虑缓冲区的边界,以防止缓冲区溢出。

该示例为初学者提供了字符设备驱动的基本框架,适合学习如何实现字符设备的读写操作。

rar 文件大小:9.93KB