Ստանդարտ C գրադարանի Cosmopolitan 2.0 թողարկում, որը մշակվել է շարժական գործարկվող ֆայլերի համար

Հրապարակվել է Cosmopolitan 2.0 նախագծի թողարկումը, որը զարգացնում է ստանդարտ C գրադարանը և ունիվերսալ գործարկվող ֆայլի ձևաչափը, որը կարող է օգտագործվել տարբեր օպերացիոն համակարգերի համար ծրագրեր բաշխելու համար՝ առանց թարգմանիչների և վիրտուալ մեքենաների: GCC-ում և Clang-ում կոմպիլյացիայի արդյունքում ստացված արդյունքը կազմվում է ստատիկորեն կապված ունիվերսալ գործարկվող ֆայլի մեջ, որը կարող է գործարկվել Linux-ի ցանկացած բաշխման վրա՝ macOS, Windows, FreeBSD, OpenBSD, NetBSD և նույնիսկ կանչվել BIOS-ից: Ծրագրի կոդը բաշխվում է ISC լիցենզիայի ներքո (MIT/BSD-ի պարզեցված տարբերակ):

Ունիվերսալ գործարկվող ֆայլերի ստեղծման կոնտեյները հիմնված է տարբեր օպերացիոն համակարգերին (PE, ELF, MACHO, OPENBSD) հատուկ հատվածների և վերնագրերի միավորման վրա մեկ ֆայլում՝ միավորելով Unix-ում, Windows-ում և macOS-ում օգտագործվող մի քանի տարբեր ձևաչափեր: Ապահովելու համար, որ մեկ գործարկվող ֆայլը աշխատում է Windows և Unix համակարգերում, հնարք է Windows PE ֆայլերը կոդավորել որպես shell scripts՝ օգտվելով այն փաստից, որ Thompson Shell-ը չի օգտագործում «#!» սկրիպտի նշիչը: Ծրագրեր ստեղծելու համար, որոնք ներառում են մի քանի ֆայլ (բոլոր ռեսուրսները կապելով մեկ ֆայլի մեջ), այն աջակցում է գործարկվող ֆայլի ձևավորմանը՝ հատուկ մշակված ZIP արխիվի տեսքով: Առաջարկվող ձևաչափի սխեման (օրինակ hello.com հավելված).

MZqFpD='BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" ելք 1 REAL MODE… ELF SEGMENTS… OPENBSD NOTE… MACHO HEADERS… CODE AND DATA… ZIP տեղեկատու…

Ֆայլի սկզբում նշվում է «MZqFpD» պիտակը, որն ընկալվում է որպես Windows PE ձևաչափի վերնագիր: Այս հաջորդականությունը վերծանված է նաև «pop %r10; jno 0x4a; jo 0x4a», իսկ «\177ELF» տողը «jg 0x47» հրահանգին, որոնք օգտագործվում են մուտքի կետ փոխանցելու համար: Unix համակարգերը գործարկում են shell կոդը, որն օգտագործում է exec հրամանը՝ գործարկվող կոդը փոխանցելով անանուն խողովակի միջով: Առաջարկվող մեթոդի սահմանափակումը Unix-ի նման օպերացիոն համակարգերով աշխատելու հնարավորությունն է միայն այն թելերով, որոնք աջակցում են Thompson Shell-ի համատեղելիության ռեժիմին:

Qemu-x86_64 զանգը ապահովում է լրացուցիչ շարժունակություն և թույլ է տալիս x86_64 ճարտարապետության համար կազմված կոդը գործարկել ոչ x86 հարթակներում, ինչպիսիք են Raspberry Pi-ի տախտակները և ARM պրոցեսորներով հագեցած Apple սարքերը: Նախագիծը կարող է օգտագործվել նաև ինքնուրույն հավելվածներ ստեղծելու համար, որոնք աշխատում են առանց օպերացիոն համակարգի (մերկ մետաղ): Նման հավելվածներում գործարկվող ֆայլին կցվում է bootloader, և ծրագիրը գործում է որպես bootable օպերացիոն համակարգ։

Նախագծի կողմից մշակված ստանդարտ C գրադարանի libc-ն առաջարկում է 2024 գործառույթ (առաջին թողարկումում կար մոտ 1400 գործառույթ): Կատարման առումով Cosmopolitan-ը աշխատում է նույնքան արագ, որքան glibc-ը և նկատելիորեն առաջ է անցնում Musl-ից և Newlib-ից, չնայած այն հանգամանքին, որ Cosmopolitan-ը կոդի չափով մի կարգով փոքր է, քան glibc-ը և մոտավորապես համապատասխանում է Musl-ին և Newlib-ին: Հաճախակի կոչվող գործառույթները, ինչպիսիք են memcpy-ը և strlen-ը, օպտիմիզացնելու համար լրացուցիչ օգտագործվում է «trickle-down performance» տեխնիկան, որի դեպքում ֆունկցիան կանչելու համար օգտագործվում է մակրո կապ, որի դեպքում կոմպիլյատորը տեղեկացվում է CPU ռեգիստրների մասին, որոնք ներգրավված են կոդի կատարման մեջ: գործընթաց, որը թույլ է տալիս խնայել ռեսուրսները պրոցեսորի վիճակը խնայելիս՝ պահպանելով միայն փոփոխվող ռեգիստրները:

Նոր թողարկման փոփոխություններից.

  • Փոփոխվել է zip ֆայլի ներսում ներքին ռեսուրսներ մուտք գործելու սխեման (ֆայլեր բացելիս այժմ օգտագործվում են սովորական /zip/... ուղիները՝ zip:.. նախածանցի փոխարեն): Նմանապես, Windows-ում սկավառակներ մուտք գործելու համար հնարավոր է օգտագործել այնպիսի ուղիներ, ինչպիսիք են «/c/...»՝ «C:/...»-ի փոխարեն:
  • Առաջարկվել է նոր APE (Actually Portable Executable) բեռնիչ, որը սահմանում է ունիվերսալ գործարկվող ֆայլերի ձևաչափը։ Նոր բեռնիչը օգտագործում է mmap ծրագիրը հիշողության մեջ տեղադրելու համար և այլևս չի փոխում բովանդակությունը թռիչքի ժամանակ: Անհրաժեշտության դեպքում, ունիվերսալ գործարկվող ֆայլը կարող է վերածվել սովորական գործարկվող ֆայլերի՝ կապված առանձին հարթակների հետ:
  • Linux հարթակում հնարավոր է օգտագործել binfmt_misc միջուկի մոդուլը՝ APE ծրագրերը գործարկելու համար։ Նշվում է, որ binfmt_misc-ի օգտագործումն ամենաարագ գործարկման մեթոդն է:
  • Linux-ի համար առաջարկվել է OpenBSD նախագծի կողմից մշակված pledge() և unveil() համակարգի կանչերի ֆունկցիոնալության իրականացում: Այս զանգերը C, C++, Python և Redbean ծրագրերում օգտագործելու համար տրամադրվում է API, ինչպես նաև կամայական գործընթացները մեկուսացնելու pledge.com կոմունալ ծրագիր:
  • Կառուցվածքն օգտագործում է Landlock Make օգտակար ծրագիրը՝ GNU Make-ի մի տարբերակ՝ կախվածության ավելի խիստ ստուգմամբ և Landlock համակարգի զանգի կիրառմամբ՝ ծրագիրը մնացած համակարգից մեկուսացնելու և քեշավորման արդյունավետությունը բարելավելու համար: Որպես տարբերակ, պահպանվում է սովորական GNU Make-ով կառուցելու հնարավորությունը:
  • Իրականացվել են բազմաթելային ֆունկցիաներ՝ _spawn() և _join(), որոնք ունիվերսալ կապեր են տարբեր օպերացիոն համակարգերին հատուկ API-ների վրա: Աշխատանքներ են տարվում նաև POSIX Threads-ի աջակցության իրականացման ուղղությամբ:
  • Հնարավոր է օգտագործել _Thread_local հիմնաբառը՝ յուրաքանչյուր շղթայի համար առանձին պահեստ օգտագործելու համար (TLS, Thread-Local Storage): Լռելյայնորեն, C-ի գործարկման ժամանակը սկզբնավորում է TLS-ը հիմնական շղթայի համար, ինչը հանգեցրել է գործարկվող նվազագույն չափի 12-ից 16 ԿԲ-ի:
  • «--ftrace» և «--strace» պարամետրերի աջակցությունն ավելացվել է գործարկվող ֆայլերին՝ բոլոր գործառույթների կանչերի և stderr-ին համակարգային կանչերի մասին տեղեկատվություն ստանալու համար:
  • Ավելացվել է աջակցություն closefrom() համակարգային զանգին, որն աջակցվում է Linux 5.9+, FreeBSD 8+ և OpenBSD-ում:
  • Linux հարթակում clock_gettime և gettimeofday զանգերի կատարումը մեծացել է մինչև 10 անգամ՝ օգտագործելով vDSO (վիրտուալ դինամիկ համօգտագործվող օբյեկտ) մեխանիզմը, որը հնարավորություն է տալիս համակարգի զանգերի մշակիչը տեղափոխել օգտվողի տարածք և խուսափել համատեքստի անջատիչներից:
  • Մուսլի գրադարանից տեղափոխվել են կոմպլեքս թվերի հետ աշխատելու մաթեմատիկական ֆունկցիաները։ Շատ մաթեմատիկական ֆունկցիաների աշխատանքը արագացվել է։
  • Nointernet() ֆունկցիան առաջարկվել է անջատել ցանցի հնարավորությունները:
  • Ավելացվեցին նոր գործառույթներ՝ տողերի արդյունավետ կցման համար՝ appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf և vappendf:
  • Ավելացվեց kprintf() ֆունկցիաների ընտանիքի պաշտպանված տարբերակը, որը նախատեսված է բարձր արտոնություններով աշխատելու համար:
  • Զգալիորեն բարելավվել է SSL, SHA, curve25519 և RSA իրականացումները:

Source: opennet.ru

Добавить комментарий