我一直在尝试编写Linux驱动程序。首先,我编写了一个帮助程序文件,以便可以确定使用procfs加载两个驱动程序中的哪个(仅一个,而不是两个)。但似乎is_asd32
始终为0,并且在需要时不会更改为1。这是我为辅助程序尝试的内容(已修剪,以便显示相关代码):
*请注意,辅助程序已在fs_initcall
处初始化,并且我确保其从用户空间执行脚本。驱动程序在device_initcall
处初始化。
我尝试使用指针:
static char proc_data[4];
int *is_asd32 = NULL;
static ssize_t drivers_write(struct file *file, const char *buf,size_t count,loff_t *data )
{
if(count > 4)
return -EFAULT;
if(copy_from_user(proc_data, buf, count))
return -EFAULT;
if(!strncmp("1",(char*)proc_data,1))
*is_asd32 = 1;
//no else block, just leave is_asd32 = 0
}
int use_asd32()
{
if (*is_asd32)
return 1;
else
return 0;
}
也尝试过:
static char proc_data[4];
int *is_asd32 = NULL;
static int one = 1;
static ssize_t drivers_write(struct file *file, const char *buf,size_t count,loff_t *data )
{
if(count > 4)
return -EFAULT;
if(copy_from_user(proc_data, buf, count))
return -EFAULT;
if(!strncmp("1",(char*)proc_data,1))
is_asd32 = &one;
//no else block, just leave is_asd32 = 0
}
int use_asd32()
{
if (*is_asd32)
return 1;
else
return 0;
}
两者都使系统崩溃。我猜是段错误。因此,也许我的指针用法有问题。
首次尝试(使用全局变量)
static char proc_data[4];
int is_asd32;
static ssize_t drivers_write(struct file *file, const char *buf,size_t count,loff_t *data )
{
if(count > 4)
return -EFAULT;
if(copy_from_user(proc_data, buf, count))
return -EFAULT;
if(!strncmp("1",(char*)proc_data,1))
is_asd32 = 1;
//no else block, just leave is_asd32 = 0
}
int use_asd32()
{
if (is_asd32)
return 1;
else
return 0;
}
第一个驱动程序初始化代码:
extern int use_asd32(void);`
static int __init first_driver(void)
{
if (use_asd32())
return -ENODEV; // let the second driver load successfully
......................
}
第二个驱动程序初始化代码:
extern int use_asd32(void);
static int __init second_driver(void);
{
if (!use_asd32())
return -ENODEV;
............
}
use_asd32()
的返回值应随着is_asd32()
的改变而改变