Langsung ke konten

Arsip

System Call

56 artikel
Linux 23 Sep 2026 4 min read

TFD_TIMER_CANCEL_ON_SET Mengubah Lompatan Clock Realtime Menjadi ECANCELED

Timer absolut yang terikat ke CLOCK_REALTIME memiliki ketergantungan yang tidak dimiliki deadline monotonic: administrator, layanan sinkronisasi, atau proses berprivilege dapat memindahkan wall clock secara diskontinu ketika timer masih aktif. Linux timerfd dapat mengekspos kejadian itu secara eksplisit. Dengan TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, perubahan clock yang memenuhi syarat membuat read() saat ini atau berikutnya pada descriptor timer gagal dengan ECANCELED. Perilaku ini memisahkan dua kejadian yang mudah tercampur: tercapainya waktu wall clock yang dijadwalkan dan tidak berlakunya basis clock yang dipakai saat jadwal dibuat.

Linux 23 Sep 2026 4 min read

pidfd_getfd Menduplikasi Descriptor Target ke Proses Pemanggil

pidfd_getfd Menduplikasi Descriptor Target ke Proses Pemanggil pidfd_getfd() dapat menempatkan duplikat file descriptor milik proses lain ke tabel descriptor proses pemanggil. Descriptor hasil menjadi milik pemanggil, tetapi tetap merujuk ke open file description yang sama dengan descriptor terpilih pada proses target. Batas ini penting karena operasi tersebut tidak membuka ulang pathname, membangun ulang socket, atau membuat posisi file independen. Kernel menduplikasi referensi yang sudah ada melintasi batas proses. pidfd dan targetfd menunjuk dua hal berbeda Pemanggilan menerima PID file descriptor serta nomor descriptor milik proses target:

Linux 23 Sep 2026 5 min read

membarrier Private Expedited Mengurutkan Memori Userspace Antar-Thread

Linux membarrier() dapat memindahkan sebagian biaya sinkronisasi dari jalur yang sangat sering dieksekusi ke jalur koordinasi yang lebih jarang. Dengan MEMBARRIER_CMD_PRIVATE_EXPEDITED, satu thread meminta kernel membentuk titik memory ordering bagi thread yang sedang berjalan dalam proses yang sama. Biaya system call dibayar saat koordinasi diperlukan, bukan dengan menempatkan hardware memory barrier pada setiap eksekusi fast path. Mekanisme ini lebih sempit daripada rendezvous thread umum. membarrier() tidak menjalankan callback aplikasi pada sibling thread, tidak menunggu acknowledgement pada level aplikasi, dan tidak membuat data race biasa menjadi sinkronisasi yang valid. Kontraknya berfokus pada pengurutan akses memori userspace di sekitar barrier.

Linux 23 Sep 2026 5 min read

close_range dengan UNSHARE Memisahkan Cleanup File Descriptor dari Thread Lain

Proses Linux multithread dapat memakai satu tabel file descriptor secara bersama. Pola itu praktis selama eksekusi normal: descriptor yang dibuka satu thread tersedia bagi thread lain. Masalah muncul ketika satu thread sedang menyiapkan konteks eksekusi terbatas dan ingin membuang range descriptor yang luas, sementara thread lain masih dapat mengalokasikan descriptor pada tabel yang sama. close_range() menyediakan operasi berbasis range untuk batas tersebut. Dengan CLOSE_RANGE_UNSHARE, kernel lebih dulu memisahkan caller dari tabel descriptor bersama, lalu menerapkan penutupan yang diminta pada tabel hasil pemisahan milik caller. Secara konsep, operasi ini mendekati gabungan unshare(CLONE_FILES) dan penutupan range, tetapi kernel dapat menghindari pekerjaan yang tidak diperlukan pada kasus umum.

Linux 22 Sep 2026 5 min read

signalfd Mengubah Signal yang Diblokir Menjadi Event yang Dapat Dibaca

Signal Linux biasanya memotong alur thread melalui delivery asinkron. signalfd() menyediakan boundary berbeda untuk signal terpilih: signal tetap diblokir pada thread yang relevan, lalu instance yang pending dikonsumsi dengan membaca file descriptor. Mekanisme signal tidak berubah menjadi byte stream. Kernel tetap memelihara state signal serta aturan delivery process-directed dan thread-directed. signalfd menambahkan interface file descriptor untuk menerima signal dari set yang dikonfigurasi. Blocking dan mask descriptor adalah state yang terpisah Sebuah signalfd memiliki signal-set mask yang menentukan signal mana yang dapat diterimanya. Mask tersebut tidak memblokir signal pada thread. Pemakaian normal karena itu memasangkan pembuatan descriptor dengan operasi signal mask.

Linux 21 Sep 2026 5 min read

io_uring Multishot Accept Mempertahankan Satu Request Accept Tetap Aktif

Request accept biasa memiliki pola satu banding satu: satu operasi yang dikirim pada akhirnya menghasilkan satu completion. io_uring multishot accept mengubah hubungan tersebut. Satu SQE accept dapat tetap aktif untuk banyak koneksi masuk dan menghasilkan completion queue entry terpisah bagi setiap socket yang diterima. Request itu persisten, tetapi tidak permanen. Setiap CQE membawa state yang memungkinkan aplikasi menentukan apakah request awal masih dapat menghasilkan completion berikutnya. Boundary ini penting karena server yang menganggap setiap CQE sukses sebagai bukti bahwa accept masih aktif dapat berhenti menerima koneksi secara diam-diam setelah request multishot berakhir.

Linux 21 Sep 2026 4 min read

futex_waitv Menunggu Beberapa Futex Word dalam Satu Wait

Futex wait tradisional menunjuk satu futex word. Model itu cocok untuk mutex atau condition yang blocking state-nya direpresentasikan oleh satu nilai shared 32-bit. Beberapa desain sinkronisasi memiliki kebutuhan berbeda: satu thread perlu sleep sampai salah satu dari beberapa state independen berubah. futex_waitv() menyediakan vector wait tersebut. Caller mengirim array wait descriptor yang masing-masing memuat alamat futex dan expected value. Kernel memeriksa vector dan hanya melakukan block selama semua entry masih cocok dengan state yang diharapkan.

Linux 21 Sep 2026 5 min read

Flag Resolve openat2 Membatasi Traversal Path Saat Lookup

Path yang diberikan ke openat() diresolusikan oleh kernel, tetapi caller hanya memiliki kontrol terbatas atas traversal komponen perantara. Linux openat2() menambahkan field resolve untuk menerapkan batas pada keseluruhan operasi lookup. Batas tersebut diperiksa ketika komponen path sedang ditelusuri, bukan melalui validasi path di userspace yang dilanjutkan dengan open terpisah. Perbedaan ini relevan saat komponen path dapat berubah secara concurrent. Urutan yang memeriksa path lalu membukanya menghasilkan dua observasi terpisah terhadap state filesystem yang mutable. openat2() menempatkan policy lookup pada system call yang sama dengan operasi yang menghasilkan file descriptor.

Linux 21 Sep 2026 5 min read

File Seal memfd Membekukan State Shared Memory

File dari memfd_create() pada awalnya merupakan file anonim yang mutable. Ukurannya dapat diubah, isinya dapat ditulis, dan file dapat dipetakan seperti file biasa, sementara storage-nya bersifat volatile dan dilepas setelah referensi terakhir hilang. File sealing menambahkan fase lain pada lifecycle tersebut: setelah data selesai diisi, kernel dapat menolak secara permanen kelas perubahan tertentu. Transisi ini berguna saat satu process menyiapkan byte lalu menyerahkan file description yang sama ke process lain. Penerima dapat memeriksa seal yang melekat pada inode, bukan hanya mengandalkan kesepakatan bahwa pengirim tidak akan mengubah objek lagi.

Linux 20 Sep 2026 5 min read

pidfd_getfd Menduplikasi File Descriptor Aktif Antarproses

Sebuah proses dapat memperoleh duplikat file descriptor yang sudah terbuka di proses lain tanpa meminta proses tersebut mengirimkannya melalui UNIX domain socket. Linux pidfd_getfd() melakukan transfer itu melalui PID file descriptor, dengan izin yang dibatasi oleh pemeriksaan akses ptrace. Descriptor yang diterima merupakan entry baru di caller, tetapi objek kernel di baliknya bukan objek independen. Descriptor tersebut merujuk ke open file description yang sama dengan descriptor target. Perbedaan ini menentukan sharing offset, file status flags, dan operasi terhadap objek dasarnya.

Linux 19 Sep 2026 5 min read

userfaultfd Memindahkan Resolusi Page Fault Terpilih ke User Space

Akses memori biasanya masuk ke jalur page fault kernel dan selesai tanpa aplikasi memilih isi page tepat pada saat itu. Linux userfaultfd mengubah batas tersebut untuk rentang alamat virtual yang didaftarkan: fault terpilih menjadi event pada file descriptor, lalu manager di user space dapat menyediakan atau mengaktifkan page sebelum thread yang mengalami fault melanjutkan eksekusi. Mekanisme ini tidak mengganti page table proses dengan struktur data di user space. Kernel tetap memiliki page-table state dan melakukan operasi mapping akhir. User space memperoleh kendali atas kelas fault tertentu beserta waktu resolusinya.

Linux 19 Sep 2026 4 min read

timerfd Membaca Jumlah Expiration Periodik

Timer periodik dapat mencapai expiration beberapa kali sebelum event loop yang sibuk kembali mendapat waktu CPU. Linux timerfd tidak mereduksi keterlambatan itu menjadi notifikasi “timer aktif” semata. read() yang berhasil mengembalikan counter unsigned 64-bit berisi jumlah expiration yang terakumulasi sejak timer diaktifkan atau sejak read sebelumnya yang berhasil. Counter tersebut mengubah semantik penanganan timer yang terlambat. Readiness menyatakan setidaknya satu expiration sedang tertunda; nilai yang dibaca dari descriptor menyatakan berapa banyak periode yang telah berlalu.

Linux 19 Sep 2026 4 min read

signalfd Mengubah Sinyal Linux Menjadi Event File Descriptor

Sinyal POSIX konvensional dapat menginterupsi thread pada hampir semua batas instruksi lalu memindahkan kontrol ke signal handler. Alur kontrol asinkron tersebut membatasi operasi yang aman di dalam handler dan menambah kerumitan pada program yang control plane utamanya sudah berjalan melalui epoll, poll, atau select. Linux signalfd() menyediakan antarmuka pengiriman yang berbeda. Proses memblokir sinyal tertentu melalui signal mask biasa, membuat signalfd untuk himpunan tersebut, lalu menerima sinyal pending dengan membaca record signalfd_siginfo terstruktur dari descriptor. Pada antarmuka kernel, objek tersebut tetap berupa sinyal; hanya proses konsumsinya yang dipindahkan ke I/O file descriptor biasa.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

seccomp User Notification Memindahkan Keputusan Syscall Terpilih ke Broker

Filter seccomp dapat melakukan lebih dari sekadar langsung mengizinkan atau menolak system call. Dengan user notification, call yang cocok dapat ditahan sementara proses lain menerima request terstruktur melalui listener file descriptor dan menentukan hasil yang diterima thread yang diblokir. Mekanisme ini mengubah keputusan syscall terpilih menjadi interface berbasis broker tanpa memindahkan seluruh implementasi syscall ke user space. Batasnya presisi, tetapi lebih sempit daripada lapisan interposition umum. Kernel tetap memiliki syscall dispatch, task state, descriptor table, dan validasi yang dilakukan kode kernel. Broker menerima metadata dan dapat mengembalikan nilai, error, atau pada kasus yang didukung meminta eksekusi syscall asli dilanjutkan. Desain yang benar memperhitungkan memory target yang mutable, lifetime notification, serta fakta bahwa keputusan policy tidak otomatis menjadi transaksi atas state proses.

Rekayasa Perangkat Lunak 19 Sep 2026 5 min read

process_vm_readv dan process_vm_writev Mentransfer Memori Melintasi Batas Proses

process_vm_readv() dan process_vm_writev() memungkinkan satu proses Linux menyalin byte secara langsung antara address space miliknya dan address space proses lain. Kedua call bekerja pada vektor rentang memori lokal dan remote, tetapi keberhasilan pencarian proses tidak membuat remote memory menjadi stabil. Perubahan mapping, aksesibilitas page, permission, dan mutasi concurrent tetap menjadi bagian kontrak yang terpisah. Interface ini merupakan system call khusus Linux. Keduanya tidak menetapkan lifetime object C, sinkronisasi, atau model interprocess memory yang portabel.

Linux 19 Sep 2026 6 min read

openat2 Membatasi Resolusi Path pada Boundary Kernel

Sebuah pathname yang dimulai di dalam directory tepercaya dapat berakhir pada objek di luar directory tersebut sebelum open() selesai. Parent component, symbolic link, magic link, mount point, dan perubahan namespace secara concurrent semuanya ikut menentukan pathname lookup Linux. Memeriksa string sebelum membukanya karena itu tidak menetapkan lokasi akhir resolusi yang dilakukan kernel. Linux openat2() menempatkan pembatasan di dalam operasi lookup itu sendiri. Pemanggil memberikan directory file descriptor, open flag biasa, dan kebijakan resolve melalui struct open_how. Kernel kemudian menerapkan batas tersebut saat menelusuri setiap path component yang relevan. Security boundary berpindah dari validasi awal atas teks pathname ke operasi yang benar-benar melakukan resolusi.

Linux 19 Sep 2026 4 min read

openat2 Membatasi Resolusi Path Linux pada Operasi Open

Sebuah pathname dapat berubah makna ketika proses sedang me-resolve-nya. Rename direktori, symbolic link, mount point, dan komponen .. dapat mengarahkan lookup keluar dari direktori yang dimaksud program sebagai batas. Linux openat2() menempelkan kebijakan resolusi langsung pada proses lookup. struct open_how memiliki bit mask resolve, sehingga kernel dapat menolak path ketika resolusinya melanggar batas yang dipilih caller, bukan hanya mengandalkan pemeriksaan yang dilakukan sebelum open(). Directory file descriptor menetapkan titik awal Seperti openat(), openat2() dapat me-resolve pathname relatif dari directory file descriptor:

Linux 19 Sep 2026 5 min read

Notifikasi Pengguna seccomp Memindahkan System Call Terpilih ke Supervisor

Notifikasi Pengguna seccomp Memindahkan System Call Terpilih ke Supervisor Filter seccomp tidak terbatas pada mengizinkan system call atau menolaknya di kernel. Saat filter mengembalikan SECCOMP_RET_USER_NOTIF, Linux dapat menahan thread pemanggil lalu mengirim deskripsi system call yang sedang dicoba ke supervisor di user space. Mekanisme ini membentuk batas interposisi untuk call tertentu. Salah satu pemakaiannya adalah saat proses dengan privilege lebih rendah memerlukan operasi yang dimediasi proses lain, misalnya container manager yang menangani call yang tidak dapat dijalankan langsung oleh container. Batas ini sengaja lebih sempit daripada mesin kebijakan keamanan umum: state notifikasi dapat berpacu dengan memori target yang masih dapat berubah, dan dokumentasi kernel memperingatkan agar inspeksi supervisor tidak dijadikan primitive otorisasi.

Rekayasa Perangkat Lunak 19 Sep 2026 6 min read

Linux pidfd Mengikat Operasi Proses ke Referensi Kernel yang Stabil

Process ID numerik menamai sebuah proses hanya selama PID tersebut masih dialokasikan kepadanya. Setelah proses keluar dan di-reap, Linux dapat menggunakan kembali angka itu untuk proses lain. Kode yang mengamati PID, melakukan pekerjaan lain, lalu bertindak memakai angka tersebut dapat melewati batas lifetime yang tidak dikodekan oleh integer itu sendiri. Linux pidfd menyediakan referensi berbentuk file descriptor ke sebuah proses sehingga operasi berikutnya dapat menargetkan objek proses yang direferensikan tanpa mengulang lookup PID numerik.

Linux 19 Sep 2026 5 min read

eventfd Mengubah Notifikasi Kernel Menjadi Counter yang Dapat Dipantau

Proses Linux dapat memberi sinyal bahwa ada pekerjaan melalui file descriptor tanpa memindahkan byte stream antara producer dan consumer. eventfd() membuat counter 64-bit yang dikelola kernel dan readiness-nya dapat diamati oleh poll(), select(), atau epoll. Operasi write menambah counter; operasi read mengonsumsi state yang telah terakumulasi sesuai mode descriptor. Bentuk ini membedakan eventfd dari pipe. Pipe mempertahankan urutan byte. Eventfd mempertahankan state counter. Saat aplikasi memerlukan sinyal wakeup beserta sedikit state terakumulasi, perbedaan ini menghilangkan buffering dan framing yang diperlukan oleh byte stream.

Linux 19 Sep 2026 5 min read

close_range Menjadikan Pembersihan File Descriptor Satu Operasi Linux

Proses yang bersiap menjalankan program lain sering memiliki batas sederhana: descriptor 0, 1, dan 2 tetap tersedia, sedangkan semua descriptor yang lebih tinggi harus hilang. Memanggil close() berulang sampai batas angka yang diperkirakan atau mengiterasi /proc/self/fd mengubah batas tersebut menjadi pemindaian di userspace. Linux close_range() menyatakan interval itu secara langsung. Kernel menerapkan satu operasi pada setiap file descriptor terbuka dari first sampai last, termasuk kedua ujungnya. Melalui flag, interface yang sama dapat mengisolasi descriptor table bersama atau menandai interval sebagai close-on-exec alih-alih langsung menutupnya.

Linux 18 Sep 2026 5 min read

userfaultfd Mengubah Page Fault Menjadi Event Userspace

Sebuah thread dapat mengalami fault pada virtual address lalu tetap terblokir sementara thread atau proses userspace lain menentukan state page yang membuat akses tersebut dapat dilanjutkan. userfaultfd menyediakan batas ini dengan mengubah page fault terpilih menjadi message pada file descriptor dan memasangkan message tersebut dengan ioctl untuk menyelesaikan fault. Mekanisme ini tidak menggantikan page-fault machinery milik kernel. Kontrol userspace disisipkan pada range dan kelas fault yang didaftarkan, sementara kernel tetap memiliki page table, pemblokiran fault, dan transisi yang membuat page dapat diakses kembali.

Rekayasa Perangkat Lunak 18 Sep 2026 3 min read

timerfd Mengubah Hitungan Ekspirasi Timer Menjadi State Descriptor yang Dapat Dipoll

Sebuah timerfd Linux menjadi readable ketika timer yang dikonfigurasi mengalami ekspirasi. Byte yang dikembalikan oleh read(2) bukan timestamp atau event record: nilainya mengodekan satu integer unsigned 64-bit yang berisi jumlah ekspirasi sejak successful read sebelumnya. State timer dengan demikian masuk ke mekanisme readiness yang sama dengan socket dan pipe, sementara semantik khusus timer tetap berada di balik batas descriptor. Readiness merepresentasikan hitungan ekspirasi tertunda timerfd_create(2) membuat descriptor yang terkait dengan sebuah clock, sedangkan timerfd_settime(2) mengaktifkan atau menonaktifkan timer. Setelah setidaknya satu ekspirasi tertunda, poll(2), select(2), dan epoll(7) dapat melaporkan descriptor sebagai readable.

Linux 18 Sep 2026 4 min read

timerfd Menghitung Ekspirasi melalui I/O Descriptor

timerfd periodik tidak memerlukan satu wakeup userspace untuk setiap ekspirasi timer. Jika beberapa ekspirasi terjadi sebelum descriptor dibaca, Linux mengakumulasikannya dan mengembalikan jumlahnya dalam satu integer 8 byte. Perilaku ini menempatkan state timer dalam model readiness yang sama dengan socket, pipe, dan descriptor lain. Event loop yang terlambat juga memperoleh informasi eksplisit tentang periode yang terlewat, alih-alih beberapa ekspirasi dilebur menjadi satu notifikasi. State ekspirasi menjadi data descriptor yang dapat dibaca timerfd_create() membuat objek timer dan mengembalikan file descriptor yang merujuk kepadanya. Clock yang dipilih menentukan basis waktu timer. Pilihan umum mencakup CLOCK_MONOTONIC, CLOCK_REALTIME, dan CLOCK_BOOTTIME.