gpt4 book ai didi

c - 如何在 Linux 2.6.29 中解码 ioctl() 系统调用中的 arg 指针?

转载 作者:太空狗 更新时间:2023-10-29 11:25:20 32 4
gpt4 key购买 nike

我想打印所有传递给 linux 系统调用的参数值。例如,对于 ioctl(),我有以下原型(prototype)和打印语句。

asmlinkage long our_sys_ioctl(unsigned int fd ,  unsigned int cmd , unsigned long arg)
{
printk ("fd=%u, cmd=%u and arg=%lu \n ", fd, cmd, arg);
return original_call_ioctl(fd , cmd , arg);
}

我明白了,fd是驱动文件的文件描述符,cmd定义了驱动,ioctl数,操作类型和参数大小。但是我对 arg 参数感到困惑,它要么是指向内存的指针,要么只是大多数文档所称的立即值。

通过使用这个 arg 参数,如果它作为上面给出的 unsigned long arg 而不是指针传递,我如何获取内存内容?

最佳答案

ioctl 的 arg 参数在通用 vfs 级别是不透明的。如何解释它取决于实际处理它的驱动程序或文件系统。所以它可能是一个指向用户空间内存的指针,或者它可能是一个索引、一个标志,等等。它甚至可能未被使用并且通常以 0 传递。

例如,查看 drivers/tty/tty_io.cTCSBRKP ioctl 的实现:

long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
//...
case TCSBRKP: /* support for POSIX tcsendbreak() */
return send_break(tty, arg ? arg*100 : 250);

你可以看看ioctl_list(2)手册页以查看各种 ioctl 所采用的参数;该列表中所有具有 int 或其他非指针参数的条目都是其他示例。

所以你可以做类似的事情

    void __user *argp = (void __user *) arg;

然后使用copy_from_user()get_user()读取arg指向的内存,但如果参数不是指针。在通用 ioctl 系统调用中,您可能真的不希望拥有包含所有可能的 ioctl 的巨大表格。

关于c - 如何在 Linux 2.6.29 中解码 ioctl() 系统调用中的 arg 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391282/

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