GNU/Linux >> Znalost Linux >  >> Linux

zásobník jádra a zásobník uživatelského prostoru

  1. Jaký je rozdíl mezi zásobníkem jádra a zásobníkem uživatelů?

Zkrátka nic - kromě použití jiného umístění v paměti (a tím i jiné hodnoty registru ukazatelů zásobníku) a obvykle jiných ochran přístupu do paměti. Tj. při provádění v uživatelském režimu nebude paměť jádra (jejíž součástí je zásobník jádra) přístupná, i když je mapována. A naopak, aniž by to kód jádra výslovně požadoval (v Linuxu prostřednictvím funkcí jako copy_from_user() ), uživatelská paměť (včetně uživatelského zásobníku) není obvykle přímo přístupná.

  1. Proč se používá [ samostatný ] zásobník jádra?

Oddělení privilegií a bezpečnosti. Za prvé, programy v uživatelském prostoru si mohou vytvořit svůj zásobník (ukazatel) cokoli, co chtějí, a obvykle neexistuje žádný architektonický požadavek, aby měl nějaký platný. Jádro proto nemůže důvěřovat aby byl ukazatel zásobníku uživatelského prostoru platný ani použitelný, a proto bude vyžadovat jednu sadu pod vlastní kontrolou. Různé architektury CPU to implementují různými způsoby; CPU x86 automaticky přepínají ukazatele zásobníku, když dojde k přepnutí režimu oprávnění, a hodnoty, které se mají použít pro různé úrovně oprávnění, jsou konfigurovatelné – pomocí privilegovaného kódu (tj. pouze jádra).

  1. Pokud je v ISR deklarována lokální proměnná, kde bude uložena?

Na zásobníku jádra. Jádro (tj. linuxové jádro) není připojte ISR přímo k bránám přerušení architektury x86 ale místo toho deleguje odesílání přerušení na běžný mechanismus vstupu/výstupu přerušení jádra, který před voláním registrovaných manipulátorů uloží stav registru před přerušením. Samotný CPU při odesílání přerušení může vykonat privilegium a/nebo přepínač zásobníku, což používá/nastavuje jádro, takže běžný vstupní kód přerušení se již může spoléhat na přítomnost zásobníku jádra.
To znamená, že přerušení, ke kterým dojde při provádění kódu jádra, budou jednoduše (pokračovat) používat zásobník jádra na místě v tomto bodě. To může, pokud mají obslužné nástroje přerušení hluboce vnořené cesty volání, vést k přetečení zásobníku (pokud je cesta volání hlubokého jádra přerušena a obslužná rutina způsobí další hlubokou cestu; v Linuxu je kód RAID souborového systému / softwaru přerušovaný síťovým kódem s aktivními iptables je známo, že to spouští v nevyladěných starších jádrech ... řešením je zvýšit velikost zásobníku jádra pro takové zátěže).

  1. Má každý proces svůj vlastní zásobník jádra?

Nejen každý proces – každé vlákno má svůj vlastní zásobník jádra (a vlastně také vlastní zásobník uživatelů). Pamatujte, že jediný rozdíl mezi procesy a vlákny (pro Linux) je skutečnost, že více vláken může sdílet adresní prostor (tvořící proces).

  1. Jak probíhá koordinace procesu mezi oběma těmito zásobníky?

Vůbec ne – není potřeba. Plánování (jak / kdy jsou spuštěna různá vlákna, jak se jejich stav ukládá a obnovuje) je úkolem operačního systému a procesy se tím nemusí zabývat. Jak jsou vlákna vytvářena (a každý proces musí mít alespoň jedno vlákno), jádro pro ně vytváří zásobníky jádra, zatímco zásobníky uživatelského prostoru jsou buď explicitně vytvářeny/poskytovány jakýmkoli mechanismem použitým k vytvoření vlákna (funkce jako makecontext() nebo pthread_create() umožnit volajícímu specifikovat oblast paměti, která se má použít pro zásobník „podprocesu“ nebo zdědit (pomocí klonování paměti s přístupem, obvykle nazývaného „kopie při zápisu“ / COW, při vytváření nového procesu).
To znamená, že proces může ovlivnit plánování jeho vláken a/nebo ovlivnit kontext (stav, mezi tím je ukazatel zásobníku vlákna). Existuje několik způsobů:signály UNIX, setcontext() , pthread_yield() / pthread_cancel() , ... - ale to trochu odbočuje od původní otázky.


Moje odpověď je shromážděna z dalších otázek SO s mými materiály.

What's the difference between kernel stack and user stack?

Jako programátor jádra víte, že jádro by mělo být omezeno na chybné uživatelské programy. Předpokládejme, že udržujete stejný zásobník pro jádro i uživatelský prostor, pak jednoduchý segfault v uživatelské aplikaci zhroutí jádro a je třeba jej restartovat.

Existuje jeden „zásobník jádra“ na CPU, jako je zásobník ISR a jeden „zásobník jádra“ na proces. Pro každý proces existuje jeden "uživatelský zásobník", ačkoli každé vlákno má svůj vlastní zásobník, včetně uživatelských a jaderných vláken.

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Takže když jsme v režimu jádra, zásobníkový mechanismus je nezbytný pro práci s voláním funkcí, lokálními proměnnými podobnými uživatelskému prostoru.

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Bude uložen v zásobníku ISR (IRQSTACKSIZE). ISR běží na samostatném zásobníku přerušení, pouze pokud to hardware podporuje. V opačném případě jsou rámečky zásobníku ISR nasunuty na zásobník přerušeného vlákna.

Uživatelský prostor neví a upřímně řečeno se nestará o to, zda je přerušení obsluhováno v zásobníku jádra aktuálního procesu nebo v samostatném zásobníku ISR. Protože přerušení přichází na procesor, proto zásobník ISR musí být na procesor.

 Does each process has its own kernel stack ?

Ano. Každý proces má svůj vlastní zásobník jádra.

 Then how the process coordinates between both these stacks?

Odpověď @FrankH se mi zdá skvělá.


Linux
  1. Linux – rozdíl mezi uživatelským prostorem a prostorem jádra?

  2. Linux – Co je velká a nízká paměť v Linuxu?

  3. Rozdíl mezi uživatelem Sudo a uživatelem root?

  1. Naučte se rozdíl mezi příkazy „su“ a „su -“ v Linuxu

  2. Uživatelé a skupiny

  3. Linux – Proč existuje zásada jádra Linuxu, která nikdy nenaruší uživatelský prostor?

  1. Získat čas uživatele a jádra běžícího procesu?

  2. Linux – Jak linuxové jádro naplánuje CPU, mezi procesy/vlákny v uživatelském prostoru a úkoly/úlohy jádra?

  3. Základy uživatele a databáze MySQL