ioctl 相关问题

ioctl(输入输出控制)是系统调用,用于特定于设备的I / O操作和其他操作,这些操作无法通过常规系统调用表示,并且它提供了一个接口,应用程序可以通过该接口直接与设备驱动程序(或任何其他全局驱动程序)通信内核空间变量)。应用程序可以使用标准控制代码或特定于设备的控制代码来执行直接输入和输出操作。

gpg:错误设备的 ioctl 不合适

我正在运行一个自托管的 Renovate 实例,我需要使用 GPG 密钥签署对 GitLab 的提交。 为此,我使用我的

回答 2 投票 0

iwlist()命令如何扫描无线网络?

我想知道在linux中iwlist命令如何扫描可用的无线网络。我阅读了它的源代码,有一个 ioctl 调用,使用 SIOCSIWSCAN 来触发扫描,并使用 SIOCGIWSCAN 来获取...

回答 1 投票 0

如何将 ioctl 与 FS_IOC_FIEMAP 一起使用

我的问题是处理稀疏文件读取并了解文件的范围,以便在其周围执行一些逻辑。 由于没有直接的 API 调用来解决这些问题,我决定...

回答 2 投票 0

内核 5.15 和 5.4.0 之间关于 ioctl 有效命令是否有任何变化?

我们有一些在 5.4.0 上运行的自定义驱动程序。它已经很旧了,最初的开发人员不再支持它,所以我们必须在我们的系统中维护它。 升级到 Ubuntu 22(内核 5)时...

回答 2 投票 0

是否有以前版本的 tty_ldisc_ops.ioctl() 也需要文件参数?

我正在移植一些将 tty_ldisc_ops.ioctl() 定义为的代码: static int ...ldisc_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg) 但当前的规格是: 斯塔...

回答 1 投票 0

SPI_IOC_RD_MODE 和 SPI_IOC_RD_MODE32 的区别?

我的设备使用ARM进行处理,操作系统是32位的。当我在应用层使用SPI时,如果ioctl()函数中的参数为SPI_IOC_WR_MODE,则不会报错...

回答 1 投票 0

有什么方法可以确定跨区卷的特定逻辑偏移量驻留在哪个磁盘上?

我的一些同事开发了一个微型端口驱动程序,该驱动程序在将数据写入卷时对数据进行加密,并在读取数据时对其进行解密。对于用户来说,可能出现的问题是

回答 1 投票 0

如何从Linux内核模块发送HID命令和读取HID数据?

我正在构建一个 Linux 内核模块,它需要读取 HID 设备,以使用 RPC 通信将数据发送到虚拟机管理程序。这些假设是必要的,因为我正在嵌入式 Linux 中工作并且......

回答 1 投票 0

为什么TIOCSTI采用指向char的指针而不是char?

当它只需要 1 个字节时,为什么会这样 ioctl(int fd, TIOCSTI, const char *argp) ?不会 ioctl(int fd,TIOCSTI,const char argp) 更有意义吗?并且更快? (它不需要遵循

回答 1 投票 0

Linux chardev gpio:有没有办法在设置线路配置时保留当前gpio输出值?

(我直接使用新的 V2 系统调用,而不是使用已弃用的 V1 调用的 libgpiod)。 我通过使用 ioctl GPIO_V2_GET_LINE_IOCTL 获取了设备 fd 并定义了一条 GPIO 线...

回答 2 投票 0

使用无线扩展配置网络设备

我需要在Linux主机上用C语言为应用程序配置网络设备。我阅读了 netlink、libnl 和 nl80211,其中涉及 cfg80211 和 mac80211。后来我发现司机...

回答 1 投票 0

非 root 访问 ioctl 进行 WIFI 扫描

我正在努力实现 iwlist python 版本。以下是 iwlist 在 Linux 操作系统上如何工作的描述 iwlist() 命令如何扫描无线网络?它的作用是扫描附近所有的 wifi

回答 1 投票 0

libnl/nl80211 相当于 iw_set_ext

当我意识到它已被废弃并且大多数应用程序使用 nl80211 时,我开始编写一段代码来使用 iwconfig/ioctl 处理 wifi 卡。 我开始阅读它的源代码,但没有文档...

回答 1 投票 0

我需要在 Fedora 操作系统中的 I2c 上发送原始数据缓冲区

我需要将字符缓冲区发送到fedora操作系统上的i2c。 我正在使用以下代码: 文件=打开(路径,O_RDWR); 联合 i2c_smbus_data dt[3]; dt[0].byte = 0xe7 ; dt[1].byte = 0x3f ; dt[2].byte = 0x00 ;...

回答 1 投票 0

发送到的最大缓冲区长度?

对于作为 UDP 端口打开的套接字,如何获取可传递给 sendto(..) 调用的最大字节数?

回答 3 投票 0

如何将 ioctl 与 SIOCGIWESSID 一起使用

我想读取我连接的 SSID。 我正在使用 ioctl 来执行此操作。我正在尝试使用 nix::ioctl_read 来读取它。 我对此很陌生,所以我不确定我所做的是否正确。 这是我尝试过的。

回答 1 投票 0

尝试在 python 中使用 ioctl 读取驱动器属性时出现溢出错误

当尝试为我的一个驱动器(cmd = 0x89)提取特定于供应商的功能时,我收到溢出错误:OverflowError:有符号整数大于最大值。错误立即抛出...

回答 3 投票 0

使用 Perl 时出现“In合适的 ioctl for device”

我已经为此苦苦挣扎了一段时间,并且不太熟悉 Perl 的核心对象系统。这是出现问题的大型项目的简化部分。我正在尝试写一个类包装...

回答 1 投票 0

取消 L2CAP 套接字上的重传

我想知道是否有人可以帮助我解决 C 蓝牙编程 (Linux Bluez) 的问题。 我使用的是 Ubuntu 10.04、BlueZ 4.60。 我的目标是拥有一个 L2CAP 套接字,其中...

回答 1 投票 0

如何替换内核 5.10.x 模块驱动程序版本的 set_fs(KERNEL_DS)

我一直在将自定义模块驱动程序更新到 5.10.x Linux 内核版本。我的驱动程序在 cdc-acm 设备上添加了一层。为了复制该行为,使用了下一个小驱动程序。 #包括 我一直在将自定义模块驱动程序更新到 5.10.x Linux 内核版本。我的驱动程序在 cdc-acm 设备上添加了一层。为了复制该行为,使用下一个小驱动程序。 #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/file.h> #include <linux/tty.h> #include <linux/version.h> #include <linux/uaccess.h> /* Device major umber */ static int major; /* ttyACM file descriptor */ static struct file *fd; /* Private functions ---------------------------------------------------------*/ static int usbox_serial_baudrate_set(struct file *fd) { int ret; mm_segment_t old_fs; struct termios newtio; //struct termios __user newtio; //void __user *unewtio = (void __user *) &newtio; memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = (B115200 | CS8 | CLOCAL | CREAD); #if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) old_fs = get_fs(); set_fs( get_ds() ); #elif LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0) old_fs = get_fs(); set_fs( KERNEL_DS ); #else old_fs = force_uaccess_begin(); #endif if (fd->f_op->unlocked_ioctl) { ret = fd->f_op->unlocked_ioctl(fd, TCSETS, (unsigned long int) &newtio); pr_info("_unlocked_ioctl: %d\n", ret); } else { ret = -ENOTTY; } #if LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0) set_fs(old_fs); #else force_uaccess_end(old_fs); #endif pr_info("ret: %d\n", ret ); return ret; } /* Driver Methods ------------------------------------------------------------*/ static ssize_t testdrv_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { return 0; } static ssize_t testdrv_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { return 0; } static int testdrv_open(struct inode *inode, struct file *filp) { pr_info("testdrv_open\n"); fd = filp_open( "/dev/ttyACM0", O_RDWR|O_NOCTTY, 0); if (IS_ERR(fd)) { pr_info("error from filp_open()\n"); return -ENODEV; } pr_info ("fd : %p\n", fd); pr_info ("fd->f_op: %p\n", fd->f_op); pr_info ("ioctl : %p\n", fd->f_op->unlocked_ioctl); if ((fd->f_op == NULL) || (fd->f_op->unlocked_ioctl == NULL)) { pr_info("errno: ENODEV\n"); return -ENODEV; } // Set baudrate. if (usbox_serial_baudrate_set(fd) != 0 ) { filp_close(fd, NULL); pr_info("errno: EINVAL\n"); return -EINVAL; } return 0; } static int testdrv_release(struct inode *inode, struct file *filp) { pr_info("testdrv_release\n"); if (fd != NULL) { filp_close(fd, NULL); fd = NULL; } return 0; } static struct file_operations testdrv_fops = { .owner = THIS_MODULE, .read = testdrv_read, .write = testdrv_write, .open = testdrv_open, .release = testdrv_release }; /* Module stuff --------------------------------------------------------------*/ static int __init testdrv_init(void) { int ret; ret = register_chrdev(0, "testdrv", &testdrv_fops); if (ret < 0) { pr_err("Error %d\n", ret); return ret; } major = ret; fd = NULL; pr_info("Major %d\n", major); return 0; } static void __exit testdrv_exit(void) { unregister_chrdev(major, "testdrv"); } module_init(testdrv_init); module_exit(testdrv_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Unknonw"); MODULE_DESCRIPTION("testdrv"); 这里,当testdrv打开时,驱动会打开ttyACM相关。然后它调用“usbox_serial_baudrate_set”来设置波特率。该函数从填充描述符中调用“unlocked_ioctl”。为了能够使用这个电话,我必须使用 #if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) old_fs = get_fs(); set_fs( get_ds() ); #elif LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0) old_fs = get_fs(); set_fs( KERNEL_DS ); #else old_fs = force_uaccess_begin(); #endif ... ret = fd->f_op->unlocked_ioctl(fd, TCSETS, (unsigned long int) &newtio); ... #if LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0) set_fs(old_fs); #else force_uaccess_end(old_fs); #endif 在 5.10.x 之前,此代码可以正常工作。我必须使用 KERNEL_DS 对 5.4.x 进行一些小的更改,但现在我总是从“unlocked_ioctl”中得到 EFAULT。我尝试删除“force_uaccess_begin/force_uaccess_end”但没有成功。 'unlocked_ioctl' 最终调用 /drivers/tty/tty_ioctl.c 'set_termios' 函数,但失败: #ifdef TCGETS2 } else if (opt & TERMIOS_OLD) { if (user_termios_to_kernel_termios_1(&tmp_termios, (struct termios __user *)arg)) return -EFAULT; } else { 函数“user_termios_to_kernel_termios_1”是一个宏 #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) 使用 4.15.0 内核,插入模块并查找相关设备后,我会在 dmesg 中收到下一条消息: [370099.242677] testdrv:testdrv_init: Major 237 [370103.032357] testdrv:testdrv_open: testdrv_open [370103.032635] testdrv:testdrv_open: fd : 0000000034db75d4 [370103.032637] testdrv:testdrv_open: fd->f_op: 00000000c761e065 [370103.032638] testdrv:testdrv_open: ioctl : 00000000608ed60c [370103.032643] testdrv:usbox_serial_baudrate_set: _unlocked_ioctl: 0 [370103.032645] testdrv:usbox_serial_baudrate_set: ret: 0 [370103.032685] testdrv:testdrv_release: testdrv_release 并使用 5.10.1 [ 294.418308] testdrv:testdrv_init: got major 244 [ 296.574583] testdrv:testdrv_open: testdrv_open [ 296.575949] testdrv:testdrv_open: fd : 00000000c35e59c0 [ 296.575955] testdrv:testdrv_open: fd->f_op: 0000000041840a0e [ 296.575957] testdrv:testdrv_open: ioctl : 000000005e21689c [ 296.575965] testdrv:usbox_serial_baudrate_set: _unlocked_ioctl: -14 [ 296.575967] testdrv:usbox_serial_baudrate_set: ret: -14 [ 296.575970] testdrv:testdrv_open: errno: EINVAL 任何人都可以帮助我了解发生了什么事吗?混合用户空间/内核空间数据有问题吗?我该如何解决? 您可以使用 CONFIG_SET_FS=y (uaccess.h) 构建内核。至少应该是 5.10 的选项。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.