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.

Dua array iovec mendeskripsikan dua address space

Kedua call menerima array iovec lokal dan array iovec remote. Pada process_vm_readv(), byte bergerak dari vektor remote ke vektor lokal. process_vm_writev() membalik arah tersebut.

Batas elemen pada kedua vektor tidak harus sama. Linux menelusuri vektor lokal dan remote sesuai urutan array lalu bergerak sepanjang rentang byte masing-masing. Karena itu, satu elemen remote 4 KiB dapat mengisi beberapa elemen lokal yang lebih kecil selama jumlah byte yang ditransfer mencapai rentang tersebut.

Kernel memvalidasi jumlah vektor lokal dan remote serta menghitung ukuran request sesuai batas interface. Namun, address di dalam vektor remote merujuk ke virtual address space milik proses target. Maknanya bergantung pada mapping proses tersebut saat akses berlangsung.

Perbedaan ini penting: iovec adalah deskripsi transfer, bukan referensi yang dipertahankan terhadap sebuah memory object.

Permission check membatasi akses sebelum transfer byte

Akses memori lintas proses tunduk pada ptrace access-mode check. Credential, dumpability, capability, user namespace, dan kebijakan Linux Security Module dapat memengaruhi hasil. Mengetahui PID dan virtual address saja tidak memberikan otoritas yang cukup.

Aturan akses tersebut juga membuat konteks deployment menjadi relevan. Kode yang berhasil di antara proses terkait dengan susunan credential tertentu dapat gagal setelah perubahan privilege, namespace, atau kebijakan keamanan yang lebih ketat.

Kedua call tidak melakukan attach ke target seperti debugger. Target tidak otomatis dihentikan, dan system call tersebut tidak membentuk sinkronisasi pada level aplikasi dengan thread yang dapat membaca atau mengubah memori yang sama.

Remote address hanya valid selama mapping mendukung akses

Virtual address tidak memiliki identitas permanen ketika mapping berubah. Target dapat memanggil munmap(), mengganti mapping melalui mmap() dengan MAP_FIXED, mengubah protection melalui mprotect(), atau keluar ketika proses lain sedang menyiapkan transfer.

Akibatnya, penemuan address dan transfer memori merupakan operasi terpisah kecuali aplikasi menyediakan protokol koordinasi yang lebih kuat. Address yang sebelumnya diperoleh dari metadata target dapat menjadi tidak valid atau kemudian menunjuk storage yang berbeda.

Hal ini berbeda dari API yang mengembalikan kernel handle dengan identitas object yang dipertahankan. process_vm_readv() dan process_vm_writev() menerima PID beserta raw remote address pada setiap call. Keduanya tidak melakukan pin terhadap logical allocation hanya karena address tersebut sebelumnya valid.

Partial transfer merupakan bagian dari interface

Return value berupa jumlah byte, bukan jaminan bahwa seluruh rentang request telah disalin. Transfer dapat berhenti setelah menyalin sebuah prefix ketika rentang remote berikutnya tidak dapat diakses.

Dokumentasi Linux saat ini menyatakan bahwa partial transfer dapat terjadi pada granularity remote page. Jika satu elemen iovec remote melintasi beberapa page dan page berikutnya invalid atau tidak tersedia, byte dari page sebelumnya dapat sudah ditransfer. Untuk data dengan panjang yang belum pasti, memisahkan deskripsi remote pada page boundary membuat batas progress menjadi eksplisit dan membatasi rentang yang terdampak oleh page berikutnya yang tidak dapat diakses.

Caller harus memperlakukan return value positif yang lebih kecil dari total request sebagai state yang bermakna. Retry dari array vektor awal tanpa menyesuaikan offset dapat menduplikasi bagian awal pada write atau menimpa byte lokal yang sudah terisi pada read.

Caller yang kuat memajukan kedua stream vektor sesuai jumlah byte yang dikembalikan sebelum menentukan apakah percobaan berikutnya valid.

Penyalinan byte tidak membentuk synchronization relation

Read yang selesai melaporkan byte yang disalin selama system call; operasi itu tidak mengubah data structure yang sedang berubah secara concurrent menjadi snapshot yang koheren. Jika target memutasi beberapa field tanpa protokol sinkronisasi yang disepakati, reader dapat memperoleh kombinasi yang tidak pernah menjadi state stabil menurut aplikasi.

Hal serupa berlaku pada write. Menulis beberapa byte ke proses lain tidak memberikan atomicity yang sesuai dengan object model aplikasi. Thread target lain dapat mengakses region tersebut secara concurrent, dan aturan data race pada level bahasa tetap relevan untuk kode yang menafsirkan byte tersebut sebagai language object.

Untuk inspeksi lintas proses, sequence counter, target quiescence yang eksplisit, shared protocol, atau mekanisme konsistensi lain yang ditetapkan aplikasi mungkin diperlukan. System call menyediakan transport melintasi address space; system call tidak menyediakan transactional semantics.

Remote pointer tetap merupakan nilai milik proses target

Menyalin structure yang berisi pointer tidak membuat pointer tersebut dapat digunakan di address space caller. Pointer field biasanya merupakan virtual address yang diinterpretasikan di proses target. Address-space layout, penempatan mapping, dan object lifetime tetap bersifat lokal bagi proses tersebut.

Caller dapat memakai nilai itu sebagai remote address untuk transfer berikutnya jika nilainya tepercaya dan masih valid, tetapi melakukan dereference secara lokal merupakan operasi berbeda dengan mapping yang tidak berkaitan.

Hal ini juga membuat kesepakatan ABI menjadi relevan. Structure layout, lebar field, endianness pada arsitektur yang didukung, dan format aplikasi berversi perlu diperhitungkan ketika byte diinterpretasikan dan bukan sekadar diperlakukan sebagai data opaque.

Batas transfer harus menjadi bagian protokol

System call ini paling dapat diprediksi ketika aplikasi memperlakukan akses remote memory sebagai protokol dengan aturan identity, lifetime, dan consistency yang eksplisit. Kernel memeriksa akses dan memindahkan byte, sedangkan aplikasi tetap bertanggung jawab menentukan address mana yang menunjuk data tertentu serta kapan data itu dapat berubah.

Pemisahan tersebut mencegah primitive copy tingkat rendah dianggap sebagai abstraksi shared memory yang stabil. Hasil yang dapat diamati adalah transfer byte melintasi dua virtual address space, dibatasi oleh mapping saat ini, access policy, dan synchronization guarantee yang disediakan di tempat lain.