03_添加一个简单的字符设备并支持read操作
register_chrdev()
第一个参数为0 则会自行动态分配主设备号,否则分配传入主设备号,0-255的子设备号;
第二个参数为标签
第三个为文件操作的指针,file_operations 表示这个字符设备支持的文件操作
返回值为注册主设备号,若返回值小于0则代表注册失败了;需要注意的时如果注册时指定的主设备号,那么返回值会变成0
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
static int major;
static ssize_t read(struct file *f, char __user *u, size_t l, loff_t *o)
{
printk("read func called here\n");
return 0;
}
static struct file_operations fops = {
.read = read /* 这里只提供一个read方法 */
};
// enter character print something
int character_init(void)
{
major = register_chrdev(0, "my_test_cdev", &fops);
if (major < 0) {
printk("error happens while register my cdev\n");
return major;
}
printk("cdev register success, dev mahor is %d\n", major);
printk("this is character dev register enter\n");
return 0;
}
// exit character print something
void character_exit(void)
{
printk("this is character exit\n");
}
// func register
module_init(character_init);
module_exit(character_exit);
// add license
MODULE_LICENSE("GPL");
MODULE_AUTHOR("krifood");
MODULE_DESCRIPTION("driver for registering a cdev");
编译这个模块,在日志中找到系统分配的主设备号,然后通过mknod命令新增一个节点
sudo mknod myread c 240 0
新增成功后 可以通过myread进行访问操作 其中参数c指是一个字符设备 240是我们之前申请出来的主设备号
ps: 我这里在模块加载期间是可以直接使用myread访问的,我在卸载了驱动模块后,再次尝试进行访问时,我的WSL崩溃了 不知道其他环境上是什么现象。。。