Přístup k hardwaru
-=-=-=-=-=-=-=-=-=-=
We all know Linux is great...it does infinite loops in 5 seconds.
-- Linus Torvalds
Jednen z nejgeniálnějsích nápadů UNIXu byl rozhodně způsob,
jakým zprostředkovával přístup k hardwaru. Všechny ovladače byly
v jádře a pro programy zařízení spřístupňují pomocí speciálních
souborů (devices). Proto pro program je například zahrát zvuk stejně
snadné, jako jeho uložení do souboru. Prostě zvuk zapíše do souboru
/dev/audio. Jsou zde soubory pro disky, paměť, zvuk prostě všechno,
co potřebujete. Nejsou třeba žádná speciální volání jádra pro
jednotlivá zařízení a další komplikace.
Protože jsou ale funkce, které lze těžko převádět na práci se
souborem (nastavení samplovaci frekvence, nebo hlasitosti apod),
zavedl UNIX ještě volání ioctl (input output control list), který
takové speciální funkce uožňuje.
Od tohoto řešení ale některé novější systému upustily, protože
je poněkud nepřehledný. Plan9 například má pro každé zařízení dvě
device. Do jedné se zapisují data a do druhé textové příkazy.
Systém devicí je v UNIXu řešen přes major a minor čísla. Device
jsou normální soubory s nastaveným speciálním flagem a s těmito
čísly. Kařdý ovladač v jádře má svoje číslo (třeba zvuk má 14).
Všechny device s major číslem 14 jsou směřovány do zvukového
driveru. Ten ovládá hned několik devicí (/dev/audio pro přehrávání
digitalních zvuku, /dev/mixer pro nastavování hlasitosti, /dev/midi
pro midi apod.) Každá tato device má jiné minor číslo.
Tento systém má ale nevýhodu v tom, že samotné přidání ovladače
nestačí - musíte ještě navíc někde na disku (většinou v adresáři
/dev) přidat soubor. Navíc není možné aby jádro samo takové
soubory vytvářelo. Proto je v UNIXu například omezený počet pseudo
terminálů. První řešení obsahoval SystemV, který obsahoval tzv.
proc filesystém. To je normální filesystém, který ale není nikde
fyzicky na disku, ale obsahuje různé soubory vytvářené přímo jádrem.
Například adresář pro každý běžící proces, který obsahuje soubory
jako cmdline (obsahuje příkaz, kterým byl proces spuštěn), mem
(obsahuje paměť) apod.
V SystemuV (A v Linuxu) tedy existují dva mechanizmy - klasické
device a proc filesystém. Některé operační systémy ale toto dotáhly
dál a přidaly device do proc filesystému. Nejdéle to pravděpodobně
dotáhl plan9, kde nejenom kernel ale i normální programy používají
takové soubory pro komunikaci. Najdete tam například adresář
/dev/window, kde jsou očíslované adresáře pro jednotlivá okna
a v každém jsou soubory jako kbd (pro čtení klávesnice), mouse
(pro myš), bitblt (pro kreslení na obrazovku) apod. Každý proces má
svoje okno namapované přímo do /dev a tak nakreslení čáry do okna se
dělá pomocí zapsání příkazu "nakresi čáru" do souboru /dev/bitblt.
Textový editor zase vytváří takové soubory pro editované soubory
a tak externí utilitky je mohou měnit.
Celý plan9 je postaven na komunikaci pomocí souborů. Volání
jádra jsou omezena na nutné minimum. Zjišťování času se provádí
čtením souboru /dev/msec, otvírání síťového socketu pomocí čtení
/net/socket/clone apod. To přináší velmi zajímavé důsledky. Pokud
například přes síť namapujete všechny soubory jednoho počítače
na druhý a tam spustíte program, program sice běží na cízím CPU
ale jinak veškeré prostředí je identické z původním počítačem -
ps tak vypíše procesy na vzdáleném počítači, debugger debuguje
vzdálené procesy apod. To kam je který filesystém napojen není
v planu9 utázkou systému, ale každý proces může mít vlastní. A tak
každý proces může mít vlastní prostředí. Pokud potřebujete cosi
jako telnet, namapujete pouze konzoli (/dev/con, /dev/kbd apod.),
pokud potřebujete kopírovat soubory, namapujete celý filesystém
do podadresáře apod.
výheň