Powód nie jest historyczny, ale praktyczny. Istnieje wiele, wiele programów, które działają na jądrze Linux; jeśli interfejs jądra zepsuje te programy, wszyscy będą musieli je zaktualizować.
Teraz prawdą jest, że większość programów w rzeczywistości nie zależy bezpośrednio od interfejsów jądra ( wywołania systemowe ), ale tylko od interfejsów standardowej biblioteki C ( otoczki C wokół wywołań systemowych). Och, ale która standardowa biblioteka? Glibc? uClibC? Dietlibc? Bioniczny? Musl? itp.
Istnieje jednak wiele programów, które implementują usługi specyficzne dla systemu operacyjnego i zależą od interfejsów jądra, które nie są ujawniane przez bibliotekę standardową. (W systemie Linux wiele z nich jest oferowanych za pośrednictwem /proc
i /sys
.)
A potem są statycznie skompilowane pliki binarne. Jeśli aktualizacja jądra psuje jedno z nich, jedynym rozwiązaniem byłoby ich ponowne skompilowanie. Jeśli masz źródło: Linux obsługuje również oprogramowanie zastrzeżone.
Nawet gdy źródło jest dostępne, zebranie go może być uciążliwe. Zwłaszcza podczas aktualizacji jądra, aby naprawić błąd w sprzęcie. Ludzie często aktualizują jądro niezależnie od reszty systemu, ponieważ potrzebują wsparcia sprzętowego. W słowach Linusa Torvaldsa :
Łamanie programów użytkownika jest po prostu niedopuszczalne. (…) Wiemy, że ludzie używają starych plików binarnych od wielu lat, a tworzenie nowej wersji nie oznacza, że możesz to po prostu wyrzucić. Możesz nam zaufać.
On wyjaśnia również, że jednym z powodów, aby ta reguła jest silny, aby uniknąć piekło zależności gdzie nie chcesz mieć tylko uaktualnić inny program, aby uzyskać niektóre nowsze jądro do pracy, ale także uaktualnić kolejny program, a kolejna, i kolejna , ponieważ wszystko zależy od określonej wersji wszystkiego.
To nieco ok, aby mieć dobrze określoną zależność jednokierunkową. To smutne, ale czasem nieuniknione. (…) NIE jest w porządku, aby mieć dwukierunkową zależność. Jeśli kod HAL przestrzeni użytkownika zależy od nowego jądra, to dobrze, chociaż podejrzewam, że użytkownicy mieliby nadzieję, że nie będzie to „jądro tygodnia”, a bardziej „jądro z ostatnich kilku miesięcy”.
Ale jeśli masz zależność TWO-WAY, to jesteś zepsuty. Oznacza to, że musisz dokonać aktualizacji krok po kroku, i to po prostu NIE JEST AKCEPTOWALNE. Jest to okropne dla użytkownika, ale co ważniejsze, jest okropne dla programistów, ponieważ oznacza to, że nie można powiedzieć „wystąpił błąd” i robić rzeczy, takie jak próba zawężenia go przez podział na segmenty lub podobne.
W przestrzeni użytkownika te wzajemne zależności są zwykle rozwiązywane przez utrzymywanie różnych wersji bibliotek; ale możesz uruchomić tylko jedno jądro, więc musi obsługiwać wszystko, co ludzie mogą z nim zrobić.
oficjalnie ,
wsteczna kompatybilność dla [wywołań systemowych uznanych za stabilne] będzie gwarantowana przez co najmniej 2 lata.
W praktyce jednak
Oczekuje się, że większość interfejsów (takich jak syscall) nigdy się nie zmieni i zawsze będzie dostępna.
To, co zmienia się częściej, to interfejsy, które mają być używane tylko przez programy związane ze sprzętem, w /sys
. ( /proc
z drugiej strony, która od czasu wprowadzenia /sys
została zarezerwowana dla usług niezwiązanych ze sprzętem, prawie nigdy nie psuje się w sposób niezgodny).
W podsumowaniu,
podział przestrzeni użytkownika wymagałby poprawek na poziomie aplikacji
i to źle, ponieważ istnieje tylko jedno jądro, które ludzie chcą aktualizować niezależnie od reszty swojego systemu, ale istnieje wiele aplikacji o złożonych współzależnościach. Łatwiej jest utrzymać stabilne jądro niż aktualizować tysiące aplikacji w milionach różnych konfiguracji.