gpt4 book ai didi

linux - ioctls 如何知道在 linux 中调用哪个函数?

转载 作者:IT王子 更新时间:2023-10-29 00:05:01 34 4
gpt4 key购买 nike

因此,当我使用一个 ioctl 编号在设备上调用 ioctl 时,它如何知道要调用哪个函数?

最佳答案

ioctl(2)通过fs/ioctl.c函数进入:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
struct file *filp;
int error = -EBADF;
int fput_needed;

filp = fget_light(fd, &fput_needed);
if (!filp)
goto out;

error = security_file_ioctl(filp, cmd, arg);
if (error)
goto out_fput;

error = do_vfs_ioctl(filp, fd, cmd, arg);
out_fput:
fput_light(filp, fput_needed);
out:
return error;
}

请注意,已经有一个文件描述符 fd 关联了。然后内核调用 fget_light() 来查找 filp(大致来说,文件指针,但不要将其与标准 IO FILE * 文件指针)。对 security_file_ioctl() 的调用检查加载的安全模块是否允许 ioctl(无论是通过名称,如 AppArmor 和 TOMOYO,还是通过标签,如 SMACK 和 SELinux ),以及用户是否具有进行调用的正确能力 (capabilities(7))。如果允许调用,则调用 do_vfs_ioctl() 来处理常见的 ioctl 本身:

    switch (cmd) {
case FIOCLEX:
set_close_on_exec(fd, 1);
break;
/* ... */

如果这些常见情况都不正确,则内核会调用辅助例程:

static long vfs_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg)
{
int error = -ENOTTY;

if (!filp->f_op || !filp->f_op->unlocked_ioctl)
goto out;

error = filp->f_op->unlocked_ioctl(filp, cmd, arg);
if (error == -ENOIOCTLCMD)
error = -EINVAL;
out:
return error;
}

驱动程序提供它们自己的 .unlocked_ioctl 函数指针,例如 fs/pipe.c 中的管道实现:

const struct file_operations rdwr_pipefifo_fops = {
.llseek = no_llseek,
.read = do_sync_read,
.aio_read = pipe_read,
.write = do_sync_write,
.aio_write = pipe_write,
.poll = pipe_poll,
.unlocked_ioctl = pipe_ioctl,
.open = pipe_rdwr_open,
.release = pipe_rdwr_release,
.fasync = pipe_rdwr_fasync,
};

关于linux - ioctls 如何知道在 linux 中调用哪个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061798/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com