当前位置: 技术问答>linux和unix
初学字符设备驱动遇到的问题
来源: 互联网 发布时间:2016-10-12
本文导语: 最近在学linux的设备驱动,我把书上的示例简化了下,加载是都正确的,但是用应用程序调用时,会提示段错误。看样子似乎是应用程序打开我的驱动时,驱动没有返回一个正确的指针给应用程序导致的。是不是在写x...
最近在学linux的设备驱动,我把书上的示例简化了下,加载是都正确的,但是用应用程序调用时,会提示段错误。看样子似乎是应用程序打开我的驱动时,驱动没有返回一个正确的指针给应用程序导致的。是不是在写xxx_open函数的时候,需要返回一个指针呢?
|
多加一些perror语句,确认是open还是ioctl之后才段错误的
schar.h 也沾上来
schar.h 也沾上来
|
宏THIS_MODULE,它的定义如下是#define THIS_MODULE (&__this_module),__this_module是一个struct module变量,代表当前模块,跟current有几分相似。可以通过THIS_MODULE宏来引用模块的struct module结构,试试下面的模块:
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
unsigned int cpu = get_cpu();
struct module *mod;
printk(KERN_ALERT "this module: %p==%pn", &__this_module, THIS_MODULE );
printk(KERN_ALERT "module state: %dn", THIS_MODULE->state );
printk(KERN_ALERT "module name: %sn", THIS_MODULE->name );
list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list )
printk(KERN_ALERT "module name: %sn", mod->name );
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "module state: %dn", THIS_MODULE->state );
}
module_init(hello_init);
module_exit(hello_exit);
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
unsigned int cpu = get_cpu();
struct module *mod;
printk(KERN_ALERT "this module: %p==%pn", &__this_module, THIS_MODULE );
printk(KERN_ALERT "module state: %dn", THIS_MODULE->state );
printk(KERN_ALERT "module name: %sn", THIS_MODULE->name );
list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list )
printk(KERN_ALERT "module name: %sn", mod->name );
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "module state: %dn", THIS_MODULE->state );
}
module_init(hello_init);
module_exit(hello_exit);