GNU/Linux >> Znalost Linux >  >> Linux

Volání funkce uživatelského prostoru z modulu jádra Linuxu

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ího read() 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.


Linux
  1. Volání funkce C z kódu C++

  2. Přesměrování výstupu z funkčního bloku do souboru v Linuxu

  3. Nelze volat funkci standardní knihovny C na 64bitovém Linuxu z kódu sestavení (yasm).

  1. Linuxové jádro dereference NULL-pointeru v memsetu z kzalloc

  2. Fork vs Clone na 2.6 Kernel Linuxu

  3. Zavolejte systémové volání Linuxu ze skriptovacího jazyka

  1. Linux – poskvrněné jádro v Linuxu?

  2. Linux – Jak správně znovu načíst modul jádra?

  3. Spuštění funkce uživatelského prostoru z prostoru jádra