gpt4 book ai didi

c - 使错误别名为 undefined symbol devone_init

转载 作者:行者123 更新时间:2023-11-30 18:11:18 24 4
gpt4 key购买 nike

我刚刚做了一个驱动程序,当我执行make时,它说使错误别名为 undefined symbol devone_init我找了很多网站都找不到同样的错误。因为我是新手设备编程,对init_module不太清楚。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/sched.h>
#include <asm/current.h>
#include <asm/uaccess.h>

MODULE_LICENCE("Dual BSD/GPL");

#define DRIVER_NAME "devone";

static int devone_devs = 2;
static int devone_major = 0;
module_param(devone_major. uint, 0);
static struct cdev devone_cdev;

static int devone_open(struct inode *inode, struct file *file)
{
printk("%s: major %d minor %d (pid %d)\n", __func__, imajor(inode), iminor(inode), current->pid);
inode->i_private = inode;
file->private_data = file;

printk("i_private=%p private_data=%p\n", inode->i_private, file->private_data);

return 0;
}

static int devone_close(struct inode *inode, struct file *file)
{
printk("%s: major %d minor %d (pid %d)\n", __func__, imajor(inode), iminor(inode), current->pid);
inode->i_private = inode;
file->private_data = file;

printk("i_private=%p private_data=%p\n", inode->i_private, file->private_data);

return 0;
}

struct file_operations devone_fops = {
.open = devone_opens;
.release = devone_close;
}

static int devone_init(void)
{
dev_t dev = MKDEV(devone_major, 0);
int alloc_ret = 0;
int major;
int cdev_err = 0;

alloc_ret = alloc_chrdev_region(&dev, 0, devone_devs, DRIVER_NAME);
if(alloc_ret)
goto error;
devone_major = major = MAJOR(dev);

cdev_init(&devone_cdev, &devone_fops);
devone_cdev.owner = THIS_MODULE;

cdev_err = cdev_add(&devone_cdev, MKDEV(devone_major, 0), devone_devs);

if(cdev_err)
goto error;

printk(KERN_ALERT "%s driver(%d) loaded\n", DRIVER_NAME, major);
return 0;

error:
if(cdev_err == 0)
cdev_del(devone_cdev);

if(alloc_ret == 0)
unregister_chrdev_region(dev, devone_devs);

return -1;
}

static void devone_exit(void)
{
dev_t dev = MKDEV(devone_major, 0);

cdev_del(&devone_cdev);

cdev_del(&devone_cdev);
unregister_chrdev_region(dev, devone_devs);

printk(KERN_ALERT "%s driver unloaded\n", DRIVER_NAME);
}

module_init(devone_init);
module_exit(devone_exit);

这是我的 makefile。当我添加 cflags 时,它返回 cflags 已更改。

#CFLAGS += -Wall
CFILES = devone.c

obj-m += sample.o

KDIR =/lib/modules/$(shell uname -r)/build
sample-objs := $(CFILES:.c=.o)

all:
$(MAKE) -C $(KDIR) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.* *.symvers *.order

最佳答案

代码中存在一些小问题,导致无法编译。正确编译的修改后的代码如下。您可以比较并找出差异。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/sched.h>
#include <asm/current.h>
#include <asm/uaccess.h>


#define DRIVER_NAME "devone"

static int devone_devs = 2;
static int devone_major = 0;
module_param(devone_major, uint, 0);
static struct cdev devone_cdev;

static int devone_open(struct inode *inode, struct file *file)
{
printk("%s: major %d minor %d (pid %d)\n", __func__, imajor(inode), iminor(inode), current->pid);
inode->i_private = inode;
file->private_data = file;

printk("i_private=%p private_data=%p\n", inode->i_private, file->private_data);

return 0;
}

static int devone_close(struct inode *inode, struct file *file)
{
printk("%s: major %d minor %d (pid %d)\n", __func__, imajor(inode), iminor(inode), current->pid);
inode->i_private = inode;
file->private_data = file;

printk("i_private=%p private_data=%p\n", inode->i_private, file->private_data);

return 0;
}

struct file_operations devone_fops = {
.open = devone_open,
.release = devone_close,
};

static int devone_init(void)
{
dev_t dev = MKDEV(devone_major, 0);
int alloc_ret = 0;
int major;
int cdev_err = 0;

alloc_ret = alloc_chrdev_region(&dev, 0, devone_devs, DRIVER_NAME);
if(alloc_ret)
goto error;
devone_major = major = MAJOR(dev);

cdev_init(&devone_cdev, &devone_fops);
devone_cdev.owner = THIS_MODULE;

cdev_err = cdev_add(&devone_cdev, MKDEV(devone_major, 0), devone_devs);

if(cdev_err)
goto error;

printk(KERN_ALERT "%s driver(%d) loaded\n", DRIVER_NAME, major);
return 0;

error:
if(cdev_err == 0)
cdev_del(&devone_cdev);

if(alloc_ret == 0)
unregister_chrdev_region(dev, devone_devs);

return -1;
}

static void devone_exit(void)
{
dev_t dev = MKDEV(devone_major, 0);

cdev_del(&devone_cdev);

cdev_del(&devone_cdev);
unregister_chrdev_region(dev, devone_devs);

printk(KERN_ALERT "%s driver unloaded\n", DRIVER_NAME);
}

module_init(devone_init);
module_exit(devone_exit);



MODULE_LICENSE("Dual BSD/GPL");

关于c - 使错误别名为 undefined symbol devone_init,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48594158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com