ioctl

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 .

Úkon

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í.

Příklady použití

Konfigurace zařízení

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.

Terminály

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 .

Rozšíření jádra

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* .

Implementace

Unix

Unix ioctl bere jako parametry:

  1. otevřený deskriptor souboru ;
  2. konkrétní kód žádosti;
  3. buď diskrétní hodnota (celé číslo nebo jinak), nebo ukazatel na datovou strukturu na ovladač zařízení nebo z ovladače zařízení, nebo obojí.

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:

  1. velikost přenášených údajů;
  2. směr převodu;
  3. totožnost ovladače zařízení.

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

Win32 ioctl bere jako parametry:

  1. otevřený popisovač na objektu (ekvivalent Win32 deskriptoru souboru);
  2. kód požadavku ( kontrolní kód );
  3. pufru pro vstupní parametry;
  4. velikost vstupní vyrovnávací paměti;
  5. vyrovnávací paměť pro výstupní parametry;
  6. velikost výstupní vyrovnávací paměti.
  7. struktura, OVERLAPPEDpokud je použit režim překrytí .

Kód požadavku bere v úvahu režim provozu (ovlivňující bezpečnost pilota):

  1. METHOD_IN_DIRECT - adresa vyrovnávací paměti musí být pro volajícího autorizována ke čtení v uživatelském režimu;
  2. METHOD_OUT_DIRECT - adresa vyrovnávací paměti musí být pro volajícího v uživatelském režimu povolena pro zápis;
  3. METHOD_NEITHER- virtuální adresa vyrovnávací paměti je předána bez ověření nebo mapování  ;
  4. METHOD_BUFFERED- sdílené vyrovnávací paměti správce IO se používají k přenosu dat za do uživatelského prostoru.

Alternativy

Další vektorová rozhraní volání

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í:

  1. volání fcntl( ovládání souboru ) se používá ke konfiguraci dříve otevřených souborů (umožňuje například aktivovat neblokující I / O);
  2. volání setsockopt( možnost nastavení zásuvky ) umožňuje konfigurovat dříve otevřené zásuvky (umožňuje například konfigurovat bránu firewall ipfw v systémech BSD ).

Mapování paměti

Reference