Fungsi FillDeviceMemory

Fungsi FillDeviceMemory mengatur konten buffer tanpa gangguan dari pengoptimalan pengkompilasi dalam situasi di mana pengembang perlu juga memastikan bahwa kesalahan penyelarasan tidak akan dihasilkan saat mengakses memori perangkat.

Penting

Beberapa informasi berkaitan dengan produk prarilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Parameter

Tujuan Param [keluar]

Penunjuk ke alamat awal blok memori yang akan diisi.

Panjang Param [in]

Ukuran blok memori yang akan diisi, dalam byte. Nilai ini harus kurang dari ukuran buffer Tujuan.

Param Fill [in]

Nilai byte untuk mengisi blok memori.

Sintaks

volatile void*
  FillDeviceMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

Keterangan

API ini ada untuk memberikan perilaku FillVolatileMemory (yaitu mengatur konten buffer tanpa gangguan dari pengoptimalan kompilator) dalam situasi di mana pengembang perlu juga memastikan bahwa kesalahan penyelarasan tidak akan dihasilkan saat mengakses memori perangkat. API memiliki properti berikut:

  • API tidak dikenali sebagai kompilator intrinsik sehingga pengkompilasi tidak akan pernah mengoptimalkan panggilan (baik sepenuhnya atau mengganti panggilan dengan urutan instruksi "setara"). Ini berbeda dari FillMemory yang tunduk pada berbagai pengoptimalan pengkompilasi.
  • Ketika panggilan selesai, buffer telah ditimpa dengan nilai yang diinginkan. Fungsi ini mengakses memori ke Tujuan hanya akan dilakukan dalam fungsi (yaitu pengkompilasi tidak dapat memindahkan akses memori dari fungsi ini).
  • API dapat melakukan akses memori yang tidak ditetapkan hanya jika CPU mendukung akses memori yang tidak ditandatangani pada memori perangkat. Jika CPU tidak mendukung akses memori perangkat yang tidak sejajar, hanya akses yang selaras yang akan dilakukan.
  • API dapat mengakses lokasi memori lebih dari sekali sebagai bagian dari operasinya.

Catatan

Fungsi ini hanya menjamin bahwa persyaratan CPU untuk mengakses memori yang dipetakan karena memori perangkat dihormati. Jika perangkat tertentu memiliki persyaratan khusus sendiri untuk diakses, fungsi ini tidak boleh digunakan (dan sebagai gantinya, pengembang harus menerapkan fungsi aksesor mereka sendiri). Misalnya, fungsi ini tidak menjamin tentang ukuran akses memori yang dihasilkan (kecuali CPU itu sendiri memberlakukan persyaratan ini).

Catatan

Fungsi ini berfungsi pada semua versi Windows, bukan hanya yang terbaru. Anda perlu menggunakan SDK terbaru untuk mendapatkan deklarasi fungsi dari winbase.h header. Anda juga memerlukan pustaka (volatileaccessu.lib) dari SDK terbaru. Namun, biner yang dihasilkan akan berjalan dengan baik pada versi Windows yang lebih lama.

Contoh

// In this scenario we are setting data on memory mapped
// as "device memory" (i.e. memory not backed by RAM). On
// some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (i.e. a 4-byte
// load must be 4-byte aligned). Functions like memset, FillMemory,
// and even FillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use FillDeviceMemory.

FillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);

Persyaratan

Klien minimum yang didukung: Windows 11 Insider Preview Build TBD

Header: winbase.h (termasuk Winbase.h)

Pustaka mode kernel: volatileaccessk.lib

Pustaka mode pengguna: volatileaccessu.lib

Baca juga