Вот мой код, он проще, там функции не определены. Только создание устройства при загрузке модуля и десоздание при выгрузке. Всё.
chardev.c
Код: Выделить всё
/*
* chardev.c: Creates a read-only char device that says how many times
* you have read from the dev file
*/
#include <linux/atomic.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h> /* for sprintf() */
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/types.h>
#include <linux/uaccess.h> /* for get_user and put_user */
#include <linux/version.h>
#include <asm/errno.h>
#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */
#define BUF_LEN 80 /* Max length of the message from the device */
/* Global variables are declared as static, so are global within the file. */
static int major; /* major number assigned to our device driver */
static struct class *cls;
static struct file_operations chardev_fops;
static int __init chardev_init(void)
{
major = register_chrdev(0, DEVICE_NAME, &chardev_fops);
if (major < 0) {
pr_alert("Registering char device failed with %d\n", major);
return major;
}
pr_info("I was assigned major number %d.\n", major);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)
cls = class_create(DEVICE_NAME);
#else
cls = class_create(THIS_MODULE, DEVICE_NAME);
#endif
if (IS_ERR(cls)) {
pr_err("Failed to create class for device\n");
unregister_chrdev(major, DEVICE_NAME);
return PTR_ERR(cls);
}
device_create(cls, NULL, MKDEV(major, 0), NULL, DEVICE_NAME);
pr_info("Device created on /dev/%s\n", DEVICE_NAME);
return 0;
}
static void __exit chardev_exit(void)
{
device_destroy(cls, MKDEV(major, 0));
class_destroy(cls);
/* Unregister the device */
unregister_chrdev(major, DEVICE_NAME);
}
/////////////////////////////////////
module_init(chardev_init);
module_exit(chardev_exit);
MODULE_LICENSE("GPL");
Makefile
Код: Выделить всё
obj-m += chardev.o
PWD := $(CURDIR)
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Shell
$ sudo insmod chardev.ko
$
Shell
$ ls -l /dev/chardev
crw------- 1 root root 245, 0 июн 9 14:34 /dev/chardev
$А как найтим-то? Вот тут сказано как:
https://www.baeldung.com/linux/find-device-drivers
Но у меня там ничего не получилось, ссылки указывают на папки, где эти ссылки находятся. В общем, я так скопом все дравера посмотрел. Нет здесь номера 245
Shell
$ ls -l /sys/dev/*/*/device/driver
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/block/11:0/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/block/8:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/21:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/21:1/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/226:0/device/driver -> ../../../bus/pci/drivers/vmwgfx
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/226:128/device/driver -> ../../../bus/pci/drivers/vmwgfx
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/246:0/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/248:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/248:1/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/251:0/device/driver -> ../../../bus/platform/drivers/rtc_cmos
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/29:0/device/driver -> ../../../bus/pci/drivers/vmwgfx
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/4:64/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/4:65/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/4:66/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 июн 9 14:15 /sys/dev/char/4:67/device/driver -> ../../../bus/platform/drivers/serial8250
$