在Linux中,register_chrdev() 函数用于注册字符设备驱动程序。它的原型如下:
int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)参数说明:
major:主设备号,用于唯一标识字符设备驱动程序。name:设备驱动的名称,会在 /proc/devices 中显示。fops:指向包含设备驱动程序操作函数的结构体,常见的是 struct file_operations。该函数的作用是将字符设备驱动程序注册到内核中,以便其他程序可以使用该驱动程序提供的功能。注册成功后,就可以通过主设备号来访问该设备。
注册成功时,函数会返回分配到的主设备号;注册失败时,函数会返回一个负数错误码。
以下是一个使用 register_chrdev() 函数注册字符设备驱动程序的示例:
#include <linux/module.h>#include <linux/fs.h>#define MAJOR_NUM 240#define DEVICE_NAME "my_device"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 my_fops = { .open = my_open, .release = my_release,};static int __init my_init(void){ int ret; // 注册字符设备驱动程序 ret = register_chrdev(MAJOR_NUM, DEVICE_NAME, &my_fops); if (ret < 0) { printk(KERN_ALERT "Failed to register character device\n"); return ret; } printk(KERN_INFO "Character device registered with major number %d\n", ret); return 0;}static void __exit my_exit(void){ // 注销字符设备驱动程序 unregister_chrdev(MAJOR_NUM, DEVICE_NAME); printk(KERN_INFO "Character device unregistered\n");}module_init(my_init);module_exit(my_exit);MODULE_LICENSE("GPL");上述示例代码中,通过定义 my_open() 和 my_release() 函数来实现打开和关闭设备的操作。然后,定义 my_fops 结构体来注册设备驱动程序的操作函数。
在模块初始化函数 my_init() 中,使用 register_chrdev() 函数注册字符设备驱动程序。如果注册成功,会打印注册成功的主设备号;如果注册失败,会打印错误信息。
在模块退出函数 my_exit() 中,使用 unregister_chrdev() 函数注销字符设备驱动程序。