Myslím, že nejjednodušším řešením by bylo vytvořit znakové zařízení v ovladači jádra s vlastními operacemi se soubory pro virtuální soubor. Uživatelský prostor pak může toto zařízení otevřít O_RDWR
. Musíte implementovat dvě hlavní operace se soubory:
-
read
-- takto jádro předává data zpět do uživatelského prostoru. Tato funkce se spouští v kontextu vlákna uživatelského prostoru volajícíhoread()
systémové volání a ve vašem případě by se mělo zablokovat, dokud jádro nebude mít jinou počáteční hodnotu, pro kterou potřebuje znát výstup. -
write
-- takto předává uživatelský prostor data do jádra. Ve vašem případě by jádro pouze vzalo odpověď na předchozí čtení a předalo ji hardwaru.
Pak skončíte s jednoduchou smyčkou v uživatelském prostoru:
while (1) {
read(fd, buf, sizeof buf);
calculate_output(buf, output);
write(fd, output, sizeof output);
}
a v jádře vůbec žádná smyčka -- vše běží v kontextu procesu uživatelského prostoru, který věci řídí, a ovladač jádra je zodpovědný pouze za přesun dat do/z hardwaru.
V závislosti na tom, jaké je vaše „zde udělat nějaké náhodné věci“ na straně jádra, to možná nebude možné udělat tak jednoduše. Pokud opravdu potřebujete smyčku jádra, musíte vytvořit vlákno jádra pro spuštění této smyčky a pak mít nějaké proměnné ve smyslu input_data
, input_ready
, output_data
a output_ready
, spolu s několika čekacími frontami a jakýmkoliv uzamčením, které potřebujete.
Když vlákno jádra čte data, vložíte data do input_ready
a nastavte input_ready
označte a signalizujte vstupní čekací frontu a poté proveďte wait_event(<output_ready is set>)
. read
operace se souborem udělá wait_event(<input_ready is set>)
a vraťte data do uživatelského prostoru, jakmile budou připravena. Podobně write
operace se souborem přesune data, která získá z uživatelského prostoru, do output_data
a nastavte output_ready
a signalizovat výstupní frontu.
Další (ošklivější, méně přenosný) způsob je použít něco jako ioperm
, iopl
nebo /dev/port
dělat vše kompletně v uživatelském prostoru, včetně nízkoúrovňového hardwarového přístupu.