<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Ioctl</id>
	<title>Ioctl - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Ioctl"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Ioctl&amp;action=history"/>
	<updated>2026-07-14T22:42:34Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Ioctl&amp;diff=2472868&amp;oldid=prev</id>
		<title>imported&gt;春上冰月：​/* 终端 */ 修复内部链接，此处的终端不是 macOS 上特定的 Terminal app 而是更加广泛的「终端模拟器」概念。</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Ioctl&amp;diff=2472868&amp;oldid=prev"/>
		<updated>2024-06-21T07:08:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;终端：​&lt;/span&gt; 修复内部链接，此处的终端不是 macOS 上特定的 Terminal app 而是更加广泛的「终端模拟器」概念。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA|G1=IT}}&lt;br /&gt;
{{lowercase}}{{Expand language|en}}在计算中，&amp;#039;&amp;#039;&amp;#039;ioctl&amp;#039;&amp;#039;&amp;#039; 是对设备特定的输入/输出操作和其他不能用常规系统调用表达的操作的[[系统调用]]。 它需要一个指定请求代码的参数； 调用的效果完全取决于请求代码。 请求代码通常是特定于设备的。&lt;br /&gt;
&lt;br /&gt;
例如，可以指示物理设备弹出光盘的 [[CD-ROM]] 设备，则[[驱动程序]]将提供 ioctl 请求代码来执行此操作。 与设备无关的请求代码有时用于让用户空间访问仅由核心系统软件使用或仍在开发中的内核功能。 ioctl 系统调用以该名称首次出现在 Unix 版本 7 中。 大多数 Unix 和类 Unix 系统都支持它，包括 [[Linux]] 和 [[macOS]]，但可用的请求代码因系统而异。[[Microsoft Windows]] 在其 [[Windows API|Win32 API]] 中提供了一个类似的[[函数式编程|函数]]，名为“DeviceIoControl”。&lt;br /&gt;
&lt;br /&gt;
==背景==&lt;br /&gt;
传统的[[操作系统]]可以分为两层，[[使用者空間|用户空间]]和[[内核]]。 [[文本编辑器]]等应用程序代码驻留在用户空间，而操作系统的底层设施（如网络堆栈）驻留在内核中。 内核代码处理敏感资源并实现应用程序之间的安全性和可靠性屏障； 因此，操作系统会阻止用户模式应用程序直接访问内核资源。 用户空间应用程序通常通过系统调用向内核发出请求，其代码位于内核层。&lt;br /&gt;
&lt;br /&gt;
[[系统调用]]通常采用“系统调用[[向量]]”的形式，其中用索引号指示所需的系统调用。 例如，exit() 可能是 1 号系统调用，而 write() 号是 4。系统调用向量然后用于为请求找到所需的内核函数。 这样，传统的操作系统通常会向用户空间提供数百个系统调用。 &lt;br /&gt;
&lt;br /&gt;
尽管系统调用是访问标准内核设施的权宜之计，但系统调用有时不适用于访问非标准[[计算机硬件|硬件外围设备]]。 必然地，大多数硬件外围设备（也称为设备）只能在内核中直接寻址。 但是用户代码可能需要直接与设备通信； 例如，管理员可能会在[[以太网]]接口上配置媒体类型。 现代操作系统支持多种设备，其中许多设备提供大量功能。 内核设计者可能没有预见到其中一些设施，因此内核很难提供使用这些设备的系统调用。 &lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，内核被设计成可扩展的，并且可以接受一个额外的模块，称为设备驱动程序，它运行在内核空间，可以直接[[寻址]]设备。 ioctl 接口是一个单一的系统调用，[[使用者空間|用户空间]]可以通过它与设备驱动程序进行通信。 设备驱动程序上的请求根据此 ioctl 系统调用进行引导，通常通过[[句柄|设备句柄]]和请求编号进行引导。 因此，基本内核可以允许用户空间访问设备驱动程序，而无需了解设备支持的设施，也不需要难以管理的大量系统调用。&lt;br /&gt;
&lt;br /&gt;
== 使用 ==&lt;br /&gt;
&lt;br /&gt;
=== 硬件设备配置 ===&lt;br /&gt;
ioctl 的一个常见用途是控制[[计算机硬件|硬件设备]]。例如，在 Win32 系统上，ioctl 调用可以与 [[USB|USB 设备]]通信，或者它们可以发现附加存储设备的[[儲存裝置|驱动器]]几何信息。 &lt;br /&gt;
&lt;br /&gt;
在 [[OpenBSD]] 和 [[NetBSD]] 上，bio(4) 伪设备驱动程序和 bioctl 实用程序使用 ioctl 在类似于 [[ifconfig]] 的统一供应商不可知接口中实现 [[RAID]] 卷管理。&amp;lt;ref&amp;gt;{{Cite web|title=Super User&amp;#039;s BSD Cross Reference: /OpenBSD/share/man/man4/bio.4|url=http://bxr.su/OpenBSD/share/man/man4/bio.4|access-date=2023-01-09|website=bxr.su|archive-date=2022-10-01|archive-url=https://web.archive.org/web/20221001015236/http://bxr.su/OpenBSD/share/man/man4/bio.4|dead-url=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web|title=Super User&amp;#039;s BSD Cross Reference: /OpenBSD/sbin/bioctl/bioctl.8|url=http://bxr.su/OpenBSD/sbin/bioctl/bioctl.8|access-date=2023-01-09|website=bxr.su|archive-date=2023-01-09|archive-url=https://web.archive.org/web/20230109110427/http://bxr.su/OpenBSD/sbin/bioctl/bioctl.8|dead-url=no}}&amp;lt;/ref&amp;gt;在 NetBSD 上，ioctl 也被 sysmon 框架使用。&amp;lt;ref name=&amp;quot;sysmon&amp;quot;&amp;gt;{{cite web|title=sysmon(4) — system monitoring and power management interface|url=http://mdoc.su/n/sysmon.4|publisher=[[NetBSD]]|quote=An ioctl(2) interface available via /dev/sysmon.}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 终端 ===&lt;br /&gt;
在面向最终用户的[[应用程序]]中，ioctl 的一种用途是[[終端|终端 I/O]]。 Unix 操作系统传统上大量使用[[命令行界面]]。 Unix 命令行界面建立在[[虚拟终端|伪终端]] (ptys) 之上，它模拟硬件文本终端，例如 VT100s。 使用 ioctl 调用，可以像硬件设备一样控制和配置 pty。 例如，pty 的窗口大小是使用 TIOCSWINSZ 调用设置的。TIOCSTI（terminal I/O control，模拟终端输入）的ioctl函数可以将一个字符压入[[设备文件系统|设备流]]。&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Unix]]&lt;/div&gt;</summary>
		<author><name>imported&gt;春上冰月</name></author>
	</entry>
</feed>