GNU/Linux >> Znalost Linux >  >> Linux

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

S vyvoláváním funkcí v uživatelském prostoru z jádra máte smůlu, protože jádro neví a ani by nemělo vědět o jednotlivých funkcích a logice aplikací v uživatelském prostoru, nemluvě o tom, že každá aplikace v uživatelském prostoru má svou vlastní paměť. rozvržení, do kterého žádný jiný proces ani jádro nemůže tímto způsobem napadnout (sdílené objekty jsou zde výjimkou, ale přesto se do toho z prostoru jádra nedostanete). A co model zabezpečení, neměli byste spouštět kód uživatelského prostoru (který je v kontextu jádra automaticky považován za nebezpečný) v kontextu jádra, protože to naruší bezpečnostní model jádra přímo v něm. ten okamžik. Nyní vezmeme-li v úvahu vše výše uvedené a mnoho dalších motivů, možná budete chtít přehodnotit svůj přístup a zaměřit se na jádro <-> IPC a rozhraní v uživatelském prostoru, systém souborů nebo pomocné API uživatelského režimu (přečtěte si níže).

Aplikace uživatelského prostoru však můžete vyvolat z jádra pomocí rozhraní API uživatelského režimu. Následující článek IBM DeveloperWorks by vám měl pomoci začít používat rozhraní API pro jádro Linuxu usermode-helper:

Rozhraní API jádra, Část 1:Vyvolání aplikací v uživatelském prostoru z jádra


Myslím, že nejjednodušší způsob je zaregistrovat znakové zařízení, které se stane připraveným, když má zařízení nějaká data.

Jakýkoli proces, který se pokusí číst z tohoto zařízení, se poté uspí, dokud není zařízení připraveno, a poté se probudí, v tomto okamžiku může provést příslušnou věc.

Pokud chcete pouze signalizovat připravenost, čtečka může přečíst pouze jeden prázdný bajt.

Programu v uživatelském prostoru by pak stačilo provést blokující volání read() a byl by patřičně zablokován, dokud ho neprobudíte.

Abyste to mohli používat, budete muset porozumět mechanismu fronty čekání v plánovači jádra.


Zdá se, že vaše přerušovací linka je již dostupná uživatelskému prostoru prostřednictvím gpiolib? (/sys/class/gpio/...)

Testovali jste, zda je pro vás spouštění okrajů gpio a poll() dostatečně rychlé? Tímto způsobem nemusíte zjišťovat stav z aplikace uživatelského prostoru, ale spouštění okrajů jej ohlásí pomocí poll(). Viz Documentation/gpio.txt ve zdrojovém kódu jádra.

Pokud spouštění hran pomocí sysfs není dost dobré, pak správným způsobem je vyvinout ovladač jádra, který se postará o časově kritickou část a exportuje výsledky do uživatelského prostoru přes API (sysfs, uzel zařízení atd.).


Linux
  1. Jak nainstalovat jádro 5.13 v Ubuntu 18.04 z úložiště 20.04

  2. Co se stalo s volným prostorem?

  3. Funkce kořene uživatelské skupiny??

  1. Ovladač zařízení linuxového jádra na DMA ze zařízení do paměti uživatelského prostoru

  2. Jak interně funguje copy_from_user z jádra Linuxu?

  3. Proč se funkce zavření nazývá release v `struct file_operations` v jádře Linuxu?

  1. Proč je jádro mapováno do stejného adresního prostoru jako procesy?

  2. Jak přidat funkci dotazování do kódu modulu jádra?

  3. Jak velká velikost je potřeba při kompilaci linuxového jádra?