diff options
| author | Open-IOV <dev@open-iov.org> | 2026-09-23 05:44:08 -0400 |
|---|---|---|
| committer | Open-IOV <dev@open-iov.org> | 2026-09-23 05:46:43 -0400 |
| commit | 68cdd7728a7cc6715bbbff7decfe2b11c3bdf558 (patch) | |
| tree | 3dc8ce2e6af313a97ec6852f5c663a9a93665d2e /wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html | |
| download | open-iov-68cdd7728a7cc6715bbbff7decfe2b11c3bdf558.tar.gz open-iov-68cdd7728a7cc6715bbbff7decfe2b11c3bdf558.zip | |
Open-IOV: initial public release
Open-IOV virtualizes NVIDIA GPUs so that unmodified guest drivers run with
real GPU functionality - CUDA first, 3D and video to follow - on unmodified
hosts, without a proprietary vGPU license and without patching any driver,
firmware or hypervisor.
Core principle: emulate the interface, pass through the work.
kernel/ open-iov-vfio.ko - host VFIO mdev driver: virtual GPU device
(PCI config space, BAR shadows, MSI-X), GSP boot emulation,
GSP-RM message-queue/RPC emulation, memory model (GPU-VA to
guest-PA discovery) and the semaphore-completion service that
advances guest UVM progress.
userspace/ libiov.so management API and examples.
tools/ guest diagnostics, firmware analysis wrappers, RM probes.
scripts/ stack manager, VM harness, build/load/test automation.
config/ hardware/version profiles (the portability surface).
docs/ documentation tree - start at docs/README.md.
wiki/ long-form firmware and protocol deep dives.
Status: initialization works end to end for a stock 570.144 Linux guest on
Turing (TU104): driver probe, nvidia-smi, the full GSP-RM control battery,
object creation and the early CUDA/UVM start-up path. GPU work forwarding -
the step that makes CUDA kernels execute on real hardware - is the active
work item; see docs/04-implementation/01-known-knowns-and-unknowns.md.
License: BSD-3-Clause for the project; GPL-2.0 for kernel modules that link
GPL-only kernel interfaces. See LICENSE and docs/09-reference/legal-and-licensing.md.
Diffstat (limited to 'wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html')
| -rw-r--r-- | wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html b/wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html new file mode 100644 index 0000000..3e17ea4 --- /dev/null +++ b/wiki/open-iov.org/index.php?title=Introduction&oldid=23688.html @@ -0,0 +1,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&modules=ext.visualEditor.desktopArticleTarget.noscript%7Cmediawiki.action.styles%7Cmediawiki.interface.helpers.styles%7Cskins.vector.styles.legacy&only=styles&skin=vector"/> +<script async="" src="load.php%3Flang=en&modules=startup&only=scripts&raw=1&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&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&action=edit&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&action=edit&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&diff=prev&oldid=23688" title="Introduction">diff</a>) <a href="https://open-iov.org/index.php?title=Introduction&direction=prev&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&oldid=23688.html#mw-head">Jump to navigation</a> + <a class="mw-jump-link" href="index.php%3Ftitle=Introduction&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&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&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&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&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&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&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&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&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&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&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&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&oldid=23688.html">https://open-iov.org/index.php?title=Introduction&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&returnto=Introduction&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&action=edit&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&action=edit.html" title="This page is protected. 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&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&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&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>
\ No newline at end of file |
