当前位置: 技术问答>linux和unix
我最近看loop设备的源代码,里面有个问题始终不得解决。
来源: 互联网 发布时间:2016-01-26
本文导语: loop.c文件。 loop与用户交互的底层支持主要是通过lo_ictol这个函数,它是根据不同的命令来执行不同的程序的。 static int lo_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg) { struct loop_d...
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对应有好几种数据结构。我的问题是:内核是如何组织数据来形成这些数据结构的?还是这部分工作时由另外编写程序来实现的。
我找了很多资料,一直没有得到解答。希望大家能指点一下。
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可以是一个整数也可以是一个指针。如果是一个指针的话当然什么数据结构都可以。只要传的和收的程序都知道就行。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。