当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2017-01-21

    本文导语:  内核版本:linux-2.6.33 宿主机ubuntu9.04 板子fl2440 最近学到这,也是按着某教学机构的程序照着写的3个驱动bus,device,driver 贴下代码 bus.c #include  #include  #include  #include  #include  MODULE_AUTHOR("Ying"); MODULE_LICENSE("Dual BSD/GPL"); ...

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

#include 
#include 
#include 
#include 
#include 

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 releasen");
}

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, "%sn", 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 attributen");

/*注册总线设备*/
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

#include 
#include 
#include 
#include 
#include 


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, "%sn", "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_devn");
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

#include 
#include 
#include 
#include 
#include 

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, "%sn", "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,我也不清楚

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • %%%%高分相送%%%%%##D-BUS高手请进##
  • D-BUS安装过程中有问题求救!散分!
  • PCI BUS DRIVER 的问题
  • D-Bus 的实现 kdbus
  • Bus Error - core dumed
  • BUS LOGIC是什么模块?编译内核在那里选?
  • 错误调试 bus error (core dumpd)
  • 在solaris的机器上运行自己写的程序时发生BUS ERROR,怎么办?有的数据发生,有的不发生
  • sun gdb "Bus Error(coredump)"
  • Mobile Message Bus
  • 基于Qt的Event Bus libgitlevtbus
  • 请教,,PM: Adding info for No Bus:usbdev5.6_ep00 (这句的因该怎么来理解呢)
  • bus error
  • Linux桌面应用程序通讯 D-BUS
  • driver_match_device( )函数调用失败,为什么?因为bus_type数据结构的match没有指定函数体?
  • (高手请进)lsusb后出现Bus 001 Device 001: ID 1d6b:002,我怎么把这个设备删除了?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3