首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

bus device driver写测试驱动的时候 空指针出错解决思路

2012-03-13 
bus device driver写测试驱动的时候 空指针出错内核版本:linux-2.6.33 宿主机ubuntu9.04 板子fl2440最近学

bus device driver写测试驱动的时候 空指针出错
内核版本:linux-2.6.33 宿主机ubuntu9.04 板子fl2440
最近学到这,也是按着某教学机构的程序照着写的3个驱动bus,device,driver
贴下代码
bus.c

C/C++ code
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("Ying");MODULE_LICENSE("Dual BSD/GPL");static char *Version = "$Vying__1.0$" ;static int ying_match(struct device * dev , struct device_driver * drv){    return !strncmp(dev->init_name, drv->name, strlen(drv->name));}static void my_bus_release(struct device *dev){    printk(KERN_DEBUG "my bus release\n");}struct device ying_bus = {    .init_name   = "ying_bus0",    .release  = my_bus_release,};struct bus_type my_bus_type = {    .name = "ying_bus" ,    .match = ying_match ,};EXPORT_SYMBOL(ying_bus);EXPORT_SYMBOL(my_bus_type);static ssize_t show_bus_version(struct bus_type* bus,char* buf){    return snprintf(buf, PAGE_SIZE, "%s\n", Version);}static BUS_ATTR(version,S_IRUGO,show_bus_version,NULL);static int __init my_bus_init(void){    int ret;    /*注册总线*/    ret = bus_register(&my_bus_type);    if(ret)        return ret;    printk("%d---",ret);    /*注册属性文件*/    if(bus_create_file(&my_bus_type , &bus_attr_version))        printk("fail to attribute\n");    /*注册总线设备*/    ret = device_register(&ying_bus);    if (ret)        printk(KERN_NOTICE "Fail to register device:my_bus!\n");            return ret;}static void my_bus_exit(void){    device_unregister(&ying_bus);    bus_unregister(&my_bus_type);}module_init(my_bus_init);module_exit(my_bus_exit);


device.c
C/C++ code
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("ying");MODULE_LICENSE("Dual BSD/GPL");extern struct device ying_bus; extern struct bus_type my_bus_type;static void my_dev_release (struct device *dev){    printk("ying_dev release!!~\n");}struct device ying_dev = {    .init_name = "ying_dev",    .bus = &my_bus_type,    .parent = &ying_bus,    .release = my_dev_release,};static ssize_t mydev_show(struct device *dev,struct device_attribute *attr, char *buf){    return sprintf(buf, "%s\n", "This is ying device!");}static DEVICE_ATTR(dev, S_IRUGO, mydev_show, NULL);static int __init my_device_init(void){    int ret = 0;        ret = device_register(&ying_dev);        if(ret){        printk("fail to ying_dev\n");        return ret;    }    device_create_file(&ying_dev,&dev_attr_dev);        return ret ;}static void my_device_exit(void){    void device_unregister(struct device* dev);}module_init(my_device_init);module_exit(my_device_exit);


driver
C/C++ code
#include <linux/device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/string.h>MODULE_AUTHOR("David Xie");MODULE_LICENSE("Dual BSD/GPL");extern struct bus_type my_bus_type;static int my_probe(struct device *dev){    printk("Driver found device which ying driver can handle!\n");    return 0;}static int my_remove(struct device *dev){    printk("Driver found device unpluged!\n");    return 0;}struct device_driver ying_drv = {    .name = "ying_dev",    .bus = &my_bus_type,    .probe = my_probe,        .remove    = my_remove,};static ssize_t mydriver_show(struct device_driver *driver, char *buf){    return sprintf(buf, "%s\n", "This is my driver!");}static DRIVER_ATTR(drv, S_IRUGO, mydriver_show, NULL);static int __init my_driver_init(void){    int ret = 0;        /*注册驱动*/    driver_register(&ying_drv);            /*创建属性文件*/    driver_create_file(&ying_drv, &driver_attr_drv);        return ret;    }static void my_driver_exit(void){    driver_unregister(&ying_drv);}module_init(my_driver_init);module_exit(my_driver_exit); 



加载bus.ko没有问题
之后无论是先加载device.ko 或者是driver.ko都没有问题
但是在加载第3个模块的时候 就会报错

Unable to handle kernel NULL pointer dereference at virtual address 00000000

实在找不到原因 希望各位前辈指点下~ 谢谢

[解决办法]

通过objdump 工具 disassemble 你的驱动,得到汇编码后,从出错到stack描述定位位置。

[解决办法]
很有可能初始化失败,未向内核注册驱动资源,才出现空指针的错误。
[解决办法]
bang ding
[解决办法]
static int ying_match(struct device * dev , struct device_driver * drv){
return !strncmp(dev->init_name, drv->name, strlen(drv->name));
}
我知道是因为dev->init_name为NULL导致的,但为什么会为NULL,我也不清楚

热点排行