/* * chardev.h - 包含 ioctl 定义的头文件。 * 这些声明必须放在头文件中,因为它们需要同时被内核模块(在 chardev2.c 中)和调用 ioctl() 的进程(在 userspace_ioctl.c 中)所知晓。 */ #ifndef CHARDEV_H #define CHARDEV_H #include /* 主设备号。由于 ioctl 需要知道主设备号,我们不能再依赖动态注册。 */ #define MAJOR_NUM 100 /* 设置设备驱动的消息 */ #define IOCTL_SET_MSG _IOW(MAJOR_NUM, 0, char *) /* _IOW 表示我们正在创建一个 ioctl 命令,用于将信息从用户进程传递到内核模块。 * 第一个参数 MAJOR_NUM 是我们使用的主设备号。 * 第二个参数是命令的编号(可以有多个命令,含义不同)。 * 第三个参数是我们希望从进程传递到内核的数据类型。 */ /* 获取设备驱动的消息 */ #define IOCTL_GET_MSG _IOR(MAJOR_NUM, 1, char *) /* 此 IOCTL 用于输出,获取设备驱动的消息。 * 需要一个缓冲区来存放消息,该缓冲区由进程分配。 */ /* 获取消息的第 n 个字节 */ #define IOCTL_GET_NTH_BYTE _IOWR(MAJOR_NUM, 2, int) /* 此 IOCTL 用于输入和输出。它从用户获取一个数字 n,并返回消息的第 n 个字节。 */ /* 设备文件的名称 */ #define DEVICE_FILE_NAME "char_dev" #define DEVICE_PATH "/dev/char_dev" #endif