挂载

  • 挂载设备
insmod 004_file_operations.ko
  • 查看
lsmod
#可以看到
Module                  Size  Used by
004_file_operations       16384  0
cat /proc/devices
#可以看到
Character devices:
236 004_file_operations #(设备名称)
  • 创建设备节点(最好和代码中的一致)

    sudo mknod /dev/<设备名> c <主设备号> <次设备号>

    mknod /dev/004_register_cdev c 236 0
    
    chmod 666 /dev/004_register_cdev
    
    ls /dev/004*
    

卸载

  • 移除设备节点

    rm /dev/004_register_cdev
    
  • 取消挂载

    rmmod 004_file_operations.ko
    

代码:004_file_operations.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>

dev_t dev_no; // 设备号
struct cdev cdev_test; // 字符设备结构体

static int test_open(struct inode *inode,struct file *file)
{
    printk("open\n");
    return 0;
}
static ssize_t test_read(struct file *file,char __user *buf, size_t size,loff_t *off){
    printk("read\n");
    return 0;
}
static ssize_t test_write(struct file *file,const char __user *buf, size_t size,loff_t *off){
    printk("write\n");
    return 0;
}
static int test_release(struct inode *inode,struct file *file)
{
    printk("release\n");
    return 0;
}
struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = test_open,
    .read = test_read,
    .write = test_write,
    .release = test_release,
};

//设备名称
static char* name = "004_register_cdev";

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wyl");
MODULE_DESCRIPTION("004_register_cdev");
static int modulecdev_init(void)
{ 
    int ret;
    ret = alloc_chrdev_region(&dev_no, 0, 1, name);
    if (ret<0) {
        printk("alloc_chrdev_region failed\n");
        return ret;
    }
    printk("major:%d, minor:%d\n", MAJOR(dev_no), MINOR(dev_no));
    cdev_init(&cdev_test, &fops);
    cdev_add(&cdev_test, dev_no, 1);
    return 0;
}
static void modulecdev_exit(void)
{
    cdev_del(&cdev_test);
    unregister_chrdev_region(dev_no, 1);
    printk("modulecdev exit\n");
}

module_init(modulecdev_init);
module_exit(modulecdev_exit);