User space

Obszar pamięci i poziom uprawnień, w którym działają zwykłe aplikacje, odizolowane od jądra. Programy korzystają z zasobów sprzętu wyłącznie przez wywołania systemowe.

User space to obszar pamięci i poziom uprawnień procesora, w którym działają zwykłe programy: twoja przeglądarka, edytor, serwer aplikacji, a nawet powłoka, do której wpisujesz komendy. Procesy w user space są odizolowane od jądra (kernel space) i od siebie nawzajem — każdy dostaje własną wirtualną przestrzeń adresową i nie może ot tak grzebać w pamięci sąsiada ani sterować sprzętem bezpośrednio. Gdy taki program potrzebuje czegoś od systemu (otworzyć plik, wysłać pakiet, zarezerwować pamięć), musi grzecznie poprosić jądro przez wywołanie systemowe (syscall).

Jak to działa

Procesor ma kilka poziomów uprawnień (na x86 to słynne „ringi”). Jądro działa w ring 0 i może wszystko, a kod użytkownika w ring 3 — prawie nic poza liczeniem na własnych danych. Ten podział to nie biurokracja dla samej biurokracji: dzięki niemu jeden zbugowany program nie zawiesza całego systemu, a złośliwa aplikacja nie czyta pamięci innych procesów. Każda próba zrobienia czegoś uprzywilejowanego z user space kończy się przekazaniem sterowania do jądra albo wyjątkiem.

W praktyce granicę przekraczasz nieustannie, nawet o tym nie wiedząc. Zapis do pliku to pod spodem syscall write(), otwarcie gniazda sieciowego to socket(), a alokacja pamięci często schodzi do mmap() albo brk(). CPU przełącza się wtedy w tryb jądra, robi swoje i wraca. To przełączanie kontekstu ma swój koszt — dlatego programy wydajnościowe starają się minimalizować liczbę syscalli.

Przykład z praktyki

Chcesz zobaczyć, gdzie program dotyka jądra? Na Linuksie użyj strace:

strace -c ls

Dostaniesz podsumowanie wszystkich wywołań systemowych, jakie ls wykonał, żeby wylistować katalog — openat, read, write, close i spółka, razem z czasem spędzonym w każdym z nich. To świetne narzędzie, gdy aplikacja „mieli” i nie wiesz dlaczego: często okazuje się, że robi tysiące zbędnych syscalli na sekundę.

Częste błędy i mity

„Mam roota, czyli jestem w kernel space.” Nie. Nawet proces roota działa w user space — po prostu jądro pozwala mu na więcej operacji. To wciąż zwykły proces po właściwej stronie granicy.

Segmentation fault to klasyczny objaw tej izolacji w akcji: twój proces próbował sięgnąć do pamięci, do której nie ma prawa, więc jądro go ubiło. To funkcja ochronna, nie tajemnicza klątwa. Pamiętaj też, że sterowniki potrafią działać po obu stronach — w jądrze (szybciej, ale jeden błąd kładzie system) albo w user space (bezpieczniej, np. FUSE dla systemów plików).

Pojęcia powiązane: kernel space, syscall, ring 0 / ring 3, context switch, wirtualna przestrzeń adresowa, proces, FUSE, strace.