Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Před 25 lety zaplavil celý svět virus ILOVEYOU. Virus se šířil e-mailem, jenž nesl přílohu s názvem I Love You. Příjemci, zvědavému, kdo se do něj zamiloval, pak program spuštěný otevřením přílohy načetl z adresáře e-mailové adresy a na ně pak „milostný vzkaz“ poslal dál. Škody vznikaly jak zahlcením e-mailových serverů, tak i druhou činností viru, kterou bylo přemazání souborů uložených v napadeném počítači.
Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube).
Provozovatel čínské sociální sítě TikTok dostal v Evropské unii pokutu 530 milionů eur (13,2 miliardy Kč) za nedostatky při ochraně osobních údajů. Ve svém oznámení to dnes uvedla irská Komise pro ochranu údajů (DPC), která jedná jménem EU. Zároveň TikToku nařídila, že pokud správu dat neuvede do šesti měsíců do souladu s požadavky, musí přestat posílat data o unijních uživatelích do Číny. TikTok uvedl, že se proti rozhodnutí odvolá.
Společnost JetBrains uvolnila Mellum, tj. svůj velký jazykový model (LLM) pro vývojáře, jako open source. Mellum podporuje programovací jazyky Java, Kotlin, Python, Go, PHP, C, C++, C#, JavaScript, TypeScript, CSS, HTML, Rust a Ruby.
Vývojáři Kali Linuxu upozorňují na nový klíč pro podepisování balíčků. K původnímu klíči ztratili přístup.
V březnu loňského roku přestal být Redis svobodný. Společnost Redis Labs jej přelicencovala z licence BSD na nesvobodné licence Redis Source Available License (RSALv2) a Server Side Public License (SSPLv1). Hned o pár dní později vznikly svobodné forky Redisu s názvy Valkey a Redict. Dnes bylo oznámeno, že Redis je opět svobodný. S nejnovější verzí 8 je k dispozici také pod licencí AGPLv3.
Oficiální ceny Raspberry Pi Compute Modulů 4 klesly o 5 dolarů (4 GB varianty), respektive o 10 dolarů (8 GB varianty).
Byla vydána beta verze openSUSE Leap 16. Ve výchozím nastavení s novým instalátorem Agama.
Aktuální vývojové jádro je 2.6.25-rc7, vydané 25. března. Linus řekl: Zkrácený log obsahuje víc detailů, ale v podstatě se scvrkl na nějaké reverty, opravy docbooks, pár různých oprav anotací, větší množství triviálních patchů a zdravou spršku malých oprav. Dobře ho otestujte, protože jsme snad na dobré cestě k vydání skutečného 2.6.25! Zmíněný log lze nalézt v oznámení, detaily najdete v kompletním changelogu.
Aktuální stabilní jádro je 2.6.24.4, vydané 24. března. Toto vydání obsahuje mnoho oprav významných problémů v jádře 2.6.24.
-- Val Helson
-- Jörn Engel
-- Ingo Molnár
Značky v jádře jsou mechanismus, který vývojářům umožňuje do jádra vkládat statické sledovací body [tracepoints]. Jakmile jsou umístěny, operátoři je mohou používat ke sledování známých události v běžících systémech, aniž by potřebovali něco vědět o jaderném kódu. Solaris poskytuje dlouhý seznam statických sledovacích bodů pro použití s Dtrace, ale Linux nemá žádné. Tato situace by se měla časem změnit - statické značky byly do hlavní řady začleněny teprve v 2.6.24. Nicméně jak se vývojáři začínají na značky dívat vážněji, vynořují se některé problémy.
Jeden z nich se objevil jako důsledek tohoto patche, který zaslal Mathieu Desnoyers a který umožňuje binárním modulům obsahovat značky. Fakt, že současná jádra značky v pouze binárních modulech nerozeznávají, je v podstatě náhoda: značky jsou zakázané v modulech, které mají nastavený některý příznak tainted, aby se zabránilo pádům jádra - oops je přece jenom o dost ošklivější značka, než na jakou by lidé chtěli narazit. Matthieu test omezil tak, že značky v proprietárních modulech povoluje s tím, že uvidíme, jak lidi zareagují. Je zbytečné říkat, že zareagovali.
Člověk by se mohl divit, proč by vývojáři jádra, kteří všeobecně nejsou příliš známí svými sympatiemi k proprietárním jaderným modulům, chtěli povolit těmto modulům obsahovat statické sledovací body. Hlavním argumentem je zde fakt, že tyto značky umožňují proprietárním modulům exportovat o něco víc interních informací jádru a jeho uživatelům. Je to viděno jako (velmi) malé otevření se na straně autora modulu. Mathieu řekl:
Myšlenka je taková, že umístěním těchto sledovacích bodů mohou autoři modulů pomoci ostatním dozvědět se, co se uvnitř modulu děje, a pomoci lidem vysledovat problémy. Výsledkem by mělo být stabilnější jádro, což je - bez ohledu na to, jestli byly nahrány proprietární moduly - obecně považováno za dobrou věc.
Na druhou stranu netrpíme nedostatkem vývojářů, kteří se staví proti jakémukoliv nabízení pomocné ruky autorům binárních modulů. Říká se, že dávat těmto modulům přístup k útrobám jádra, vede jenom k problémům. Ingo Molnár to řekl takhle:
Ingo má také obavy, že když se binárním modulům umožní používat značky, bude v budoucnu mnohem obtížnější změnit jejich API. Vzhledem k tomu, že API značek je poměrně mladé, je velká pravděpodobnost, že k nějakým změnám dojde. A přestože vývojáři jádra tvrdí, že o pouze binární moduly se nestarají, je fakt, že existují dobré důvody pro to, aby se vyhnuli dělání věcí, kvůli kterým by přestaly fungovat. Komunita testerů se vždycky zmenší, když testeři nemohou nahrát moduly, které potřebují k rozběhnutí svých systémů takovým způsobem, na jaký byli zvyklí. Takže je možné, že povolit proprietárním modulům používat značky by znamenalo obtížnější opravy API v budoucích vydáních jádra.
Reptání bylo dostatečně hlasité na to, že Matthieuho patch pravděpodobně nebude začleněn do 2.6.25. Nápad jako takový se pravděpodobně objeví znovu, nicméně asi ne tak brzy: značky byly začleněny v 2.6.24, ale zdá se, že 2.6.25 bude vydáno, aniž by se v něm nějaká značka objevila. Není tak úplně jisté, že autoři binárních modulů budou tlačit na přidání sledovacích bodů, když to nedělá nikdo z ostatních vývojářů. Do doby, než někdo statické značky začne používat, debaty o tom, kde se smí použít, budou spíše akademické povahy.
Když jádro spustí program, musí načíst jeho kód z disku, což normálně dělá tak, že požaduje jeho stránkování, což vyžaduje cesta vykonání [execution path]. Kdyby jádro mohlo nějakým způsobem vědět, které stránky budou potřeba, mohlo by je stránkovat efektivněji. Andi Kleen zaslal experimentální sadu patchů, které dělají přesně tohle.
Programy neví o svém rozložení na disku nic a cesta vykonávání skrz kód není nijak optimalizována, aby se omezilo vyhledávání [seek], nicméně s některými informacemi o tom, které stránky budou potřeba, může jádro optimalizovat přístup k disku. Pokud by se nějak podařilo získat seznam stránek, které při vykonávání programu selhaly, tato informace by se dala uložit pro příští běh. Potom by se dala změnit v bitovou mapu, která by označovala, které stránky se mají přednačíst.
Jakmile takovou bitovou mapu máme, objeví se problém, kam ji uložit. Andiho metoda spočívá v tom, že ELF formát na disku se "hackne" a bitmapa se uloží na konec spustitelného souboru. To má několik nevýhod: nutnost seeku, aby se informace načetly, modifikace spustitelného souboru pokaždé, když se trénuje, a v celém systému takto může existovat pro jeden soubor jenom jeden vzor. Na druhou stranu to má i velmi příjemnou vlastnost, že bitová mapa a spustitelný soubor jsou synchronizovány; když se program změní například kvůli upgradu, bitová mapa je vymazána. Alternativní místa pro ukládání bitových map - například někde v uživatelově domovském adresáři - tuto vlastnost nezachovávají.
Andrew Morton se ptal, jestli je vůbec nutné dělat to v jádře:
Ulrich Drepper nechtěl, aby byl ELF formát takto zneužíván. Andi také ne, ale použil to jako prozatímní jednoduché řešení. Ulrich si myslí, že linker by bylo potřeba naučit generovat nový typ hlavičky, která by bitmapu ukládala. Ta by byla skoro na začátku ELF souboru, čímž by se eliminovalo vyhledávání. Problém tohoto přístupu je, že staré binárky by nemohly tuto techniku využit; bylo by potřeba nové slinkování.
Pak nastává otázka, jak se bitmapa inicializuje. Ulrich navrhl použít systemtap:
Andiho patch prochází tabulky stránek pro proces, když se ukončuje, a nastavuje bit v mapě, pokud daná stránka selhala. Ulrich to vidí jako neoptimální:
Problém je v nalezení rovnováhy mezi jednoduchým přednačtením celého souboru - což může být velké plýtvání - a přednačítáním podmnožiny stránek, které se používají nejčastěji. Pro rozhodnutí je potřeba nějakou heuristiku. Jak Ulrich zdůraznil, zaznamenávání celé doby běhu programu vyústí v to, že budou označeny všechny stránky v programu (pokud nemáte v binárce spoustu mrtvého kódu a ten je všechen nahromaděný na jednom místě).
Místo, kde Ulrich vidí potřebu pro podporu ze strany jádra, je poskytnutí bitmapového rozhraní madvise(), aby se všechny díry ve stránkách, které se přednačtou, nevyplnily mechanismem dopředného čtení [readahead]. Současné rozhraní by vyžadovalo volání madvise() pro každou spojitou oblast, což by mohlo vést ke značnému počtu těchto volání. On i Andrew straní tomu, aby se většina práce odehrávala v uživatelském prostoru.
Celkově je potřeba udělat spoustu práce předtím, než se "prediktivní bitové mapy" dostanou do Linuxu - pokud se tam vůbec dostanou. Pro začátek je potřeba udělat nějaké benchmarky, které by ukázaly, že se výkonnost zlepší dostatečně na to, aby stálo za to takovou změnu udělat. David Miller se o tomto přístupu vyjádřil pesimisticky:
Takový patch jsem napsal už dávno.
Upřímně - podle mých zkušeností tenkrát a toho, co vím teď, si myslím, že je ztráta času se o to snažit.
I tak jde o zajímavý nápad, takový, který pravděpodobně vyraší znovu, jestliže tato konkrétní inkarnace nikam nedojde. Na druhou stranu, jelikož největší zisk efektivity pochází z omezení vyhledávání na disku, z dlouhodobého hlediska to tak zajímavé není. Jak řekl Andrew, solid-state disky připraví spoustu kódu o práci.
API by se mělo zdržet slibování něčeho, co nemůže splnit. Nedávná epizoda jaderného makra in_atomic() demonstruje, jak se věci mohou pokazit, když funkce nedělá to, co se zdá, že dělá. Je to také dobrý důvod podívat se na nedostatečně zdokumentovaný (ale důležitý) aspekt designu kódu jádra.
Jaderný kód obecně běží v jednom ze dvou základních kontextů. Kontext procesu vládne, když jádro běží kvůli (obvykle) procesu v uživatelském prostoru; kód, který implementuje systémová volání, je jeden příklad. Když jádro běží v kontextu procesu, je mu povoleno uspat se, pokud je to potřeba. Nicméně pokud jádro běží v atomickém kontextu, věci jako spaní nejsou povoleny. Kód, který obsluhuje hardwarová a softwarová přerušení, je jeden zjevný příklad atomického kontextu.
Je zde však něco navíc - jakmile nějaká jaderná funkce získá spinlock, přesouvá se do atomického kontextu. Vzhledem k tomu, jak jsou spinlocky implementovány, by bylo uspání v době držení spinlocku fatální chyba; pokud by se jiná jaderná funkce pokusila získat stejný zámek, systém by téměř jistě skončil v deadlocku.
"Deadlock navždy" se v seznamu přání uživatelů moc často nevyskytuje, takže se vývojáři jádra snaží této situaci vyhnout, což zahrnuje (1) žádný přístup do uživatelského prostoru a, což je důležitější, (2) žádné spaní. Problémy mohou vzniknout tam, kde konkrétní jaderná funkce neví, ve kterém kontextu může být vyvolána. Klasický příklad je kmalloc() a spol., které přijímají výslovný argument (GFP_KERNEL nebo GFP_ATOMIC) specifikující, jestli se může nebo nemůže spát.
Přání napsat kód, který by fungoval optimálně v obou kontextech, je přesto běžné. Někteří vývojáři ve snaze napsat takový kód mohou snadno zakopnout o následující definice z <linux/hardirq.h>:
/* * Are we doing bottom half or hardware interrupt processing? * Are we in a softirq context? Interrupt context? */ #define in_irq() (hardirq_count()) #define in_softirq() (softirq_count()) #define in_interrupt() (irq_count()) #define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != 0)
Zdálo by se, že in_atomic() by se přesně hodilo každému vývojáři, který se snaží zjistit, jestli se daný kousek kódu potřebuje v daný čas chovat atomickým způsobem. Rychlý grep zdrojových kódu jádra ukazuje, že in_atomic() byl přesně k tomuto účelu na několika místech jádra použit. Problém je jenom jeden: tato použití jsou téměř určitě naprosto špatná.
Makro in_atomic() funguje tak, že zjistí, jestli je zakázaná preempce, což se zdá jako správná věc. Obsluhy událostí stejně jako hardwarová přerušení zakáží preempci, ale to udělá i získání spinlocku. Takže se zdá, že tento test zachytí všechny případy, kdy by uspání bylo špatný nápad. Značné množství lidí, kteří se na toto makro podívali, zcela jistě dospělo k tomuto závěru.
Jenže pokud preempce vůbec nebyla v jádře zapnuta, jádro nezvyšuje "počet preempcí" [preemption count], když je získán spinlock. Takže v takové situaci (která je běžná - mnoho distributorů stále preempci ve svých jádrech nezapnulo) nemá in_atomic() žádnou možnost zjistit, jestli volající kód drží nějaký spinlock, nebo ne. Proto vrátí nulu (indikuje kontext procesu), i když jsou drženy spinlocky. To může vést jaderný kód k tomu, aby si myslel, že běží v kontextu procesu (a choval se podle toho), i když to tak není.
Vzhledem k tomuto problému by se dalo pozastavit nad tím, proč tato funkce vůbec existuje, proč ji lidé používají a proč se vývojáři vůbec snaží řešit to, jestli mohou spát nebo ne. Andrew Morton zodpověděl první otázku poněkud zamlžujícím způsobem:
Jinýmy slovy in_atomic() funguje ve specifické nízkoúrovňové situaci, ale nikdy nebyla určena k použití v širším kontextu. Její umístění v hardirq.h těsně vedle maker, která mohou být použita kdekoliv jinde, bylo tedy téměř určitě chybou. A jak podotkl Alan Stern, fakt, že Linux Device Drivers doporučuje použití in_atomic(), situaci vůbec nevylepšil. Jonathan Corbet, autor tohoto článku, doporučuje, aby autoři této knihy okamžitě dostali padáka.
Jakmile budou tyto chyby odstraněny, stále zbude otázka, jak má jaderný kód poznat, jestli běží v atomickém kontextu, nebo ne. Skutečná odpověď je, že prostě nemůže. Opět citujeme Andrewa Mortona:
Tento vzor je v jádře konzistentní - příklad s GFP_ příznaky to v tomto ohledu jasně ukazuje. Nicméně je také zjevné, že tento způsob nebyl zdokumentován tak, aby vývojáři jádra věděli, že se věci mají dělat takto. Zvažme například tento nedávný příspěvek od Rustyho Russella, který těmto záležitostem rozumí více než jiní:
Ve skutečnosti kmalloc() nemůže sám zjistit, jestli je spaní dovoleno nebo ne. Musí mu to být řečeno volajícím. Změna tohoto pravidla je nepravděpodobná, takže očekávejme sérii patchů odstraňujících in_atomic() počínaje jádrem 2.6.26. Jakmile tato práce bude hotova, makro in_atomic() může být přesunuto na bezpečnější místo, kde nebude způsobovat další zmatek.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Řekl bych, že jsem měla radši, když na mě lidi prostě prázdně koukali poté, co jsem jim řekla, co dělám.Trochu rozdílné rody Jinak díky za každý další díl ;)
Trochu rozdílné rodyOops, to první sloveso mi proklouzlo.
> ...fakt, že Linux Device Drivers doporučuje použití in_atomic(), > situaci vůbec nevylepšil. Jonathan Corbet, autor tohoto > článku, doporučuje, aby autoři této knihy okamžitě dostali padáka.Linux Device Drivers Authors: Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman :)