当前位置: 技术问答>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
device.c
driver
加载bus.ko没有问题
之后无论是先加载device.ko 或者是driver.ko都没有问题
但是在加载第3个模块的时候 就会报错
Unable to handle kernel NULL pointer dereference at virtual address 00000000
实在找不到原因 希望各位前辈指点下~ 谢谢
最近学到这,也是按着某教学机构的程序照着写的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,我也不清楚
return !strncmp(dev->init_name, drv->name, strlen(drv->name));
}
我知道是因为dev->init_name为NULL导致的,但为什么会为NULL,我也不清楚
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。