利用内核模块创建一个设备文件节点。
时间: 2024-03-23 12:37:39 浏览: 67
基于linux3.16内核模块,手动创建设备节点
在 Linux 中,可以使用内核模块来创建设备文件节点。以下是创建设备文件节点的步骤:
1.创建内核模块代码文件:
首先,需要创建一个内核模块代码文件,例如 `mydevice.c`。
```
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
MODULE_LICENSE("Dual BSD/GPL");
static int mydevice_major = 0;
static int mydevice_minor = 0;
static struct cdev mydevice_cdev;
static int mydevice_open(struct inode *inode, struct file *filp)
{
printk(KERN_INFO "mydevice: open\n");
return 0;
}
static int mydevice_release(struct inode *inode, struct file *filp)
{
printk(KERN_INFO "mydevice: release\n");
return 0;
}
static ssize_t mydevice_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
printk(KERN_INFO "mydevice: read\n");
return 0;
}
static ssize_t mydevice_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
printk(KERN_INFO "mydevice: write\n");
return 0;
}
static struct file_operations mydevice_fops = {
.owner = THIS_MODULE,
.open = mydevice_open,
.release = mydevice_release,
.read = mydevice_read,
.write = mydevice_write,
};
static int __init mydevice_init(void)
{
int err = 0;
dev_t devno = 0;
printk(KERN_INFO "mydevice: init\n");
/* Allocate major and minor numbers */
err = alloc_chrdev_region(&devno, mydevice_minor, 1, "mydevice");
if (err < 0) {
printk(KERN_ERR "mydevice: alloc_chrdev_region failed\n");
return err;
}
mydevice_major = MAJOR(devno);
/* Initialize cdev structure */
cdev_init(&mydevice_cdev, &mydevice_fops);
mydevice_cdev.owner = THIS_MODULE;
/* Add cdev to kernel */
err = cdev_add(&mydevice_cdev, devno, 1);
if (err < 0) {
printk(KERN_ERR "mydevice: cdev_add failed\n");
unregister_chrdev_region(devno, 1);
return err;
}
return 0;
}
static void __exit mydevice_exit(void)
{
dev_t devno = MKDEV(mydevice_major, mydevice_minor);
printk(KERN_INFO "mydevice: exit\n");
/* Remove cdev from kernel */
cdev_del(&mydevice_cdev);
/* Free major and minor numbers */
unregister_chrdev_region(devno, 1);
}
module_init(mydevice_init);
module_exit(mydevice_exit);
```
2.编译内核模块:
使用以下命令编译内核模块:
```
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
```
其中,`$(uname -r)` 获取当前 Linux 内核版本号,`$(pwd)` 获取当前目录。
3.加载内核模块:
使用以下命令加载内核模块:
```
sudo insmod mydevice.ko
```
4.创建设备文件节点:
使用以下命令创建设备文件节点:
```
sudo mknod /dev/mydevice c <major> <minor>
```
其中,`<major>` 和 `<minor>` 分别为内核模块中分配的主设备号和次设备号。
现在,就可以访问设备文件节点 `/dev/mydevice`,与内核模块中的设备进行通信了。
阅读全文