Geri qayıt
Prototip icra faylı formatını SQLite verilənlər bazasına çevirir
SiTech AI Team3 წთ. საკითხავი

Prototip icra faylı formatını SQLite verilənlər bazasına çevirir

Tərtibatçı Fərid Zəkəriyya SELF adlı eksperimental format hazırlayıb: o, proqramı və kitabxanalarını bir SQLite bazasında saxlayır və readelf ilə ldd-ni SQL sorğuları ilə əvəz edir.

Tərtibatçı Fərid Zəkəriyya ELF ikili formatını SQLite ilə əvəz edən prototip dərc edib. Layihə SELF — Structured Executable & Linkable Format adlanır: nəticə icra icazəsi verilən və həqiqətən işləyən adi SQLite faylıdır, binutils alətlərinin yerini isə SQL sorğuları tutur. Kod GitHub-da selfdb repozitoriyasındadır.

ELF artıq verilənlər bazasıdır

Zəkəriyyanın arqumenti budur ki, ELF onsuz da verilənlər bazasıdır, sadəcə əl ilə həyata keçirilib: sətir cədvəlləri sətir internləməsidir, .gnu.hash əl ilə qurulmuş indeksdir, bölmə başlıqları cədvəli cədvəllər cədvəlidir, sətir cədvəlinə olan ofsetlər isə xarici açar rolunu oynayır. Format sıxdır, özünü təsvir edən sxemi yoxdur və onu oxuyan hər alət eyni parsı yenidən yazır. Onun əvvəlki aləti sqlelf ELF fayllarını SQL virtual cədvəlləri kimi təqdim edirdi ki, tərtibatçılar readelf ilə grep-i birləşdirmək əvəzinə SELECT yaza bilsinlər.

SELF faylı nə saxlayır

İcra üçün iki cədvəl kifayətdir: self_meta ELF başlığını açar-dəyər cütləri kimi saxlayır, segments isə hər proqram başlığı üçün bir sətir və seqment baytlarını BLOB sütununda tutur. Bir b-tree indeksli tək symbols cədvəli ELF-in bir neçə bölməsini və əl ilə qurulmuş .gnu.hash strukturunu əvəz edir, simvol versiyaları isə adi sütuna çevrilir. sections, notes və dynamic_entries cədvəlləri yalnız alətlər üçündür: onlar silindikdən sonra proqram yenə işləyir, yəni strip DELETE və VACUUM, patchelf UPDATE, ldd isə JOIN üzərində görünüşdür.

Nüvə onu necə işə salır

SQLite başlığının 68-ci baytında dörd baytlıq application_id sahəsi saxlayır; SELF ora SELF hərflərini yazır, ona görə adi baza heç vaxt uyğun gəlmir. Linux-dakı binfmt_misc qeydiyyatı nüvəyə faylı kiçik interpretatora — self-exec-ə ötürməyi tapşırır; o, yüklənən seqmentləri yaddaşa yerləşdirir, yerdəyişmələri icra edir və giriş nöqtəsinə keçir. İnterpretatorun özü ELF qalmalıdır, çünki sehrli baytlarla da uyğun gələn interpretator nüvə ELOOP qaytarana qədər rekursiv çağırılardı.

Xərc və bir faylda bütün userland

Dinamik bağlama iki yolla sınanıb: əvvəlcə ld.so yerində saxlanıldı və kitabxana axtarışları glibc-nin rtld-audit interfeysi vasitəsilə SQL ilə cavablandırıldı, sonra bütün bağlamanı SQL-də yerinə yetirən prototip linker yaradıldı. Ölçü baxımından SELF faylı ekvivalent ELF-dən təxminən iki dəfə böyükdür, lakin bunun çoxu qeyri-məcburi alət məlumatıdır: təmizləndikdən sonra coreutils ikilisi 1 794 048 bayt, ELF versiyası isə 1 768 632 bayt ölçüldü — bir faiz içində. İşə salma sabit təxminən 5 ms və obrazın ölçüsünə uyğun köçürmə əlavə edir; baytlar yaddaşa map edilmədən b-tree-dən kopyalandığı üçün eyni proqramın iki prosesi mətn səhifələrini paylaşmır.

Bütün userland-ı bir bazaya yığmaq ən təsirli nəticəni verdi: 400 fərqli kitabxanadan istifadə edən 723 icra faylı tək 611,9 MiB faylda 1123 obyekt və 346 386 simvola çevrildi — mənbə olan 644,4 MiB ELF faylından daha kiçik. LD_PRELOAD cədvəldə sətirə çevrilir, ona görə onu açıb-söndürmək tranzaksiyadır.

SSiTech

SiTech — AI ilə gücləndirilmiş veb hazırlanması

Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.