Assembly va Web Serverlar Uchrashuvi: Toza Tizim Dasturlash Sarguzashtlari
Assembly va Veb-serverlar: Tizimlarning Ichki Dunyosiga Sayohat
Biz ko'pincha "nima qilib yasalayotganini bilish" degan gapni eshitamiz. Lekin agar siz o'zingiz sigirni tosh pichoq bilan so'rasangiz nima bo'ladi? Bu ymawky loyihasining ruhini aniq ifodalaydi — macOS uchun ARM64 assembly tilida yozilgan to'liq ishlaydigan statik HTTP server. Hech qanday libc yoki boshqa yordamchi kutubxonalarsiz, sof kuch bilan.
Nega Bunday Qilish Kerak?
Rostini aytsak, nginxni assembly bilan almashtirmaymiz. Lekin 1950-yillardan beri yaratilgan barcha qulayliklarni olib tashlab, veb-server qurish o'ziga xos saboq beradi.
Muallifning maqsadi oddiy: past darajali tizimlar bilan ishlagan odam sifatida, u veb-serverlarning mohiyatini tushunmaganini sezdi. Haqiqiy xavflar nimalar? Qaysi muammolarni hal qilish kerak? Python yoki C dagi abstraktsiyalar ortida nima yashiringan?
Kontaynerli nginx ishlatadigan dunyoda, temir darajasidagi jarayonlarni bilish katta foyda.
Assembly: Go'zal Qattiqqo'llik
Assembly mashina kodlari va inson tushunchasi orasidagi nozik chiziqda turadi. mov x16, #5 yozsangiz, bu sehrli buyruq emas — CPU registriga 5 raqamini joylashtirasiz. Bu syscall Darwin'dagi open() funksiyasiga mos keladi.
Assemblyning og'ir va foydali tomonlari:
Qiyinchiliklari:
- Xotirani o'zingiz boshqarasiz, avtomatik tozalash yo'q
- Stringlar — faqat ketma-ket baytlar, tur xavfsizligi yo'q
- Strukturalar uchun offsetlarni qo'lda hisoblaysiz, bir xato — axlat o'qiysiz
- Har xatoni CPU flaglari orqali tekshirasiz
- Bitta xato butun tizimni quldiradi, kompilyator ogohlantirmaydi
Afzalliklari:
- Har bir CPU ko'rsatmasini ko'rasiz
- Yashirin xarajatlar yo'q
- Apparatning harakatini aniq bilasiz
- Tezlik xususiyatlari shaffof
Assemblyda HTTP so'rovini tahlil qilish kutubxonasiz, bayt-bayt qurasiz. Bu noto'g'ri ma'lumotlar, kodlash muammolari va xavfsizliklarni o'ylashga majbur qiladi.
Sof Syscalllar: Hech Qanday Himoya Yo'q
C dasturlari libc orqali kernel bilan gaplashadi. ymawky buni o'tkazib yuboradi:
mov x16, #5 ; SYS_open raqami
adrp x0, filename@PAGE
add x0, x0, filename@PAGEOFF
mov x1, #0x0 ; O_RDONLY
svc #0x80 ; Kernel chaqiruvi
b.cs open_failed ; Carry flag bo'lsa xatoga o't
Registrlarga argumentlar qo'yasiz, svc bilan kernelni chaqirasiz, carry flagni tekshirasiz. Xato boshqaruvi yo'q — faqat flag va shartli o'tish.
Bu nozikroq, lekin haqiqiy. Kernel holatni qaytaradi, uni o'zingiz hal qilasiz.
Server Tuzilishi
ymawky klassik fork-on-request modelini ishlatadi:
- Socket ochib, portga bog'laydi
- Yangi ulanishlarni kutadi
- Har ulanishda fork() qilib yangi jarayon yaratadi
- U jarayonda HTTP so'rovni qayta ishlaydi
Nega fork?
- So'rovlar orasida xotira izolyatsiyasi
- Oddiy kod va fikrlash
- Xatolikdan oson tiklanish
Kamchiliklari:
- Katta xotira sarfi (har fork butun jarayonni nusxalaydi)
- Nginx kabi event-driven modellariga qaraganda zaif parallelizm
- Yuk ostida kontekst almashinuvi sekinlashtiradi
- Minglab ulanishlarga chiqmaydi
Tez emas, lekin assemblyda tushunarli. Maqsad shu.
So'rov Jarayonida Nima Bo'ladi
So'rovni qayta ishlashda frameworklarda ko'rmaydigan muammolar chiqadi:
- Turi aniqlash: GET, POST, PUT kabi so'rovni baytlardan ajratish
- Yo'l chiqarish: Fayl yo'lini HTTP qatoridan olish
- URL dekodlash: %20 ni bo'shliikka aylantirish, chekka holatlar
- Yo'l hujumini oldini olish:
../../../etc/passwdkabi hiylalarga yo'l qo'ymaslik - Headerlarni tahlil: Mijoz yuborgan har bir header
- Range so'rovlari: Katta fayllarni qism-bo'lim bilan yuborish
- Papka ro'yxati: HTML bilan katalog ko'rsatish
- Xato sahifalari: 404 uchun mazmunli javob
Python yoki JSda oddiy. Assemblyda har biri kichik loyiha — registrlarni saqlash, stringlarni qo'lda ishlov berish, xatolarni tekshirish.
Nega Zamonaviy Dasturchilar Uchun Muhim
Assembly yozmaysiz, ishlab chiqarish serverini shunda qurmaysiz. Lekin ymawky kodi shuni o'rgatadi: har abstraksiya murakkablikni yashiradi.
Framework HTTPni avtomatik qilsa, kimdir bu muammolarni chuqur bilgan. O'zingiz bilib olsangiz — yaxshi muhandis bo'lasiz.
Bu o'zingiz non pishirish kabi. Doimiy emas, lekin jarayonni bilish ingredientlarni yaxshi ishlatishga yordam beradi.
NameOcean Bilan Bog'liqligi
NameOcean'da DNS, domain boshqaruvi, cloud infratuzilmasi bilan ishlaymiz. Kernel darajasidagi tizimlar, protokollar va syscall chekkalarini bilish yaxshi qarorlar beradi.
Bizning cloud hostingda joylashtirsangiz, domain DNS sozlasangiz yoki SSLni bayt darajasida tushunsangiz, bu fikrlash kerak. Biz narsalarni qanday ishlatishni emas, qanday ishlashini o'rganamiz.
Xulosa
ymawky nginxni yengmaydi. Lekin eng foydasiz loyihalar eng katta saboq beradi. Bu kamtarlik — kundalik vositalarga qancha mehnat ketganini ko'rish — va shaffoflik — apparatning haqiqiy harakatini bilish.
Veb-server so'rovni qanday qayta ishlayotganini bilmoqchi bo'lsangiz, ymawky qattiq, lekin yorqin javob.