Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
V Tiraně proběhl letošní Linux App Summit (LAS) (Mastodon). Zatím nesestříhané videozáznamy přednášek jsou k dispozici na YouTube.
Začleňovací okno 3.18 je otevřené, takže není žádné aktuální vývojové jádro. Do hlavního stromu si našla cestu spousta změn; podrobnosti najdete v samostatném článku níže.
Stabilní aktualizace: verze 3.16.5 (oznámení), 3.14.21 (oznámení) a 3.10.57 (oznámení) byly vydány dne 9. října, následované dne 15. října verzemi 3.17.1 (oznámení), 3.16.6 (oznámení), 3.14.22 (oznámení) a 3.10.58 (oznámení).
Až příště lidi ze sítí řeknou, že jim úložiště kradou nápady, jen budu tiše sedět a ukážu na xmit_more.
– Jens Axboe (odkaz)
Když půjde všechno dobře, nikdy nebudeme vyžadovat přidání skutečného zdrojového kódu C pro podporu platformy arm64, pokud bude tato architektura jasně definovaná a pokud z ní bude přesunuta spousta věcí vázaných na platformu do ovladačů pro architekturu arm32.
– Arnda Bergmann, věčný optimista (odkaz)
Pokud má recenzent nějaké otázky, musíme je brát jako závadu v opravě. Oprava není dokončena, dokud se nedá přečíst bez nutnosti doplňujících dotazů.
– Andrew Morton (odkaz)
V době psaní tohoto textu vybral Linus 8 722 sad změn bez začlenění do hlavního repozitáře pro začleňovací okno 3.18. V tomto okamžiku by se dalo rozumně usuzovat, že se začleňovací okno blíží dokončení, i když Linus původně mluvil o tom, že ho nechá otevřené do 26. října. Váš editor by si troufl odhadovat, že se toto začleňovací okno zavře spíše o něco dříve.
Od souhrnu z minulého týdne bylo začleněno ještě 5 786 změn. Mezi zajímavější změny viditelné uživatelem patří:
Mezi změny viditelné pro vývojáře jádra patří:
Jak je vidět, slučovací okno verze 3.18 v podstatě sotva začalo. Lze očekávat, že tempo v blízké budoucnosti naroste, jakmile Linus dokončí své cesty a dorazí do Düsseldorfu na LinuxCon, CloudOpen, ELCE, KVM Fórum, LPC atd.
„Virtuální dynamický sdílený objekt“ (vDSO) je malá sdílená knihovna exportovaná jádrem k akceleraci provádění některých systémových volání, která nutně nemusí být spuštěna v prostoru jádra. Zatímco vývojáři jádra se shodli na exportu malé sady funkcí prostřednictvím vDSO, vývojářům nic brání přidávat své vlastní. Pokud aplikace potřebuje často a rychle získat nějaké informace z jádra, může být užitečným řešení funkce vDSO. Úvod do vDSO viz stránka nápovědy vDSO(7).
Tento článek ukazuje, jak je programovací technika používaná k implementaci těchto funkcí založena především na chytrých dodatcích k skriptu linker Linuxu a jak lze stejný postup použít k implementaci funkcí, které rychle vypočítávají hodnoty založené na proměnných jádra. Můžeme ji brát jako jakýsi doplněk k této sérii na pravidelných systémových voláních. V knihovně vDSO jsou zahrnuty různé sady funkcí v závislosti na hardwarové platformě. Implementace popsaná zde odkazuje na architekturu x86_64.
Když proces vyvolá systémové volání, spustí zvláštní instrukce nutící procesor k přepnutí do režimu jádra, uloží obsah registrů do zásobníku režimu jádra a spustí provádění funkce jádra. Když je systémové volání obslouženo, jádro obnoví obsah registrů uložených v zásobníku režimu jádra a pomocí dalších zvláštních instrukcí pokračuje v provádění procesu uživatelského prostoru.
Uvedení systémových volání přistupujících k informacím prostoru jádra do adresního prostoru procesu by je urychlilo, protože by mohly načíst požadovanou hodnotu z adresního prostoru jádra bez těch přepnutí kontextu. Pro tento typ emulace se samozřejmě hodí jen systémová volání pouze pro čtení, protože procesy v uživatelském prostoru nemají povolen zápis do adresního prostoru jádra. Funkce uživatelského prostoru, které emulují systémová volání, se nazývají virtuální systémová volání.
Implementace vDSO v Linux na x86_64 nabízí čtyři z těchto virtuálních systémových volání: __vdso_clock_gettime(), __vdso_gettimeofday(), __vdso_time() a __vdso_getcpu(). Odpovídají standardním systémovým voláním clock_gettime(), gettimeofday(), time() a getcpu().
O kolik rychlejší je virtuální systémové volání než standardní? To samozřejmě záleží na hardwarové platformě a na typu procesoru. Na desce P6T SE ASUS s procesorem Intel 2,8 GHz Core i7, je průměrný čas nutný k provedení standardního systémového volání gettimeofday() je 90,5 mikrosekund, průměrný čas na odpovídající virtuální systémové volání je 22,3 mikrosekund; tedy výrazné zlepšení, které odůvodňuje úsilí vynaložené při vypracování aplikačního rámce vDSO.
Uvažujete-li o vDSO, měli byste mít na paměti, že tento výraz má dva různé významy: (1) jedná se o dynamickou knihovnu, ale tento výraz také slouží k označení (2) oblasti paměti patřící do adresního prostoru každého procesu v uživatelském režimu. Oblast paměti vDSO – jako většina ostatních oblastí paměti procesu – má svou polohu standardně náhodně vybranou pokaždé, když je namapován. Randomizace rozložení adresního prostoru je forma obrany proti bezpečnostním dírám.
Pokud pomocí příkazu „cat /proc/pid/maps“ zobrazíte oblasti paměti vlastněné procesem s ID procesu rovnajícím se pid, vypíše se něco jako:
7ffffb892000-7ffffb893000 r-xp 00000000 00:00 0 [vdso]
což popisuje atributy této zvláštní oblasti. Počáteční adresa vDSO, 0x7ffffb892000, je menší než PAGE_OFFSET, (což je 0xffff880000000000 na počítačích s architekturou x86-64), tím, že je vDSO součástí uživatelského adresního prostoru. Finální adresa, tedy 0x7ffffb893000, ukazuje, že vDSO zabírá jednu 4kB stránku. Příznak oprávnění r-xp určuje, že jsou povolena oprávnění pro čtení a spuštění a že oblast je soukromá (nesdílená). Poslední tři pole označují, že region není mapován ze žádného souboru, a nemá tedy žádný inode.
Binární kód uložený v oblasti paměti vDSO má formát dynamické knihovny. Jestliže vypíšete kód z oblasti paměti vDSO do souboru a použijete na něj příkaz file, získáte:
sdílený objekt ELF 64-bit LSB, x86-64, verze 1 (SYSV), dynamicky propojený, stripovaný
Všechny Linuxové sdílené dynamické knihovny, jako například glibc, používají formát ELF.
Pokud dekompilujete soubor obsahující oblast paměti vDSO, najdete kód sestavení čtyř virtuálních systémových volání zmíněných dříve. V jádru 3.15 je pro uložení hlavičky ELF a kódu virtuálního systémového volání ve vDSO zapotřebí pouze 2 733 z 4 096 bajtů. To znamená, že stále existuje prostor pro další funkce.
Protože vDSO je plně vytvořený obraz ELF, můžete na něm provádět vyhledávání symbolů. To umožňuje přidání nových symbolů s novými verzemi jádra a umožňuje knihovně C zjistit dostupné funkce v době běhu při spuštění v různých verzích jádra. Spustíte-li „readelf –s“ na soubor obsahující oblast paměti vDSO, získáte výpis položek v části tabulky symbolů souboru:
Tabulka symbolů „.dynsym“ obsahuje 11 položek: Num: Hodnota Typ velikosti Vazba Vis Název Ndx 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: ffffffffff700330 0 SECTION LOCAL DEFAULT 7 2: ffffffffff700600 727 FUNC WEAK DEFAULT 13 clock_gettime@@LINUX_2.6 3: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS LINUX_2.6 4: ffffffffff7008e0 365 FUNC GLOBAL DEFAULT 13 __vdso_gettimeofday@@LINUX_2.6 5: ffffffffff700a70 61 FUNC GLOBAL DEFAULT 13 __vdso_getcpu@@LINUX_2.6 6: ffffffffff7008e0 365 FUNC WEAK DEFAULT 13 gettimeofday@@LINUX_2.6 7: ffffffffff700a50 22 FUNC WEAK DEFAULT 13 time@@LINUX_2.6 8: ffffffffff700a70 61 FUNC WEAK DEFAULT 13 getcpu@@LINUX_2.6 9: ffffffffff700600 727 FUNC GLOBAL DEFAULT 13 __vdso_clock_gettime@@LINUX_2.6 10: ffffffffff700a50 22 FUNC GLOBAL DEFAULT 13 __vdso_time@@LINUX_2.6
Zde si můžete prohlédnout různé funkce v oblasti vDSO.
Dosud jsme se nezmiňovali o tom, jak virtuální systémové volání načte proměnné z adresního prostoru jádra. Je to nejspíš nejzajímavější a nejméně zdokumentovaná funkce subsystému vDSO. Vezměme si pro příklad virtuální systémové volání __vdso_gettimeofday(). Tato funkce načte data jádra, která potřebuje, z proměnné s názvem vsyscall_gtod_data. Tato proměnná má dvě různé adresy:
Obě adresy samozřejmě mapují na stejnou fyzickou adresu, tj. odkazují na stejný rámce stránky.
Proměnné jsou vytvořeny v této stránce makrem DECLARE_VVAR(). Například, deklarace vsyscall_gtod_data je umístí na offset 128 na stránce vvar. Adresa této proměnné viditelná z uživatelského prostoru je tedy: 0xffffffffff5ff000 + 128. Aby linker rozpoznal proměnné existující na stránce vvar, makro DECLARE_VVAR() je umístí do speciální sekce .vvar v binárním obrazu jádra (další informace viz speciální sekce v binárních kódech Linuxu).
Kód spuštěný v rámci jádra používá adresu prostoru jádra pro přístup k vsyscall_gtod_data. Virtuální systémová volání, která běží v uživatelském režimu, musí použít tuto druhou adresu. K proměnným umístěným na stránce vDSO přistupují procesy v uživatelském režimu popisovače segmentu __USER_DS. Lze z nich číst, ale nelze do nich zapisovat. Jako další preventivní opatření je Linux deklaruje jako const tak, aby kompilátor zjistil jakýkoli pokus o zápis do nich.
Hodnoty proměnných vvar jsou nastavené podle hodnot jiných proměnných jádra, která nejsou přístupná kódu uživatelského prostoru. Když jádro upravuje hodnotu jedné z vnitřních proměnných, související proměnné na stránce vvar je třeba aktualizovat. V Linuxu tuto úlohu provádí funkce timekeeping_update(), která je například vyvolána při každé změně hodnoty jiffies, počtu cyklů uplynulých od spuštění systému.
Linuxová implementace vDSO usnadňuje vývojářům jádra přidat nové funkce do stránky vDSO. Pokud se podíváte na kód čtyř virtuálních systémových volání, všimnete si, že tři z nich načítají data z jádra, která potřebují z proměnné vvar s názvem vsyscall_gtod_data typu struct vsyscall_gtod_data. To čtvrté, tedy, __vdso_getcpu(), nic nenačte: získá index procesoru provedením instrukce rdtscp.
Další důležitý bod je, že parametr předaný timekeeping_update(), funkci, která aktualizuje pole z vsyscall_gtod_data, je ukazatel na globální proměnnou jádra s názvem timekeeper typu struct timekeeper. Když funkce jádra aktualizuje pole timekeeper vztahující se k virtuálnímu systémovému volání, lze předpokládat, že v nejbližší době bude mít tato změna vliv na vsyscall_gtod_data, a tedy na hodnoty vrácené voláními virtuálního systému. Jinými slovy, funkce jádra, která aktualizuje pole timekeeper, jsou volně spojena s virtuálním systémovým voláním.
Nejjednodušší způsob, jak definovat novou funkci vDSO, je vytvořit podobné spojení mezi vnitřními proměnnými jádra a proměnnou přidanou do stránky vvar. Funkce update_vsyscall(), jejíž volání můžete očekávat s relativně vysokou frekvencí, může být podle potřeby rozšířena tak, aby přesouvala data do stránky vvar.
Zde je několik tipů, které vám mohou pomoci při vývoji nových funkcí vDSO:
linux/arch/x86/vdso/vdso.lds.S: foo; __vdso_foo;Musíte také přidat následující řádky na konec definice __vdso_foo() v adresáři linux/arch/x86/vdso/:
int foo(struct fd *fd) __attribute__((weak, alias("__vdso_foo")));Tímto způsobem se z foo() stává slabý alias pro __vdso_foo().
gcc -o test_foo linux/arch/x86/vdso/vdso.so test_foo.cprotože kód __vdso_foo() je součástí knihovny vdso.so. Pokud je foo definovaná jako slabý alias pro __vdso_foo, můžete v testovacím programu také volat foo() místo __vdso_foo().
Programovací technika používaná k implementaci funkce vDSO je založena na některých chytrých dodatcích k skriptu linkeru Linuxu, které umožňují funkcím jádra definovaným v linuxovém jádru linkování v adresním prostoru všech procesů uživatelského režimu. Nové funkce vDSO lze snadno implementovat k získání informací o aktuálním stavu jádra (počet procesů v systému, počet volných stránek, apod.). Pokud máte informace, které musíte získávat z jádra s vysokou frekvencí a nízkou režií, může mechanismus vDSO poskytnout ty nástroje, které potřebujete.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej: