qemu 中不支持的 ioctl 调用

Posted

技术标签:

【中文标题】qemu 中不支持的 ioctl 调用【英文标题】:Unsupported ioctl call in qemu 【发布时间】:2018-06-17 11:26:54 【问题描述】:

嗯。我为 android 交叉编译了 qemu,当我使用用户模式运行程序时,它显示有一个不受支持的 ioctl 调用。例如,我跑了:

./qemu-aarch64 /system/bin/wificond  

它给了我

Unsupported ioctl: cmd=0xffffffffc0046209
Unsupported ioctl: cmd=0x40046205
Binder driver could not be opened.  Terminating.

所以我想我可能想要做的是手动添加该 ioctl 调用。但问题是我只知道 cmd 编号,我怎么知道我应该添加什么?谢谢!

【问题讨论】:

【参考方案1】:

您需要做的第一件事是弄清楚它是哪个 ioctl。遗憾的是,这有点尴尬。一种方法是例如使用本地 strace 对二进制文件进行 strace,并希望它为您打印 ioctl 符号。或者您可以查看内核头文件。通常 ioctl 是使用 include/uapi/asm-generic/ioctl.h 中的 _IOC 宏定义的,它从一组字段构造它们,因此您必须尝试通过猜测和 grep 从数字。这里 0xc0046209 的 'type' 为 0x62,即 ASCII 'b',数字为 0x09,即

#define BINDER_VERSION  _IOWR('b', 9, struct binder_version)

(实际上我们可能已经从错误消息中猜到了无法打开活页夹驱动程序)。

因此,您需要在 QEMU 仿真中实现 Android binder API ioctls。希望您的主机系统也是 Android,因为非 Android 主机内核没有绑定设备。

添加额外 ioctl 的难度很大程度上取决于它们的参数是什么,因为参数需要从客户机的数据布局转换为主机的数据布局。如果 ioctl 参数是简单类型,则主要是在 linux-user/ioctls.h 中提供 IOCTL() 行并在 linux-user/syscall_defs.h 中定义 TARGET_IOCTLNAME ——例如上游 QEMU 提交 d6d6d6fe17fa 添加 RND * ioctl。当参数是一个由基本类型组成的结构时,事情并没有那么复杂——例如commit 21992cb6794a5f8。在最坏的情况下,您需要提供自定义函数来转换参数,如提交 2b74f621f1c780 中的 TIOCGPTPEER 所示。

【讨论】:

谢谢!确切地。我发现有时我们不需要知道目标名称,因为我们需要做的就是定义该数字。所以我们可以只使用那个不受支持的数字而不是使用 _IOWR 并节省一些时间。但是关于参数的观点是真的。我面临一个具有不同大小的结构,所以我似乎需要为该结构定义一些函数。

以上是关于qemu 中不支持的 ioctl 调用的主要内容,如果未能解决你的问题,请参考以下文章

httpclient调用c#中不支持的媒体类型

如何检测驱动程序是不是不支持 ioctl 命令 TIOCSERIAL

搭建KVM服务器

KVM的配置安装

linux虚拟化之KVM

对 DB2 for z/OS 的存储过程调用中不支持字符串文字