cdev
是 Linux 内核中的一个设备驱动模型组件,用于表示字符设备。字符设备是一种按字节流进行数据传输的设备,如串口、键盘、鼠标等。cdev
结构体是 Linux 2.6 内核引入的设备驱动模型的一部分,它简化了字符设备驱动的注册和管理过程。
cdev
结构体的函数。cdev
结构体添加到内核的设备列表中的函数。以下是一个简单的 cdev
初始化示例:
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
static struct cdev my_cdev;
static dev_t dev_num;
static int my_open(struct inode *inode, struct file *file) {
// 设备打开时的操作
return 0;
}
static int my_release(struct inode *inode, struct file *file) {
// 设备关闭时的操作
return 0;
}
static struct file_operations fops = {
.open = my_open,
.release = my_release,
};
static int __init my_init(void) {
int ret;
// 动态分配设备号
ret = alloc_chrdev_region(&dev_num, 0, 1, "my_device");
if (ret < 0) {
printk(KERN_ERR "Failed to allocate device number\n");
return ret;
}
// 初始化 cdev
cdev_init(&my_cdev, &fops);
// 设置 cdev 的所有者
my_cdev.owner = THIS_MODULE;
// 将 cdev 添加到内核
ret = cdev_add(&my_cdev, dev_num, 1);
if (ret < 0) {
printk(KERN_ERR "Failed to add cdev\n");
unregister_chrdev_region(dev_num, 1);
return ret;
}
printk(KERN_INFO "Device registered with major number %d\n", MAJOR(dev_num));
return 0;
}
static void __exit my_exit(void) {
// 移除 cdev 并释放设备号
cdev_del(&my_cdev);
unregister_chrdev_region(dev_num, 1);
printk(KERN_INFO "Device unregistered\n");
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example of Linux cdev initialization");
问题: 设备注册失败,cdev_add
返回负值。
原因: 可能是由于设备号已被占用,或者内核内存不足。
解决方法:
alloc_chrdev_region
动态分配设备号,避免冲突。通过以上步骤,可以有效地初始化和管理 Linux 内核中的字符设备。