我想我的问题看起来一定是无可救药的业余,但我最近才开始认真使用linux,而且我找不到这个相当简单的问题的明确答案。我在这篇文章的底部还有一些其他问题。
我想知道如何从用户空间程序调用特定于驱动程序的函数实现(使用适当的系统调用)。我正在寻找合适的代码行。我可以假设我有一个分配给驱动程序的主设备号和次设备号,并且 /dev 和其他目录中有适当的文件。我想所需的代码看起来像这样:
system_call(major number, minor number, function ID, parameters, more parameters);
作为参考,这里是我的驱动程序 init() 代码,或多或少从 Madieu 的书(LDD3)中逐字复制:
static int __init my_init(void)
{
int i;
dev_t curr_dev;
/*Kernel EEP_NBANK devices*/
alloc_chrdev_region(&dev_num, 0, number_of_lanes, DEVICE_NAME);
/*Create device class*/
driver_class = class_create(THIS_MODULE, DEVICE_CLASS);
/*this loop is sort of overkill, but you could change NUMBER_OF_DEVICES
so I'll use the loop just in case someone meddles with my source*/
for(i=0;i<number_of_lanes;i++){
cdev_init(&driver_cdev[i], &driver_fops);
driver_cdev[i].owner = THIS_MODULE;
curr_dev = MKDEV(MAJOR(dev_num), MINOR(dev_num)+i);
cdev_add(&driver_cdev[i], curr_dev, 1);
device_create( driver_class,
NULL,
curr_dev,
NULL,
DEVICE_NAME "%d",i);
}
return 0;
}
如您所见,我已经完成了访问该程序所需的 4 个步骤,至少根据那些书籍是这样。您可以假设我已经正确实现了 file_operations 结构和 cdev 结构等。您还可以假设我已经实现了读取或写入函数的形式,其具有原型:
ssize_t (*write)(struct file *filp, const char __user *buf, size_t count, loff_t *pos)
读取是相同的,但具有 (*read) 而不是 (*write)。那么,我如何获得 *filp 的正确值(它是隐式的,内核为我工作)、*buf (我假设是从用户空间传递的)、count (我假设是从用户空间传递的)和*pos(我假设再次从用户空间传递),以及如何从用户空间为特定驱动程序调用这些函数?
希望这个问题足够清楚,但如果需要澄清,我将在接下来的几天里,瘟疫肆虐的日子里。谢谢。