GNU/Linux >> Znalost Linux >  >> Linux

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

Začal jsem o tomto problému přemýšlet v kontextu etikety na Linux Kernel Mailing listu. Linuxové jádro se jako světově nejznámější a pravděpodobně nejúspěšnější a nejdůležitější projekt svobodného softwaru dostává hodně do tisku. A zakladatel a vedoucí projektu Linus Torvalds zde zjevně netřeba představovat.

Linus občas přitahuje kontroverze svými plameny na LKML. Tyto plameny mají často, jak sám přiznává, co do činění s narušením uživatelského prostoru. Což mě přivádí k mé otázce.

Mohu mít nějaký historický pohled na to, proč je rozbití uživatelského prostoru tak špatné? Pokud tomu dobře rozumím, prolomení uživatelského prostoru by vyžadovalo opravy na úrovni aplikace, ale je to tak špatná věc, když to zlepšuje kód jádra?

Pokud tomu rozumím, Linusova deklarovaná zásada je taková, že nenarušení uživatelského prostoru má přednost před vším ostatním, včetně kvality kódu. Proč je to tak důležité a jaké jsou výhody a nevýhody takové politiky?

(Taková politika, důsledně uplatňovaná, má zjevně své nevýhody, protože Linus má občas „neshody“ se svými nejvyššími poručíky na LKML přesně v tomto tématu. Pokud mohu soudit, vždy si v této věci přijde na své.)

Přijatá odpověď:

Důvod není historický, ale praktický. Existuje mnoho mnoho mnoho programů, které běží nad linuxovým jádrem; pokud rozhraní jádra tyto programy rozbije, pak by každý musel tyto programy upgradovat.

Nyní je pravda, že většina programů ve skutečnosti nezávisí přímo na rozhraních jádra (systémová volání), ale pouze na rozhraních standardní knihovny C (obaly C kolem systémových volání). Oh, ale která standardní knihovna? Glibc? uClibC? Dietlibc? Bionický? Musl? atd.

Existuje však také mnoho programů, které implementují služby specifické pro OS a závisí na rozhraních jádra, která nejsou vystavena standardní knihovnou. (V Linuxu je mnoho z nich nabízeno prostřednictvím /proc a /sys .)

A pak jsou tu staticky kompilované binární soubory. Pokud upgrade jádra jeden z nich poruší, jediným řešením by bylo překompilovat je. Pokud máte zdroj:Linux také podporuje proprietární software.

I když je zdroj dostupný, shromažďování všeho může být utrpení. Zvláště když upgradujete své jádro, abyste opravili chybu s hardwarem. Lidé často upgradují své jádro nezávisle na zbytku systému, protože potřebují hardwarovou podporu. Slovy Linuse Torvaldse:

Rozbití uživatelských programů prostě není přijatelné. (…) Víme, že lidé používají staré binární soubory roky a roky a že vytvoření nového vydání neznamená, že to můžete jen tak zahodit. Můžete nám věřit.

Vysvětluje také, že jedním důvodem, proč z toho udělat silné pravidlo, je vyhnout se peklu závislostí, kde byste nejen museli upgradovat jiný program, aby fungovalo nějaké novější jádro, ale také musíte upgradovat další program a další a další. , protože vše závisí na určité verzi všeho.

Je to trochu ok mít dobře definovanou jednosměrnou závislost. Je to smutné, ale někdy nevyhnutelné. (…) Co NENÍ v pořádku, je mít obousměrnou závislost. Pokud kód HAL v uživatelském prostoru závisí na novém jádře, je to v pořádku, i když mám podezření, že uživatelé doufají, že to nebude „jádro týdne“, ale spíše záležitost „jádra posledních několika měsíců“.

Ale pokud máte oboustrannou závislost, jste v háji. To znamená, že musíte upgradovat v lock-step, a to prostě NENÍ PŘIJATELNÉ. Je to hrozné pro uživatele, ale co je ještě důležitější, je to hrozné pro vývojáře, protože to znamená, že nemůžete říct „vyskytla se chyba“ a dělat věci, jako je snažit se to zúžit pomocí půlení nebo podobně.

V uživatelském prostoru jsou tyto vzájemné závislosti obvykle vyřešeny udržováním různých verzí knihoven; ale můžete spustit pouze jedno jádro, takže musí podporovat vše, co by s ním lidé mohli chtít dělat.

Související:Vysvětlení řazení?

Oficiálně,

zpětná kompatibilita pro [systémová volání prohlášena za stabilní] bude zaručena po dobu nejméně 2 let.

V praxi však

Očekává se, že většina rozhraní (jako jsou systémová volání) se nikdy nezmění a budou vždy dostupná.

Co se mění častěji, jsou rozhraní, která jsou určena pouze pro použití programy souvisejícími s hardwarem, v /sys . (/proc , na druhé straně, který od zavedení /sys byl vyhrazen pro služby, které nesouvisejí s hardwarem, a v podstatě se nikdy nerozbije nekompatibilním způsobem.)

Stručně řečeno,

rozbití uživatelského prostoru by vyžadovalo opravy na aplikační úrovni

a to je špatné, protože existuje pouze jedno jádro, které lidé chtějí upgradovat nezávisle na zbytku svého systému, ale existuje mnoho aplikací se složitými vzájemnými závislostmi. Je snazší udržet jádro stabilní než udržovat tisíce aplikací aktuální na milionech různých nastavení.


Linux
  1. Linux – Proč nemůže jádro spustit inicializaci?

  2. Linux – Jsou různá jádra Linux/unix zaměnitelná?

  3. Adresový prostor 32bitového procesu v 64bitovém linuxu

  1. Jak přistupovat (pokud je to možné) k prostoru jádra z uživatelského prostoru?

  2. Jak mmapovat vyrovnávací paměť linuxového jádra do uživatelského prostoru?

  3. Proč neexistuje rozhraní DirectX API pro Linux?

  1. V linuxovém jádře 2.6.26 jsem našel #define atomic_read(v) ((v)->counter + 0), proč +0?

  2. Proč je v Linuxu potřeba upravovat tabulky systémových volání?

  3. Proč je Linux podobný Unixu, když je jeho jádro monolitické?