在Linux系统中/dev目录下的节点主要是设备文件这些文件代表了系统中的各种设备。设备文件可以分为字符设备和块设备两大类每个设备文件都有一个主设备号和次设备号分别标识设备类型和设备的具体实例。设备文件可以通过以下几种方式创mknodudev。设备文件的主要作用是充当设备驱动程序与实际硬件设备之间的接口使用户空间程序能够通过标准的文件I/O操作如读、写、打开、关闭等与硬件设备进行交互。字符设备字符设备是按字符流方式进行I/O操作的设备如终端、串口、键盘等。块设备块设备是以数据块为单位进行I/O操作的设备如硬盘、光驱、USB存储设备等。通过设备文件用户空间程序可以方便地访问和操作硬件设备而不需要直接与硬件交互。这种抽象层次使得Linux系统具有高度的可扩展性和灵活性。例子使用mknod命令创建设备文件sudo su mknod /dev/mychardev c 200 0 chmod 666 /dev/mychardev编写内核模块驱动程序#include linux/module.h #include linux/fs.h #include linux/uaccess.h #define DEVICE_NAME mychardev #define BUF_LEN 80 static int major; static char msg[BUF_LEN]; static char *msg_ptr; static int device_open(struct inode *inode, struct file *file) { msg_ptr msg; try_module_get(THIS_MODULE); return 0; } static int device_release(struct inode *inode, struct file *file) { module_put(THIS_MODULE); return 0; } static ssize_t device_read(struct file *file, char __user *buffer, size_t length, loff_t *offset) { int bytes_read 0; if (*msg_ptr 0) return 0; while (length *msg_ptr) { put_user(*(msg_ptr), buffer); length--; bytes_read; } return bytes_read; } static ssize_t device_write(struct file *file, const char __user *buffer, size_t length, loff_t *offset) { int i; for (i 0; i length i BUF_LEN; i) get_user(msg[i], buffer i); msg_ptr msg; return i; } static struct file_operations fops { .read device_read, .write device_write, .open device_open, .release device_release }; static int __init mychardev_init(void) { major register_chrdev(0, DEVICE_NAME, fops); if (major 0) { printk(KERN_ALERT Registering char device failed with %d\n, major); return major; } printk(KERN_INFO I was assigned major number %d. To talk to\n, major); printk(KERN_INFO the driver, create a dev file with\n); printk(KERN_INFO mknod /dev/%s c %d 0.\n, DEVICE_NAME, major); printk(KERN_INFO Try various minor numbers. Try to cat and echo to\n); printk(KERN_INFO the device file.\n); return 0; } static void __exit mychardev_exit(void) { unregister_chrdev(major, DEVICE_NAME); printk(KERN_INFO Goodbye, world!\n); } module_init(mychardev_init); module_exit(mychardev_exit); MODULE_LICENSE(GPL); MODULE_AUTHOR(Your Name); MODULE_DESCRIPTION(A simple character device driver);Makefileobj-m mychardev.o all: make -C /lib/modules/$(shell uname -r)/build M$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M$(PWD) clean加载sudo insmod mychardev.ko sudo rmmod mychardev使用echo Hello, world! /dev/mychardev cat /dev/mychardev