Зөөврийн ажиллах боломжтой файлуудад зориулж боловсруулсан Cosmopolitan 2.0 стандарт C номын сангийн хувилбар

Cosmopolitan 2.0 төслийн хувилбар хэвлэгдэн гарсан бөгөөд энэ нь стандарт C номын сан болон орчуулагч болон виртуал машин ашиглахгүйгээр өөр өөр үйлдлийн системд зориулсан програмуудыг түгээхэд ашиглагдах боломжтой бүх нийтийн гүйцэтгэгдэх файлын формат юм. GCC болон Clang-д эмхэтгэснээр олж авсан үр дүнг ямар ч Linux түгээлт, macOS, Windows, FreeBSD, OpenBSD, NetBSD дээр ажиллуулж, тэр ч байтугай BIOS-оос дуудаж болох статик холбоотой бүх нийтийн гүйцэтгэгдэх файл болгон хөрвүүлдэг. Төслийн кодыг ISC лицензийн дагуу түгээдэг (MIT/BSD-ийн хялбаршуулсан хувилбар).

Unix, Windows болон macOS-д хэрэглэгддэг хэд хэдэн өөр өөр форматуудыг нэгтгэж, өөр өөр үйлдлийн системүүд (PE, ELF, MACHO, OPENBSD)-д зориулагдсан сегмент болон толгой хэсгийг нэгтгэх, бүх нийтийн гүйцэтгэх файлуудыг үүсгэх контейнер нь нэг файлд суурилдаг. Windows болон Unix системүүд дээр нэг биелэгдэх боломжтой файлыг ажиллуулахын тулд Томпсон Shell нь "#!" скрипт тэмдэглэгээг ашигладаггүй тул Windows PE файлуудыг бүрхүүлийн скрипт болгон кодлох нь заль мэх юм. Хэд хэдэн файл агуулсан програмуудыг үүсгэхийн тулд (бүх нөөцийг нэг файлд холбох) тусгайлан боловсруулсан 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 ХЭСГҮҮД… OPENBSD ТАЙЛБАР… MACHO ОЛГОЙ… КОД БА ӨГӨГДӨЛ… ZIP ЛАВЛАХ…

Файлын эхэнд "MZqFpD" гэсэн шошгыг зааж өгсөн бөгөөд энэ нь Windows PE форматын толгой хэсэг гэж ойлгогддог. Энэ дарааллыг мөн “pop %r10; jno 0x4a; jo 0x4a", мөн "\177ELF" мөрийг "jg 0x47" зааврын дагуу оруулна. Unix системүүд нь exec командыг ашигладаг бүрхүүлийн кодыг ажиллуулж, гүйцэтгэх кодыг нэргүй хоолойгоор дамжуулдаг. Санал болгож буй аргын хязгаарлалт нь зөвхөн Thompson Shell нийцтэй горимыг дэмждэг бүрхүүлүүдийг ашиглан Unix-тэй төстэй үйлдлийн системүүд дээр ажиллах чадвар юм.

Qemu-x86_64 дуудлага нь нэмэлт зөөвөрлөх боломжийг олгодог бөгөөд x86_64 архитектурт зориулж хөрвүүлсэн кодыг ARM процессороор тоноглогдсон Raspberry Pi хавтан болон Apple төхөөрөмж зэрэг x86 бус платформ дээр ажиллуулах боломжийг олгодог. Төслийг мөн үйлдлийн системгүйгээр (нүцгэн металл) ажилладаг бие даасан програмуудыг бий болгоход ашиглаж болно. Ийм программуудад ачаалагчийг гүйцэтгэх файлд хавсаргасан бөгөөд програм нь ачаалах боломжтой үйлдлийн системийн үүрэг гүйцэтгэдэг.

Төслийн боловсруулсан стандарт C номын сан libc нь 2024 функцийг санал болгодог (эхний хувилбарт 1400 орчим функц байсан). Гүйцэтгэлийн хувьд Cosmopolitan нь glibc шиг хурдан ажилладаг бөгөөд Cosmopolitan нь glibc-ээс бага хэмжээний кодын дараалалтай, ойролцоогоор Мусл болон Ньюлибтэй тохирч байгаа хэдий ч Мусл болон Ньюлибээс илт давуу юм. Memcpy, strlen гэх мэт байнга дуудагддаг функцүүдийг оновчтой болгохын тулд функцийг дуудахдаа макро холбох аргыг ашигладаг бөгөөд хөрвүүлэгчид кодын гүйцэтгэлд оролцдог CPU регистрүүдийн талаар мэдээлдэг "trickle-down performance" техникийг нэмэлтээр ашигладаг. процесс бөгөөд энэ нь зөвхөн өөрчлөгддөг регистрүүдийг хадгалах замаар CPU-ийн төлөвийг хадгалахад нөөцийг хэмнэх боломжийг олгодог.

Шинэ хувилбарт гарсан өөрчлөлтүүдийн дунд:

  • Зип файл доторх дотоод нөөцөд хандах схемийг өөрчилсөн (файлуудыг нээх үед zip:.. угтварыг ашиглахын оронд ердийн /zip/... замыг ашигладаг болсон). Үүнтэй адилаар Windows дээр диск рүү хандахын тулд "C:/..." биш "/c/..." гэх мэт замыг ашиглаж болно.
  • Бүх нийтийн гүйцэтгэгдэх файлуудын форматыг тодорхойлдог шинэ APE (Үнэндээ зөөврийн гүйцэтгэх боломжтой) дуудагчийг санал болгосон. Шинэ ачаалагч нь програмыг санах ойд байрлуулахын тулд mmap ашигладаг бөгөөд агуулгыг шууд өөрчлөхгүй. Шаардлагатай бол бүх нийтийн гүйцэтгэгдэх файлыг бие даасан платформтой холбоотой ердийн гүйцэтгэх файл болгон хөрвүүлж болно.
  • Линукс платформ дээр APE програмуудыг ажиллуулахын тулд binfmt_misc цөмийн модулийг ашиглах боломжтой. Binfmt_misc ашиглах нь хамгийн хурдан эхлүүлэх арга гэдгийг тэмдэглэсэн.
  • Линуксийн хувьд OpenBSD төслөөс боловсруулсан pledge() болон unveil() системийн дуудлагын функцийг хэрэгжүүлэхийг санал болгосон. Эдгээр дуудлагыг C, C++, Python, Redbean хэл дээрх програмуудад ашиглах API, мөн дурын процессуудыг тусгаарлах pledge.com хэрэглүүрийг хангасан.
  • Энэхүү угсралт нь Landlock Make хэрэгслийг ашигладаг - GNU Make-ийн хувилбар бөгөөд илүү хатуу хараат байдлыг шалгадаг бөгөөд Landlock системийн дуудлагыг ашиглан програмыг системийн бусад хэсгээс тусгаарлаж, кэшийн үр ашгийг дээшлүүлдэг. Сонголтын хувьд ердийн GNU Make-ээр бүтээх чадвар хадгалагдана.
  • Multithreading функцууд хэрэгжсэн - _spawn() болон _join() нь өөр өөр үйлдлийн системд зориулагдсан API-ууд дээр бүх нийтийн холболтууд юм. Мөн POSIX Threads дэмжлэгийг хэрэгжүүлэх ажил хийгдэж байна.
  • _Thread_local түлхүүр үгийг ашиглан урсгал бүрт тусдаа хадгалах сан (TLS, Thread-Local Storage) ашиглах боломжтой. Өгөгдмөлөөр, C ажиллах цаг нь үндсэн урсгалд TLS-г эхлүүлдэг бөгөөд энэ нь гүйцэтгэх боломжтой хамгийн бага хэмжээг 12 КБ-аас 16 КБ хүртэл нэмэгдүүлэхэд хүргэсэн.
  • "--ftrace" болон "--strace" параметрүүдийн дэмжлэгийг stderr руу бүх функцын дуудлага болон системийн дуудлагын талаарх мэдээллийг гаргахын тулд гүйцэтгэгдэх файлуудад нэмсэн.
  • Linux 5.9+, FreeBSD 8+ болон OpenBSD дээр дэмжигдсэн closefrom() системийн дуудлагын дэмжлэгийг нэмсэн.
  • Линукс платформ дээр vDSO (виртуал динамик хуваалцсан объект) механизмыг ашиглан clock_gettime болон gettimeofday дуудлагын гүйцэтгэлийг 10 дахин нэмэгдүүлсэн бөгөөд энэ нь системийн дуудлагын зохицуулагчийг хэрэглэгчийн орон зайд шилжүүлж, контекст шилжүүлэгчээс зайлсхийх боломжтой болсон.
  • Комплекс тоотой ажиллах математик функцуудыг Мусл номын сангаас зөөв. Математикийн олон функцүүдийн ажил хурдассан.
  • Сүлжээний чадавхийг идэвхгүй болгохын тулд nointernet() функцийг санал болгосон.
  • Мөрүүдийг үр дүнтэй хавсаргах шинэ функцүүдийг нэмсэн: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf болон vappendf.
  • Өндөр эрх бүхий ажиллахад зориулагдсан kprintf() гэр бүлийн функцүүдийн хамгаалагдсан хувилбарыг нэмсэн.
  • SSL, SHA, curve25519 болон RSA хэрэгжилтийн гүйцэтгэл мэдэгдэхүйц сайжирсан.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх