字符设备 内核驱动open函数验证示例
下面是一个字符设备内核驱动的open函数验证示例:
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
static int mydev_open(struct inode *inode, struct file *file)
{
printk(KERN_INFO "mydev: Device opened\n");
return 0;
}
static int mydev_release(struct inode *inode, struct file *file)
{
printk(KERN_INFO "mydev: Device released\n");
return 0;
}
static struct file_operations mydev_fops = {
.owner = THIS_MODULE,
.open = mydev_open,
.release = mydev_release,
};
static dev_t devno;
static struct cdev mydev_cdev;
static int __init mydev_init(void)
{
int result;
// 分配设备号
result = alloc_chrdev_region(&devno, 0, 1, "mydev");
if (result < 0) {
printk(KERN_ERR "mydev: Failed to allocate device number\n");
return result;
}
// 初始化字符设备
cdev_init(&mydev_cdev, &mydev_fops);
mydev_cdev.owner = THIS_MODULE;
// 注册字符设备到内核
result = cdev_add(&mydev_cdev, devno, 1);
if (result < 0) {
printk(KERN_ERR "mydev: Failed to add character device\n");
unregister_chrdev_region(devno, 1);
return result;
}
printk(KERN_INFO "mydev: Initialized\n");
return 0;
}
static void __exit mydev_exit(void)
{
// 从内核注销字符设备
cdev_del(&mydev_cdev);
// 释放设备号
unregister_chrdev_region(devno, 1);
printk(KERN_INFO "mydev: Exited\n");
}
module_init(mydev_init);
module_exit(mydev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Character device kernel driver");
在这个示例中,mydev_open函数在设备被打开时被调用,mydev_release函数在设备被释放时被调用。这里简单地打印一条信息来验证设备是否成功被打开和释放。
在mydev_init函数中,首先使用alloc_chrdev_region函数分配一个设备号,然后使用cdev_init函数初始化字符设备结构体,并将设备号和文件操作结构体关联起来。最后使用cdev_add函数将字符设备注册到内核。
在mydev_exit函数中,使用cdev_del函数从内核注销字符设备,并使用unregister_chrdev_region函数释放设备号。
需要注意的是,该示例只包含了打开和释放设备的验证代码,其他操作如读写数据等并未包含在内。根据需求可以在这个基础上进行扩展。
原文地址: https://www.cveoy.top/t/topic/jbKw 著作权归作者所有。请勿转载和采集!