我最近看loop设备的源代码,里面有个问题始终不得解决。
loop.c文件。
loop与用户交互的底层支持主要是通过lo_ictol这个函数,它是根据不同的命令来执行不同的程序的。
static int lo_ioctl(struct inode * inode, struct file * file,
unsigned int cmd, unsigned long arg)
{
struct loop_device *lo = inode-> i_bdev-> bd_disk-> private_data;
int err;
down(&lo-> lo_ctl_mutex);
switch (cmd) {
case LOOP_SET_FD:
err = loop_set_fd(lo, file, inode-> i_bdev, arg);
break;
case LOOP_CHANGE_FD:
err = loop_change_fd(lo, file, inode-> i_bdev, arg);
break;
case LOOP_CLR_FD:
err = loop_clr_fd(lo, inode-> i_bdev);
break;
case LOOP_SET_STATUS:
err = loop_set_status_old(lo, (struct loop_info __user *) arg);
break;
case LOOP_GET_STATUS:
err = loop_get_status_old(lo, (struct loop_info __user *) arg);
break;
case LOOP_SET_STATUS64:
err = loop_set_status64(lo, (struct loop_info64 __user *) arg);
break;
case LOOP_GET_STATUS64:
err = loop_get_status64(lo, (struct loop_info64 __user *) arg);
break;
default:
err = lo-> ioctl ? lo-> ioctl(lo, cmd, arg) : -EINVAL;
}
up(&lo-> lo_ctl_mutex);
return err;
}
对于不同的cmd,有不同arg。其中arg对应有好几种数据结构。我的问题是:内核是如何组织数据来形成这些数据结构的?还是这部分工作时由另外编写程序来实现的。
我找了很多资料,一直没有得到解答。希望大家能指点一下。
------解决方案--------------------arg可以是一个整数也可以是一个指针。如果是一个指针的话当然什么数据结构都可以。只要传的和收的程序都知道就行。