我写了一个实现IOCTL处理的基本模块。我试图将这个模块交叉编译到arm64,并与4.19.114内核源码进行对比。这是我的Makefile。
ARCH=arm64
CROSS_COMPILE=aarch64-linux-gnu-
obj-m := chardev.o
KDIR := linux-4.19.114
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
这是我的模块源码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/uaccess.h>
#define NAME "chardev_roi"
#define MAGIC 'a'
#define READPARAM 'b'
#define WRITEPARAM 'c'
#define IOCTL_READ_ROI _IOR(MAGIC, READPARAM, int64_t*)
#define IOCTL_WRITE_ROI _IOW(MAGIC, WRITEPARAM, int64_t*)
static ssize_t ext_read(struct file *filp, char __user *buf, size_t len, loff_t *off)
{
printk("Reading from driver\n");
return 0;
}
static ssize_t ext_write(struct file *filp, const char __user *buf, size_t len, loff_t *off)
{
printk("Writing to driver...\n");
return 0;
}
static long ext_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
char* _from_user_buffer = NULL;
switch (cmd)
{
case IOCTL_WRITE_ROI:
printk("IOCTL_WRITE_ROI just has benn called\n");
_from_user_buffer = kmalloc(32, GFP_KERNEL);
copy_from_user(_from_user_buffer, (char*) arg, sizeof(_from_user_buffer));
break;
case IOCTL_READ_ROI:
printk("IOCTL_READ_ROI just has been called\n");
copy_to_user((char*) arg, "Hello, World!\n", 14);
break;
}
}
static int init(void)
{
int major_number;
static struct file_operations _fops =
{
.owner = THIS_MODULE,
.read = ext_read,
.write = ext_write,
.unlocked_ioctl = ext_ioctl
};
major_number = register_chrdev(0, NAME, &_fops);
return 0;
}
运行这个命令 sudo ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -d -C linux-4.19.114 M=$(pwd) modules
抛出这个错误
./include/uapi/linux/types.h:5:10: fatal error: asm/types.h: No such file or directory
内核配置是 配置 没有任何变化。试着运行 make clean && make mrproper
但是没有任何帮助。
问题是我没有生成modules.Run。
make <args> modules
可能会解决这个问题