在Linux中,cdev(字符设备)是内核用于管理I/O设备的一种机制。设备初始化主要涉及创建一个cdev结构体,并将其注册到内核中。以下是一个简单的步骤指南,帮助你进行设备初始化:
register_chrdev_region函数完成。#include <linux/cdev.h>#include <linux/kernel.h>#include <linux/module.h>static int major;static struct class *my_class;static int __init my_cdev_init(void) { major = register_chrdev_region(MKDEV(major, 0), 1, "my_device", NULL); if (major < 0) { printk(KERN_ERR "register_chrdev_region failed with error %d\n", major); return major; } my_class = class_create(THIS_MODULE, "my_device_class"); if (!my_class) { unregister_chrdev_region(MKDEV(major, 0), 1); printk(KERN_ERR "class_create failed\n"); return -1; } // 设备初始化代码将在这里添加 return 0;}static void __exit my_cdev_exit(void) { class_destroy(my_class); unregister_chrdev_region(MKDEV(major, 0), 1);}module_init(my_cdev_init);module_exit(my_cdev_exit);创建设备文件节点:接下来,你需要在内核中创建设备文件节点。这可以通过cdev_add函数完成。#include <linux/cdev.h>static struct cdev my_cdev;static int __init my_cdev_init(void) { // ...(省略了之前的代码) if (cdev_add(&my_cdev, MKDEV(major, 0), 1) < 0) { printk(KERN_ERR "cdev_add failed\n"); return -1; } // 设备初始化代码将在这里添加 return 0;}注意:cdev_add函数会自动为你的设备创建一个设备文件节点(例如/dev/my_device),你不需要手动创建它。
open、close、read、write等。这些函数将被内核调用,以处理与设备的交互。#include <linux/fs.h>#include <linux/dcache.h>#include <linux/path.h>#include <linux/namei.h>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 ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { // 设备读取时的处理代码 return count;}static ssize_t my_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { // 设备写入时的处理代码 return count;}static const struct file_operations my_fops = { .open = my_open, .release = my_release, .read = my_read, .write = my_write,};将设备操作与设备文件节点关联:最后,你需要将设备操作与设备文件节点关联起来。这可以通过cdev_set_fops函数完成。static int __init my_cdev_init(void) { // ...(省略了之前的代码) cdev_set_fops(&my_cdev, &my_fops); return 0;}现在,你已经完成了设备的初始化工作。当模块被加载到内核时,设备文件节点将自动创建,并且用户空间可以通过/dev/my_device访问你的设备。