summaryrefslogtreecommitdiffstats
path: root/wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html
blob: 3e17ea443e17004716f1cc752a8baeb00a9ea87f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
<!DOCTYPE html>
<html class="client-nojs" lang="en" dir="ltr">
<head>
<meta charset="UTF-8"/>
<title>Introduction - Open-IOV</title>
<script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":!1,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"3b3365a93fa8b372c95b4776","wgCSPNonce":!1,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":!1,"wgNamespaceNumber":0,"wgPageName":"Introduction","wgTitle":"Introduction","wgCurRevisionId":23688,"wgRevisionId":23688,"wgArticleId":4507,"wgIsArticle":!0,"wgIsRedirect":!1,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Introduction","wgRelevantArticleId":4507,"wgIsProbablyEditable":!1,"wgRelevantPageIsProbablyEditable":!1,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr",
"pageVariantFallbacks":"en"},"wgEditSubmitButtonLabelPublish":!1};RLSTATE={"site.styles":"ready","noscript":"ready","user.styles":"ready","user":"ready","user.options":"loading","mediawiki.action.styles":"ready","mediawiki.interface.helpers.styles":"ready","skins.vector.styles.legacy":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready"};RLPAGEMODULES=["site","mediawiki.page.ready","mediawiki.toc","skins.vector.legacy.js","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader"];</script>
<script>(RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.options@1hzgi",function($,jQuery,require,module){/*@nomin*/mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});
});});</script>
<link rel="stylesheet" href="https://open-iov.org/load.php?lang=en&amp;modules=ext.visualEditor.desktopArticleTarget.noscript%7Cmediawiki.action.styles%7Cmediawiki.interface.helpers.styles%7Cskins.vector.styles.legacy&amp;only=styles&amp;skin=vector"/>
<script async="" src="load.php%3Flang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script>
<meta name="generator" content="MediaWiki 1.37.1"/>
<meta name="robots" content="noindex,nofollow"/>
<meta name="format-detection" content="telephone=no"/>
<link rel="shortcut icon" href="favicon.ico.html"/>
<link rel="search" type="application/opensearchdescription+xml" href="opensearch_desc.php" title="Open-IOV (en)"/>
<link rel="EditURI" type="application/rsd+xml" href="api.php%3Faction=rsd"/>
<link rel="alternate" type="application/atom+xml" title="Open-IOV Atom feed" href="./index.php%3Ftitle=Special:RecentChanges&amp;feed=atom"/>
</head>
<body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Introduction rootpage-Introduction skin-vector action-view skin-vector-legacy"><div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<div id="content" class="mw-body" role="main">
	<a id="top"></a>
	<div id="siteNotice"></div>
	<div class="mw-indicators">
	</div>
	<h1 id="firstHeading" class="firstHeading" >Introduction</h1>
	<div id="bodyContent" class="vector-body">
		<div id="siteSub" class="noprint">From Open-IOV</div>
		<div id="contentSub"><div class="mw-revision warningbox"><div id="mw-revision-info">Revision as of 03:21, 19 January 2023 by <a href="./index.php%3Ftitle=User:Arthur&amp;action=edit&amp;redlink=1.html" class="new mw-userlink" title="User:Arthur (page does not exist)"><bdi>Arthur</bdi></a> <span class="mw-usertoollinks">(<a href="./index.php%3Ftitle=User_talk:Arthur&amp;action=edit&amp;redlink=1.html" class="new mw-usertoollinks-talk" title="User talk:Arthur (page does not exist)">talk</a> | <a href="index.php/Special:Contributions/Arthur.html" class="mw-usertoollinks-contribs" title="Special:Contributions/Arthur">contribs</a>)</span></div><div id="mw-revision-nav">(<a href="https://open-iov.org/index.php?title=Introduction&amp;diff=prev&amp;oldid=23688" title="Introduction">diff</a>) <a href="https://open-iov.org/index.php?title=Introduction&amp;direction=prev&amp;oldid=23688" title="Introduction">← Older revision</a> | Latest revision (diff) | Newer revision → (diff)</div></div></div>
		<div id="contentSub2"></div>
		
		<div id="jump-to-nav"></div>
		<a class="mw-jump-link" href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#mw-head">Jump to navigation</a>
		<a class="mw-jump-link" href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#searchInput">Jump to search</a>
		<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-parser-output"><p>This page will provide introductory context on where to begin reading. It will aim to give you a sense of primitives or foundational concepts used for GPU Virtualization.
</p>
<div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="en" dir="ltr"><h2 id="mw-toc-heading">Contents</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Terminology"><span class="tocnumber">1</span> <span class="toctext">Terminology</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Primitives"><span class="tocnumber">2</span> <span class="toctext">Primitives</span></a>
<ul>
<li class="toclevel-2 tocsection-3"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#PCI_BAR"><span class="tocnumber">2.1</span> <span class="toctext">PCI BAR</span></a></li>
<li class="toclevel-2 tocsection-4"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#GPU_Drivers"><span class="tocnumber">2.2</span> <span class="toctext">GPU Drivers</span></a></li>
<li class="toclevel-2 tocsection-5"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#IOMMU"><span class="tocnumber">2.3</span> <span class="toctext">IOMMU</span></a></li>
<li class="toclevel-2 tocsection-6"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Virtualization_vs._Paravirtualization"><span class="tocnumber">2.4</span> <span class="toctext">Virtualization vs. Paravirtualization</span></a></li>
<li class="toclevel-2 tocsection-7"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Unassisted_vs._Assisted"><span class="tocnumber">2.5</span> <span class="toctext">Unassisted vs. Assisted</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-8"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Further_Reading"><span class="tocnumber">3</span> <span class="toctext">Further Reading</span></a>
<ul>
<li class="toclevel-2 tocsection-9"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Virtualization_Fundamentals"><span class="tocnumber">3.1</span> <span class="toctext">Virtualization Fundamentals</span></a></li>
<li class="toclevel-2 tocsection-10"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#Virtual_I/O_Internals"><span class="tocnumber">3.2</span> <span class="toctext">Virtual I/O Internals</span></a></li>
<li class="toclevel-2 tocsection-11"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html#GPU_Driver_Internals"><span class="tocnumber">3.3</span> <span class="toctext">GPU Driver Internals</span></a></li>
</ul>
</li>
</ul>
</div>

<h2><span class="mw-headline" id="Terminology">Terminology</span></h2>
<p>To get started with basic terminology around IO Virtualization read the <a href="index.php/Glossary.html" title="Glossary">Glossary</a> page. This will get you familiar with a few terms and concepts used in IO Virtualization documentation.
</p>
<h2><span class="mw-headline" id="Primitives">Primitives</span></h2>
<p>The primitives section will cover a few notes on the basics of virtualizing a GPU or IO device.
</p>
<h3><span class="mw-headline" id="PCI_BAR">PCI BAR</span></h3>
<p>PCI-e devices such as GPUs are used for input and output to and from a computer system. This input and output occurs using <a rel="nofollow" class="external text" href="http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1">TLPs or Transaction Layer Packets</a> over the PCI-e packet network. The IO device is presented to the host operating system as <a rel="nofollow" class="external text" href="https://wiki.osdev.org/PCI#Base_Address_Registers">BARs or Base Address Registers</a>.
</p>
<h3><span class="mw-headline" id="GPU_Drivers">GPU Drivers</span></h3>
<p>GPUs need software to communicate from a host computer system to the device - this software is called a GPU Driver and it typically interacts with the device using <a href="https://en.wikipedia.org/wiki/Memory-mapped_I/O" class="extiw" title="wikipedia:Memory-mapped I/O">MMIO or Memory Mapped IO</a>. MMIO is a set of operations used to allow normal CPU instructions to address registers in RAM in order to communicate with the PCI-e device. In the context of virtualization these registers must be presented into the device in a way that the guest operating system expects. Typically this is accomplished using <a rel="nofollow" class="external text" href="index.php/Virtual_I/O_Internals.html#All_Modes">VFIO or Virtual Function IO</a>. VFIO is used for many methods of virtualizing the device including discrete assignment of a physical device, or virtual (partitioned) device assignment created with or without hardware assistance.
</p>
<h3><span class="mw-headline" id="IOMMU">IOMMU</span></h3>
<p><a href="https://en.wikipedia.org/wiki/Memory_management_unit" class="extiw" title="wikipedia:Memory management unit">MMU or Memory Management Units</a> handle hardware enforced access to <a href="https://en.wikipedia.org/wiki/Memory_paging" class="extiw" title="wikipedia:Memory paging">memory paging</a> in computer systems. In the context of virtualized MMIO (Memory Mapped Input Output) devices an MMU is required to hardware enforce access to virtual devices (a <a href="https://en.wikipedia.org/wiki/Input%E2%80%93output_memory_management_unit" class="extiw" title="wikipedia:Input–output memory management unit">Memory Management Unit for Input Output is known as an IOMMU</a>). In the case of VFIO, groups of IOMMU devices (<a rel="nofollow" class="external text" href="https://vfio.blogspot.com/2014/08/iommu-groups-inside-and-out.html">IOMMU Groups</a>) are used to control access to the device. These IOMMU Groups often represent individual devices or sub-devices (in the context of <a rel="nofollow" class="external text" href="index.php/Virtual_I/O_Internals.html#Mdev_Mode">Unassisted Virtualization (VFIO-Mdev)</a>, <a rel="nofollow" class="external text" href="index.php/Virtual_I/O_Internals.html#SR-IOV_Mode">Hardware-Assisted Virtualization (SR-IOV)</a>, or <a rel="nofollow" class="external text" href="index.php/Virtual_I/O_Internals.html#SIOV_Mode">Hardware-Assisted Paravirtualization</a>) which may be bound to a VFIO bus driver (such as <a rel="nofollow" class="external text" href="https://docs.kernel.org/driver-api/vfio.html#vfio-bus-driver-api">vfio-pci</a>) which results in a <a rel="nofollow" class="external text" href="index.php/Virtual_I/O_Internals.html#Binding_VFIO_devices">VFIO Group</a> (unit of ownership). 
</p>
<h3><span class="mw-headline" id="Virtualization_vs._Paravirtualization">Virtualization vs. Paravirtualization</span></h3>
<p><a href="https://en.wikipedia.org/wiki/Virtualization" class="extiw" title="wikipedia:Virtualization">Virtualization</a> provides support for unmodified guest software or drivers in the context of GPUs.
</p><p><a href="https://en.wikipedia.org/wiki/Paravirtualization" class="extiw" title="wikipedia:Paravirtualization">Paravirtualization</a> provides support for "enlightened" guests or modified software which is aware of virtualization. 
</p>
<h3><span class="mw-headline" id="Unassisted_vs._Assisted">Unassisted vs. Assisted</span></h3>
<p>Similar to virtualization on CPUs with tools like Xen, IO devices can be virtualized on different kinds of computer hardware. Some devices provide hardware virtualization assistance (such as <a rel="nofollow" class="external text" href="https://wiki.xenproject.org/wiki/Xen_Project_Software_Overview#HVM_and_its_variants_.28x86.29">HVM mode in Xen</a>) and some do not (such as <a rel="nofollow" class="external text" href="https://wiki.xenproject.org/wiki/Xen_Project_Software_Overview#PV_.28x86.29">PV mode in Xen</a>), as a result an <a href="index.php/Virtual_I/O_Internals.html" title="Virtual I/O Internals">appropriate mode should be used</a> depending on the availability of assistance.
</p>
<h2><span class="mw-headline" id="Further_Reading">Further Reading</span></h2>
<p>This section will cover what you should read to obtain more information about virtualization.
</p>
<h3><span class="mw-headline" id="Virtualization_Fundamentals">Virtualization Fundamentals</span></h3>
<p>The <a href="index.php/Virtualization_Fundamentals.html" title="Virtualization Fundamentals">Virtualization Fundamentals</a> article provides links to some of the foundational work which underly modern virtualization industry and development today. If you'd like to understand both the theories on which virtualization builds as well as the history of industry you should read several articles here. Notable <i><a rel="nofollow" class="external text" href="https://en.m.wikipedia.org/wiki/Popek_and_Goldberg_virtualization_requirements">Popek and Goldberg Virtualization Requirements</a></i> as well as <i><a rel="nofollow" class="external text" href="https://www.cl.cam.ac.uk/research/srg/netos/papers/2003-xensosp.pdf">Xen and the Art of Virtualization</a></i> provide a great foundations-first approach to learning about virtualization.
</p>
<h3><span id="Virtual_I.2FO_Internals"></span><span class="mw-headline" id="Virtual_I/O_Internals">Virtual I/O Internals</span></h3>
<p>The <a href="index.php/Virtual_I/O_Internals.html" title="Virtual I/O Internals">Virtual I/O Internals</a> article provides a detailed look into the interface layers between IO driver internals, the hypervisor, and the guest OS. This is a great article to read if you'd like to better understand how virtual machines can interact with both discretely assigned devices as well as those which have been partitioned using software or firmware.
</p>
<h3><span class="mw-headline" id="GPU_Driver_Internals">GPU Driver Internals</span></h3>
<p>The <a href="index.php/GPU_Driver_Internals.html" title="GPU Driver Internals">GPU Driver Internals</a> article provides information on how GPU drivers are structured internally as well as how they achieve virtualization. This includes high level architecture, device initialization, as well as memory mapping, and scheduling.
</p>
<!-- 
NewPP limit report
Cached time: 20260911154757
Cache expiry: 86400
Reduced expiry: false
Complications: []
CPU time usage: 0.012 seconds
Real time usage: 0.014 seconds
Preprocessor visited node count: 43/1000000
Post‐expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Highest expansion depth: 2/40
Expensive parser function count: 0/100
Unstrip recursion depth: 0/20
Unstrip post‐expand size: 0/5000000 bytes
-->
<!--
Transclusion expansion time report (%,ms,calls,template)
100.00%    0.000      1 -total
-->

<!-- Saved in parser cache with key my_wiki:pcache:idhash:4507-0!canonical and timestamp 20260911154757 and revision id 23688. Serialized with JSON.
 -->
</div>
<div class="printfooter">Retrieved from "<a dir="ltr" href="index.php%3Ftitle=Introduction&amp;oldid=23688.html">https://open-iov.org/index.php?title=Introduction&amp;oldid=23688</a>"</div></div>
		<div id="catlinks" class="catlinks catlinks-allhidden" data-mw="interface"></div>
	</div>
</div>

<div id="mw-navigation">
	<h2>Navigation menu</h2>
	<div id="mw-head">
		<nav id="p-personal" class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu" aria-labelledby="p-personal-label" role="navigation" 
	 >
	<h3 id="p-personal-label" class="vector-menu-heading"> <span>Personal tools</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"><li id="pt-login" class="mw-list-item"><a href="https://open-iov.org/index.php?title=Special:UserLogin&amp;returnto=Introduction&amp;returntoquery=oldid%3D23688" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o">Log in</a></li></ul>
		
	</div>
</nav>

		<div id="left-navigation">
			<nav id="p-namespaces" class="mw-portlet mw-portlet-namespaces vector-menu vector-menu-tabs" aria-labelledby="p-namespaces-label" role="navigation" 
	 >
	<h3 id="p-namespaces-label" class="vector-menu-heading"> <span>Namespaces</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"><li id="ca-nstab-main" class="selected mw-list-item"><a href="index.php/Introduction.html" title="View the content page [c]" accesskey="c">Page</a></li><li id="ca-talk" class="new mw-list-item"><a href="https://open-iov.org/index.php?title=Talk:Introduction&amp;action=edit&amp;redlink=1" rel="discussion" title="Discussion about the content page (page does not exist) [t]" accesskey="t">Discussion</a></li></ul>
		
	</div>
</nav>

			<nav id="p-variants" class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown-noicon vector-menu vector-menu-dropdown" aria-labelledby="p-variants-label" role="navigation" 
	 >
	<input type="checkbox"
		id="p-variants-checkbox"
		role="button"
		aria-haspopup="true"
		data-event-name="ui.dropdown-p-variants"
		class=" vector-menu-checkbox" aria-labelledby="p-variants-label" />
	<h3 id="p-variants-label" class="vector-menu-heading"> <span>Variants</span>
			<span class="vector-menu-checkbox-expanded">expanded</span>
			<span class="vector-menu-checkbox-collapsed">collapsed</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"></ul>
		
	</div>
</nav>

		</div>
		<div id="right-navigation">
			<nav id="p-views" class="mw-portlet mw-portlet-views vector-menu vector-menu-tabs" aria-labelledby="p-views-label" role="navigation" 
	 >
	<h3 id="p-views-label" class="vector-menu-heading"> <span>Views</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"><li id="ca-view" class="selected mw-list-item"><a href="index.php/Introduction.html">Read</a></li><li id="ca-viewsource" class="mw-list-item"><a href="index.php%3Ftitle=Introduction&amp;action=edit.html" title="This page is protected.&#10;You can view its source [e]" accesskey="e">View source</a></li><li id="ca-history" class="mw-list-item"><a href="index.php%3Ftitle=Introduction&amp;action=history.html" title="Past revisions of this page [h]" accesskey="h">View history</a></li></ul>
		
	</div>
</nav>

			<nav id="p-cactions" class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown-noicon vector-menu vector-menu-dropdown" aria-labelledby="p-cactions-label" role="navigation"  title="More options"
	 >
	<input type="checkbox"
		id="p-cactions-checkbox"
		role="button"
		aria-haspopup="true"
		data-event-name="ui.dropdown-p-cactions"
		class=" vector-menu-checkbox" aria-labelledby="p-cactions-label" />
	<h3 id="p-cactions-label" class="vector-menu-heading"> <span>More</span>
			<span class="vector-menu-checkbox-expanded">expanded</span>
			<span class="vector-menu-checkbox-collapsed">collapsed</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"></ul>
		
	</div>
</nav>

			<div id="p-search" role="search" class="vector-search-box">
	<div>
		<h3 >
			<label for="searchInput">Search</label>
		</h3>
		<form action="https://open-iov.org/index.php" id="searchform">
			<div id="simpleSearch" data-search-loc="header-navigation">
				<input type="search" name="search" placeholder="Search Open-IOV" autocapitalize="sentences" title="Search Open-IOV [f]" accesskey="f" id="searchInput"/>
				<input type="hidden" name="title" value="Special:Search"/>
				<input type="submit" name="fulltext" value="Search" title="Search the pages for this text" id="mw-searchButton" class="searchButton mw-fallbackSearchButton"/>
				<input type="submit" name="go" value="Go" title="Go to a page with this exact name if it exists" id="searchButton" class="searchButton"/>
			</div>
		</form>
	</div>
</div>

		</div>
	</div>
	
<div id="mw-panel">
	<div id="p-logo" role="banner">
		<a class="mw-wiki-logo" href="images/archive/c/c3/20221214193624!I915_Scheduling_Events_and_Requests.png.html"
			title="Visit the main page"></a>
	</div>
	<nav id="p-navigation" class="mw-portlet mw-portlet-navigation vector-menu vector-menu-portal portal" aria-labelledby="p-navigation-label" role="navigation" 
	 >
	<h3 id="p-navigation-label" class="vector-menu-heading"> <span>Navigation</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"><li id="n-mainpage-description" class="mw-list-item"><a href="images/archive/c/c3/20221214193624!I915_Scheduling_Events_and_Requests.png.html" title="Visit the main page [z]" accesskey="z">Main page</a></li><li id="n-recentchanges" class="mw-list-item"><a href="https://open-iov.org/index.php/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r">Recent changes</a></li><li id="n-randompage" class="mw-list-item"><a href="index.php/Special:Random.html" title="Load a random page [x]" accesskey="x">Random page</a></li><li id="n-help-mediawiki" class="mw-list-item"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">Help about MediaWiki</a></li></ul>
		
	</div>
</nav>

	<nav id="p-tb" class="mw-portlet mw-portlet-tb vector-menu vector-menu-portal portal" aria-labelledby="p-tb-label" role="navigation" 
	 >
	<h3 id="p-tb-label" class="vector-menu-heading"> <span>Tools</span>
	</h3>
	<div class="vector-menu-content">
		
		<ul class="vector-menu-content-list"><li id="t-whatlinkshere" class="mw-list-item"><a href="index.php/Special:WhatLinksHere/Introduction.html" title="A list of all wiki pages that link here [j]" accesskey="j">What links here</a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="https://open-iov.org/index.php/Special:RecentChangesLinked/Introduction" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k">Related changes</a></li><li id="t-specialpages" class="mw-list-item"><a href="index.php/Special:SpecialPages.html" title="A list of all special pages [q]" accesskey="q">Special pages</a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="Printable version of this page [p]" accesskey="p">Printable version</a></li><li id="t-permalink" class="mw-list-item"><a href="index.php%3Ftitle=Introduction&amp;oldid=23688.html" title="Permanent link to this revision of the page">Permanent link</a></li><li id="t-info" class="mw-list-item"><a href="index.php%3Ftitle=Introduction&amp;action=info.html" title="More information about this page">Page information</a></li></ul>
		
	</div>
</nav>

	
</div>

</div>
<footer id="footer" class="mw-footer" role="contentinfo" >
	<ul id="footer-info" >
	<li id="footer-info-lastmod"> This page was last edited on 19 January 2023, at 03:21.</li>
</ul>

	<ul id="footer-places" >
	<li id="footer-places-privacy"><a href="https://open-iov.org/index.php/Open-IOV:Privacy_policy" title="Open-IOV:Privacy policy">Privacy policy</a></li>
	<li id="footer-places-about"><a href="index.php/Open-IOV:About.html" title="Open-IOV:About">About Open-IOV</a></li>
	<li id="footer-places-disclaimer"><a href="https://open-iov.org/index.php/Open-IOV:General_disclaimer" title="Open-IOV:General disclaimer">Disclaimers</a></li>
</ul>

	<ul id="footer-icons" class="noprint">
	<li id="footer-poweredbyico"><a href="https://www.mediawiki.org/"><img src="resources/assets/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" srcset="resources/assets/poweredby_mediawiki_132x47.png 1.5x, resources/assets/poweredby_mediawiki_176x62.png 2x" width="88" height="31" loading="lazy"/></a></li>
</ul>

</footer>


<script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"0.012","walltime":"0.014","ppvisitednodes":{"value":43,"limit":1000000},"postexpandincludesize":{"value":0,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":2,"limit":40},"expensivefunctioncount":{"value":0,"limit":100},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"timingprofile":["100.00%    0.000      1 -total"]},"cachereport":{"timestamp":"20260911154757","ttl":86400,"transientcontent":false}}});mw.config.set({"wgBackendResponseTime":69});});</script>
<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a399690e4ee439c9',t:'MTc4OTE1ODQxNw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>