Bosh sahifa Wiki Syscall

Syscall

Syscall — foydalanuvchi dasturining operatsion tizim kernelidan himoyalangan xizmat so‘rash mexanizmi. Uning to‘liq nomi system call hisoblanadi.

Ilova hardware, fayl tizimi, process va tarmoq resurslariga to‘g‘ridan-to‘g‘ri nazoratsiz kira olmaydi. Syscall kernelga tekshirilgan kirish nuqtasini beradi.

Fayl ochish, socket yaratish, process ishga tushirish va xotira ajratish syscall orqali bajariladi.

User mode va kernel mode

CPU kamida ikki privilege darajasida ishlaydi.

User mode

Ilova cheklangan huquqda ishlaydi. Kernel xotirasiga va qurilma registerlariga bevosita kira olmaydi.

Kernel mode

Operatsion tizim to‘liq hardware huquqiga ega.

Syscall user mode’dan kernel mode’ga nazoratli o‘tish yaratadi.

Syscall jarayoni

Umumiy jarayon:

  1. Ilova library funksiyasini chaqiradi.
  2. Argumentlar register yoki xotiraga joylanadi.
  3. Syscall raqami belgilanadi.
  4. Maxsus CPU instruction bajariladi.
  5. CPU kernel mode’ga o‘tadi.
  6. Kernel argument va permissionni tekshiradi.
  7. Amal bajariladi.
  8. Natija user mode’ga qaytariladi.

Arxitektura va OSga qarab tafsilotlar farq qiladi.

Keng tarqalgan syscalllar

  • openatfayl ochish;
  • read — ma’lumot o‘qish;
  • write — ma’lumot yozish;
  • close — descriptor yopish;
  • mmap — xotira mapping;
  • fork yoki cloneprocess/thread yaratish;
  • execve — yangi dastur yuklash;
  • socketsocket yaratish;
  • connect — ulanish;
  • acceptclient qabul qilish;
  • ioctl — device boshqarish.

Nomlar OSga bog‘liq.

Library wrapper

Dastur ko‘pincha syscallni bevosita emas, standard library orqali chaqiradi.

Masalan, C fopen() ichkarida openat, read va boshqa syscalllardan foydalanishi mumkin.

Library:

  • buffer;
  • portability;
  • error conversion;
  • thread safety;
  • qo‘shimcha mantiq

beradi.

Syscall raqami

Kernel har syscallni raqam bilan aniqlaydi.

Raqam CPU arxitekturasi bo‘yicha farq qilishi mumkin.

x86-64 va ARM64da bir xil nomli syscall boshqa raqamga ega bo‘ladi.

Portable dastur raqamni qo‘lda yozmaydi.

Argument tekshiruvi

Kernel user pointerga ko‘r-ko‘rona ishonmaydi.

U:

ni tekshiradi.

Noto‘g‘ri pointer processga xato qaytarishi yoki signal berishi mumkin.

Return value va errno

Syscall muvaffaqiyatli natija yoki xato qaytaradi.

Unix library xatoni errno orqali ko‘rsatishi mumkin.

Misollar:

  • EACCES — ruxsat yo‘q;
  • ENOENTfayl topilmadi;
  • EINTR — signal bilan uzildi;
  • EAGAIN — hozir bajarib bo‘lmaydi;
  • ENOMEM — xotira yetarli emas.

Error kodi logda inson tushunadigan matnga aylantiriladi.

Blocking syscall

read() data kelguncha kutishi mumkin.

Thread sleeping holatiga o‘tadi va CPU boshqa ishga beriladi.

Non-blocking flag bo‘lsa, data tayyor emasligida EAGAIN qaytishi mumkin.

Interrupted syscall

Signal blocking syscallni to‘xtatishi mumkin.

Ba’zi syscall avtomatik restart qilinadi, boshqasi EINTR qaytaradi.

Dastur qisman bajarilgan yozuv va qayta urinishni to‘g‘ri boshqaradi.

Syscall overhead

Syscall user-kernel mode o‘tishini talab qiladi.

Overhead tarkibi:

Har bayt uchun syscall qilish samarasiz. Buffering va batching ishlatiladi.

vDSO

Ayrim operatsiyalar kernel mode’ga o‘tmasdan user space’dagi kernel taqdim etgan kod orqali bajarilishi mumkin.

Masalan, vaqtni o‘qish.

Bu virtual dynamic shared object orqali syscall overheadini kamaytiradi.

io_uring

Linux io_uring ko‘p I/O operatsiyasini shared ring buffer orqali yuborish va yakunlanishini olish imkonini beradi.

Bu syscall sonini kamaytirishi va asynchronous I/Oni samarali tashkil qilishi mumkin.

Security va kernel versiyasiga mos boshqaruv talab qilinadi.

Seccomp

Seccomp process qaysi syscalllarni chaqira olishini filtrlashga yordam beradi.

Container yoki sandbox:

  • kerakli syscallga ruxsat;
  • boshqasini rad etish;
  • signal;
  • log;
  • user notification

siyosatini qo‘llashi mumkin.

Bu kernel attack surface’ini kamaytiradi.

Strace

Linuxda strace process syscalllarini ko‘rsatadi.

U orqali:

aniqlanadi.

Tracing performance’ga ta’sir qilishi va maxfiy argumentlarni ko‘rsatishi mumkin.

ABI

Syscall interfeysi kernel va user space orasidagi ABI qismi.

Argument registerlari, raqamlar va struktur layout barqaror bo‘lishi kerak.

Oldingi binary yangi kernelda ishlashi uchun compatibility saqlanadi.

Xavfsizlik

Kernel syscall orqali untrusted input oladi.

Zaifliklar:

  • buffer overflow;
  • integer overflow;
  • use-after-free;
  • race;
  • permission bypass;
  • device ioctl xatosi.

Kernel patch va minimal syscall siyosati muhim.

Diagnostika

Syscall muammosida:

tekshiriladi.

Ilova “fayl topilmadi” desa, qaysi aniq yo‘l syscallga berilganini tracing ko‘rsatadi.

Syscall va process accounting

Kernel syscall orqali qaysi process qancha CPU, I/O va resurs ishlatayotganini hisobga oladi. Audit tizimi ayrim syscall hodisalarini user, executable va file path bilan yozishi mumkin.

Juda keng audit qoidasi yuqori syscall tezligida katta log va performance xarajati yaratadi. Faqat xavfsizlik uchun kerakli hodisalar tanlanadi.

Syscall batching

readv, writev, sendmmsg kabi interfeyslar bir chaqiriqda bir nechta buffer yoki xabar bilan ishlaydi. Bu user-kernel transition sonini kamaytirib, yuqori trafikdagi throughputni oshiradi.

Process tracing chegarasi

Tracing vositasi syscall argumentida fayl nomi va network manzilini ko‘rsatadi, lekin application ichki biznes mantiqini to‘liq tushuntirmaydi. Syscall trace log va profiler bilan birga tahlil qilinadi.

Bog‘liq tushunchalar

Kernel, User mode, Kernel mode, ABI, File descriptor, Interrupt, Exception, Seccomp, strace, io_uring