<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; ioctl</title>
	<atom:link href="https://zohead.com/archives/tag/ioctl/feed" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>龙芯MIPS64 QEMU ioctl的问题</title>
		<link>https://zohead.com/archives/loongson-qemu-ioctl/</link>
		<comments>https://zohead.com/archives/loongson-qemu-ioctl/#comments</comments>
		<pubDate>Wed, 26 Dec 2018 16:59:20 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ioctl]]></category>
		<category><![CDATA[MIPS64]]></category>
		<category><![CDATA[QEMU]]></category>
		<category><![CDATA[龙芯]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1561</guid>
		<description><![CDATA[龙芯 QEMU 问题 最近搞了一块使用国产龙芯 3A3000 处理器的开源开发板，顺便捣鼓移植我们的服务程序，安装龙芯开源社区的 Loongnix 系统之后测试下来 3A3000 处理器的性能还是基本能用的。龙芯处理器自带的内存控制器也能到 DDR3-1600 了，只是目前还在使用 HT3.0 总线确实拖累系统性能。 我们部署的一些服务目前还依赖几个 x86 系统的闭源程序，无法直接在龙芯 MIPS64 系统下运行，就想到使用 QEMU 的 User-mode emulation 来实现了。 Loongnix 系统中的 qemu-i386 运行比较简单的 x86 程序一般都没有问题，不过我发现 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="loongson-qemu-issue">龙芯 QEMU 问题</h2>
<p>最近搞了一块使用国产<a href="http://www.loongson.cn/product/cpu/3/3A3000.html" target="_blank">龙芯 3A3000</a> 处理器的开源开发板，顺便捣鼓移植我们的服务程序，安装龙芯开源社区的 <a href="http://www.loongnix.org/" target="_blank">Loongnix</a> 系统之后测试下来 3A3000 处理器的性能还是基本能用的。龙芯处理器自带的内存控制器也能到 DDR3-1600 了，只是目前还在使用 HT3.0 总线确实拖累系统性能。</p>
<p>我们部署的一些服务目前还依赖几个 x86 系统的闭源程序，无法直接在龙芯 MIPS64 系统下运行，就想到使用 QEMU 的 User-mode emulation 来实现了。</p>
<p>Loongnix 系统中的 qemu-i386 运行比较简单的 x86 程序一般都没有问题，不过我发现即使用打了 ioctl patch 的 QEMU 运行其中一个使用了私有 ioctl 调用的 x86 程序仍然会出错，通过开启 qemu-i386 的 strace 可以看到错误信息：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@loongnix:~$ qemu-i386 -strace /lib/i386-linux-gnu/ld-linux.so.2 --library-path /lib/i386-linux-gnu /usr/sbin/test-agent

2459 ioctl(5,-1055634175,-42368,0,0,-42056) = -1 errno=25 (Inappropriate ioctl for device)
2459 ioctl(5,-1055634175,-41488,0,0,-41176) = -1 errno=25 (Inappropriate ioctl for device)
2459 ioctl(5,-1055634175,-44192,0,0,-43880) = -1 errno=25 (Inappropriate ioctl for device)
</pre>
<p>上面的 <code>/usr/sbin/test-agent</code> 就是要模拟运行的 x86 二进制程序，<code>/lib/i386-linux-gnu</code> 是我在龙芯 MIPS64 系统上增加的 x86 程序依赖基础库目录，其中最重要的就是 <code>libc.so.6</code> 和 <code>ld-linux.so.2</code> 库了。</p>
<p>从 strace 数据应该可以发现该 ioctl 已经发到设备，但是 kernel 返回 <code>Inappropriate ioctl</code> 错误，而 <code>-1055634175</code>  则表示 x86 二进制程序发送的是 compat ioctl，此时我才想起来确认下 qemu-i386 程序是否正确：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@loongnix:~$ file `which qemu-i386`
/usr/bin/qemu-i386: ELF 64-bit LSB executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=39cac8103f052b4ffa161f615159c888024ef4e3, for GNU/Linux 2.6.32, stripped
</pre>
<p>龙芯 Loongnix MIPS64 系统目前兼容几种 ABI：</p>
<ul>
<li>O32：MIPS 32 位处理器使用；</li>
<li>N64：只适用于 MIPS 64 位处理器，使用 64 位指针和 long integers；</li>
<li>N32：只适用于 MIPS 64 位处理器，在保留 MIPS N64 ABI 的几乎所有特性的情况下，使用 32 位指针和 long integers。</li>
</ul>
<p>这个 qemu-i386 使用的是 MIPS64 N64 ABI，而 qemu-i386 实际运行的 x86 二进制程序在龙芯 64 位 kernel 下会发送 compat ioctl，这样最终 qemu-i386 程序调用 compat ioctl 时就显然会有问题，报 <code>Inappropriate ioctl</code> 也就不奇怪了。</p>
<p>解决方法也就很简单了，我只要重新编译出使用 N32 或者 O32 ABI 的 qemu-i386 程序应该就能解决，为了性能考虑可以尽量使用 N32 ABI。</p>
<h2 id="n32-abi-qemu">编译 N32 ABI QEMU</h2>
<p>首先需要在 Loongnix MIPS64 系统下安装编译 QEMU 需要的 N32 版本的开发包，这里我只安装了 QEMU 用户模式需要的开发包：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@loongnix:~$ yum install glibc-devel.mipsn32el glib2-devel.mipsn32el zlib-devel.mipsn32el libffi.mipsn32el pixman-devel.mipsn32el
</pre>
<blockquote>
<p><strong>提示</strong></p>
<p>Loongnix 系统的 N64 相关库文件一般放在 <code>/usr/lib64</code> 目录下，N32 相关库文件在 <code>/usr/lib32</code> 目录下，而 O32 相关库文件则在 <code>/usr/lib</code> 目录下。</p>
</blockquote>
<p>然后进入 QEMU 源代码目录重新 configure，增加特定编译参数指定生成 N32 位的程序：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@loongnix:qemu$ PKG_CONFIG_LIBDIR=/usr/lib32/pkgconfig ./configure --target-list=i386-linux-user --disable-kvm --disable-xen --enable-pie --extra-cflags=-mabi=n32
</pre>
<p>简单说明一下：</p>
<ul>
<li><code>PKG_CONFIG_LIBDIR</code> 环境变量指定使用什么版本的 pkgconfig 查找库及开发包，这里使用 <code>/usr/lib32/pkgconfig</code> N32 版本；</li>
<li><code>--target-list</code> 指定 QEMU 编译目标，这里我们只需要 qemu-i386，因此把 KVM、Xen 等功能也禁用了；</li>
<li><code>--extra-cflags</code> 指定额外编译参数为 <code>-mabi=n32</code>，这样编译和链接时都是 N32 版本了。</li>
</ul>
<p>重新编译安装之后可以看到新的 qemu-i386 使用的就是 N32 ABI 了：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@loongnix:~$ file `which qemu-i386`
/usr/local/bin/qemu-i386: ELF 32-bit LSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=12e0025c42a9a63b8045c31159950f9b185f8745, stripped
</pre>
<p>最后测试使用新的 qemu-i386 运行依赖 ioctl 的 x86 二进制程序，现在就没有直接报错的问题了。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/loongson-qemu-ioctl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>密码保护：Linux I/O限度介绍</title>
		<link>https://zohead.com/archives/linux-io-limits/</link>
		<comments>https://zohead.com/archives/linux-io-limits/#comments</comments>
		<pubDate>Thu, 08 Nov 2012 16:25:45 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Device mapper]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[存储]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[DM]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[ioctl]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[MD]]></category>
		<category><![CDATA[sysfs]]></category>
		<category><![CDATA[对齐]]></category>
		<category><![CDATA[设备]]></category>
		<category><![CDATA[限度]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=340</guid>
		<description><![CDATA[无法提供摘要。这是一篇受保护的文章。]]></description>
				<content:encoded><![CDATA[<form action="https://zohead.com/wp-login-zohead.php?action=postpass" class="post-password-form" method="post">
<p>这是一篇受密码保护的文章，您需要提供访问密码：</p>
<p><label for="pwbox-340">密码： <input name="post_password" id="pwbox-340" type="password" size="20" /></label> <input type="submit" name="Submit" value="提交" /></p>
</p></form>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/linux-io-limits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
