Při výpočtu, ioctl , což znamená, místní ovládání vstupů a výstupů (řídicí vstup-výstup), je systémové volání pro operace vstupu-výstupu specifické pro zařízení, které nemohou být provedeny běžným systémové volání. Přijímá parametr specifikující kód požadavku, který má být proveden; účinek tohoto volání zcela závisí na požadavkovém kódu. Kódy požadavků jsou často specifické pro zařízení. Například ovladač CD-ROM, který chce vysunout disk z jednotky, musí poskytnout ioctl kód požadavku, aby to mohl provést. Kódy požadavku nezávislé na zařízení se někdy používají k poskytnutí přístupu z uživatelského prostoru k funkcím jádra používaným pouze jádrem systému nebo stále ve vývoji.
Systémové volání ioctlse pod tímto názvem objevilo poprvé ve verzi 7 systému Unix . je podporován většinou Unixů a souvisejících systémů , včetně Linux a OS X , ačkoli se navrhované kódy dotazů liší od jednoho operačního systému k druhému. Microsoft Windows poskytuje podobnou pojmenovanou funkci DeviceIoControlve svém Win32 API .
Konvenční operační systémy rozdělují paměť na 2 prostory: uživatelský prostor a prostor jádra . Kód pro aplikaci, jako je textový editor, je umístěn v uživatelském prostoru, zatímco základní funkce operačního systému, jako je síťový zásobník , jsou umístěny v jádře. Kód jádra spravuje citlivé zdroje a implementuje bariéry zabezpečení a spolehlivosti mezi aplikacemi. Z tohoto důvodu nemohou aplikace uživatelského prostoru přímo přistupovat k prostředkům jádra.
Aplikace v uživatelském prostoru obvykle vytvářejí požadavky na jádro prostřednictvím systémových volání , jejichž kód je umístěn v prostoru jádra. Systémové volání má obvykle formu „vektoru systémového volání“, ve kterém je požadované systémové volání indikováno indexovým číslem. Může exit()to být například číslo systémového volání 1 a write()číslo systémového volání 4. Vektor systémového volání se používá k vyhledání požadované funkce jádra pro dotaz. To je důvod, proč typické operační systémy obvykle nabízejí několik stovek systémových volání do uživatelského prostoru.
Ačkoli je snadný způsob přístupu k funkcím operačního systému, systémová volání nemusí být vhodná pro přístup k nestandardním fyzickým zařízením. Zařízení jsou přímo adresovatelná pouze z prostoru jádra. Kód uživatelského prostoru však často vyžaduje přímý přístup k zařízení (například konfigurace typu média ethernetového rozhraní ). Moderní operační systémy podporují velké množství periferií a také velké množství funkcí. Mnoho z těchto funkcí nelze předem naplánovat, a proto nemusí být nutně implementovatelné systémovými voláními.
K vyřešení tohoto problému jsou jádra navržena tak, aby byla škálovatelná, a proto přijímají moduly zvané ovladače zařízení, které běží v prostoru jádra a mohou přímo adresovat zařízení. Rozhraní podobné ioctl je charakterizováno jediným systémovým voláním, jehož prostřednictvím může program uživatelského prostoru komunikovat se zařízením. Jak je vidět výše, požadavky na zařízení se vektorizují z tohoto systémového volání obvykle pomocí jedinečného identifikátoru a kódu požadavku. Tímto způsobem jádro umožňuje uživatelskému programu komunikovat s ovladačem zařízení bez znalosti jeho funkcí a bez implementace velkého počtu systémových volání.
Nejběžnější použití ioctls je pro ovládání fyzických zařízení. Například v operačních systémech Win32 ( Windows ) lze komunikovat se zařízeními USB pomocí ioctls . Je také možné získat informace o geometrii pevných disků .
Unixový OS ( Linux , FreeBSD , OS X ) používá ioctls ke konfiguraci síťových rozhraní. Například v systémech odvozených od BSD můžete konfigurovat masku podsítě otevřením soketu a následným použitím ioctl SIOCSIFNETMASK na něm.
Jedno viditelné použití ioctls je ovládání terminálu .
Unixové operační systémy mají tradičně jako rozhraní interpret příkazů . Tlumočník příkazů Unix je založen na pseudoterminálech ( TTY ), které emulují staré fyzické terminály v textovém režimu, například VT100 . Tyto pseudoterminály jsou konfigurovány, jako by šlo o logická zařízení využívající ioctls . Například velikost okna pseudoterminálu lze konfigurovat pomocí ioctl TIOCSWINSZ .
Když chce aplikace rozšířit možnosti jádra, například pro zrychlení síťového zpracování, ioctls poskytuje most mezi kódem v uživatelském prostoru a rozšířeními nebo moduly . Rozhraní k těmto modulům často sestává z položek v souborovém systému, prostřednictvím kterých lze použít řadu ioctls . Například v operačním systému Solaris lze vrstvu filtrování IP paketů konfigurovat pomocí rodiny ioctlsSIOCIPF* .
Unix ioctl bere jako parametry:
Jádro předá požadavek přímo do ovladače zařízení. Je na něm, aby žádost vyložil. Vývojáři ovladače zařízení poskytují zdokumentovaný seznam ioctls podporovaných tímto ovladačem jako konstanty v záhlaví (souboru .h).
Unixový OS, včetně Linuxu , dodržuje konvenci kódování uvnitř požadavku:
Pokud ovladač zařízení požadavek nerozpozná, je vrácen jedinečný kód chyby (kód ENOTTY).
Poznámka: kód ENOTTY(odvozený ze zprávy „Není psací stroj“ ) pochází ze skutečnosti, že ve starých systémech mohla tuto chybu vrátit pouze dálnopisy ( TTY ). Ačkoli se používají z důvodů kompatibility, novější systémy místo toho vracejí zprávu jako „Nevhodná operace ovládání zařízení“ .
Například ioctl TCSETS používají sériové porty . Přenos dat je řízen hovory read()a write()zatímco je hovor ioctl(fd, TCSETS, data)používán k ovládání různých stavů portů.
Win32 ioctl bere jako parametry:
Kód požadavku bere v úvahu režim provozu (ovlivňující bezpečnost pilota):
Periferie a moduly mohou komunikovat s uživatelským prostorem prostřednictvím nových systémových volání. Tento přístup se však používá jen zřídka.
V operačním systému Unix se běžně používají dvě další rozhraní: