调用rmmod无法进入函数
附代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/cdev.h>
#include <linux/io.h>
#include <asm/io.h>
#include <linux/device.h>
#define TEST_MAJOR 250
#define TEST_NAME "test"
/*可以根据物理地址,可通过ioremap()获得虚拟地址*/
#define GPMCON0xF4500820//这里是虚拟地址,物理地址是0x7F008820
#define GPMDAT0xF4500824//物理地址0x7F008824
struct cdev test_dev;
static dev_t ndev=MKDEV(TEST_MAJOR, 0);
static struct class *autodev;
static struct class_device * autodev_class;
static ssize_t test_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
return 0;
}
static ssize_t test_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
return 0;
}
static long test_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
unsigned char tmp=0;
tmp = cmd;
outl(tmp, GPMDAT);//与writel(0x00, GPMDAT); 相同
return 0;
}
struct file_operations test_fops=
{
.owner = THIS_MODULE,
.read = test_read,
.write = test_write,
.unlocked_ioctl = test_ioctl,
};
static int test_init(void)
{
int ret;
cdev_init(&test_dev, &test_fops);
//alloc_chrdev_region(&ndev, 0, 1, TEST_NAME);
register_chrdev_region(ndev, 1, TEST_NAME);
ret = cdev_add(&test_dev, ndev, 1);
autodev = class_create(THIS_MODULE,TEST_NAME);
autodev_class = device_create(autodev,NULL,ndev,NULL,TEST_NAME);
printk(KERN_INFO"hello word enter is OK\n");
return 0;
}
static void test_exit(void)
{
printk(KERN_INFO"hello word exit\n");
device_destroy(autodev,ndev); //必须先删除设备
class_destroy(autodev); //后删除class类
unregister_chrdev_region(ndev, 1);
cdev_del(&test_dev);
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
执行insmod没问题的,可以加载并且自动在dev下创建设备节点文件,可是rmmod,连第一句打印信息都没有,dmesg看了也没有打印信息,确定是没进入到函数test_exit()
求解决办法
[解决办法]
测试:
写个简单的helloworld驱动,ismod后rmmod试试。
如果rmmod 没反应,则该命令的问题。
或者直接测试:
rmmod aaa (aaa不存在,如果rmmod命令是好的,应该报错的)
如果不报错,则说明rmmod命令根本就是空链接。