挂载
- 挂载设备
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 0chmod 666 /dev/004_register_cdevls /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);