Bagikan melalui


BypassIO untuk driver filter

Tentang BypassIO

Fitur BypassIO menawarkan jalur I/O yang dioptimalkan untuk membaca dari file. Tujuan dari jalur ini adalah untuk mengurangi overhead CPU dalam melakukan bacaan, yang membantu memenuhi tuntutan I/O untuk memuat dan menjalankan game generasi berikutnya di Windows. BypassIO adalah bagian dari infrastruktur untuk mendukung DirectStorage di Windows. Ini tersedia mulai dari Windows 11.

Penting bahwa minifilter menerapkan dukungan untuk BypassIO, dan Anda tetap mengaktifkan BypassIO sebanyak mungkin. Tanpa dukungan filter, performa game terdegradasi, mengakibatkan pengalaman bermain yang buruk bagi pengguna akhir.

Akan ada penggunaan aplikasi yang lebih luas di luar game dalam rilis Windows mendatang.

BypassIO adalah konsep per handel. Ketika BypassIO diminta, ini untuk handel file eksplisit. BypassIO tidak berpengaruh pada handel lain untuk file tersebut.

FSCTL_MANAGE_BYPASS_IO dan IOCTL_STORAGE_MANAGE_BYPASS_IO yang setara ditambahkan sebagai bagian dari infrastruktur ini. Minifilter memproses FSCTL_MANAGE_BYPASS_IO, sementara IOCTL_STORAGE_MANAGE_BYPASS_IO dikirim oleh sistem file ke tumpukan volume/penyimpanan. Kode kontrol ini dirancang agar dapat didiagnosis: keduanya mengembalikan identitas driver yang gagal permintaan BypassIO, dan alasan untuk mem-vetonya.

Halaman ini menyediakan detail arsitektur di seluruh filter sistem file dan tumpukan penyimpanan, dan informasi tentang cara mengimplementasikan BypassIO dalam driver minifilter. Lihat BypassIO untuk driver penyimpanan untuk informasi BypassIO yang khusus untuk driver penyimpanan.

Cakupan dukungan BypassIO

Mulai dari Windows 11, BypassIO didukung sebagai berikut:

  • Hanya pada sistem klien Windows. Dukungan sistem server akan ditambahkan dalam rilis mendatang.

  • Hanya pada perangkat penyimpanan NVMe. Dukungan untuk teknologi penyimpanan lainnya akan ditambahkan dalam rilis mendatang.

  • Pada sistem file NTFS saja. Dukungan untuk sistem file lain akan ditambahkan dalam rilis mendatang.

  • Hanya bacaan yang tidak di-cache yang didukung. Dukungan untuk tulisan non-cache akan ditambahkan dalam rilis mendatang.

  • Hanya didukung pada file (tidak didukung pada handel direktori atau volume).

Cara kerja BypassIO

Ketika NtReadFile dipanggil pada FileHandle dengan dukungan BypassIO, operasi biasanya tidak mengalir melalui tumpukan I/O tradisional, yang melintasi seluruh tumpukan sistem file, tumpukan volume, dan tumpukan penyimpanan. Sebagai gantinya, operasi mengalir langsung dari manajer I/O ke sistem file (NTFS), lalu ke driver disk (classpnp), lalu ke driver StorNVMe. Dengan FileHandle yang mendukung BypassIO sepenuhnya:

  • Semua filter sistem file dilewati.
  • Semua filter tumpukan volume dilewati.
  • Semua filter tumpukan penyimpanan dan driver di atas driver disk, dan antara disk dan driver StorNVMe, dilewati.

Dalam skenario di mana tumpukan filter sistem file mendukung BypassIO tetapi volume dan/atau tumpukan penyimpanan tidak:

  • Membaca IO melewati tumpukan filter.
  • IO baca masih dikirim melalui volume dan/atau tumpukan penyimpanan.

Tingkat dukungan ini dikenal sebagai BypassIO parsial.

Gambar yang menunjukkan jalur I O tradisional untuk permintaan baca.

Gambar yang memperlihatkan jalur Bypass I O untuk permintaan baca.

Perubahan dan penambahan DDI untuk BypassIO

DDI berikut yang relevan dengan driver filter ditambahkan untuk memberikan dukungan BypassIO:

  • Fungsi FltVetoBypassIo
  • enumerator FS_BPIO_INFLAGS
  • struktur FS_BPIO_INFO
  • struktur FS_BPIO_INPUT
  • enumerator FS_BPIO_OPERATIONS
  • enumerator FS_BPIO_OUTFLAGS
  • struktur FS_BPIO_OUTPUT
  • struktur FS_BPIO_RESULTS
  • kode kontrol FSCTL_MANAGE_BYPASS_IO
  • Fungsi FsRtlGetBypassIoOpenCount

Selain itu, DDI berikut diubah untuk mendukung BypassIO:

  • Bidang BypassIoOpenCount ditambahkan ke struktur FSRTL_ADVANCED_FCB_HEADER . Sistem file menggunakan bidang ini untuk mempertahankan jumlah FileObjects unik pada aliran yang saat ini mengaktifkan BypassIO. Penambahan bidang ini meningkatkan ukuran struktur. Versi struktur yang akan digunakan mulai windows 11 FSRTL_FCB_HEADER_V4.

Efek operasi lain pada handel berkemampuan BypassIO

Mengaktifkan BypassIO pada handel tidak memengaruhi handel lain. Namun, operasi lain pada handel dengan dukungan BypassIO memengaruhi penggunaan BypassIO, seperti dalam skenario berikut:

  • Jika Anda memiliki Handle A yang terbuka ke file tempat BypassIO diaktifkan dan berfungsi, dan seseorang (misalnya, utas atau proses lain) membuka Handle B untuk melakukan cache atau memori yang dipetakan IO, maka BypassIO ditangguhkan sementara pada Handle A hingga Handle B ditutup. Sistem sebaliknya menggunakan jalur I/O tradisional untuk menjamin bahwa data basi tidak terjadi. Sistem terus menggunakan jalur I/O tradisional pada handel tersebut hingga semua bagian data dan peta cache dirusak. Akibatnya, filter harus menutup file handel sebelum BypassIO dapat dilanjutkan.

  • Jika file berkemampuan BypassIO ditandai sparse, semua operasi BypassIO mulai menggunakan jalur I/O tradisional.

  • Defragging file yang didukung BypassIO menyebabkan semua operasi BypassIO menggunakan jalur I/O tradisional. Setelah defragging selesai, sistem beralih kembali ke jalur BypassIO pada handel tersebut.

Menerapkan dukungan BypassIO di minifilter

Memperbarui file INF atau MANIFEST Anda

Mulai Windows 11, pengembang filter harus menambahkan SUPPORTED_FS_FEATURES_BYPASS_IO ke SupportedFeatures di file INF atau MANIFEST driver Anda. (Anda dapat mengetikkan fltmc instances prompt perintah yang ditingkatkan untuk melihat nilai "SprtFtrs" untuk semua filter aktif.)

Catatan

Filter yang tidak pernah dapat mendukung BypassIO masih harus menambahkan SUPPORTED_FS_FEATURES_BYPASS_IO ke status SupportedFeatures, lalu mem-veto dengan tepat di dalam filter, menentukan alasannya.

Minifilter didorong untuk meminimalkan veto bypassIO sebanyak mungkin.

Jika minifilter melekat pada volume tempat BypassIO diaktifkan, tetapi minifilter tersebut belum memperbarui pengaturan SupportedFeatures-nya untuk menyertakan SUPPORTED_FS_FEATURES_BYPASS_IO, semua operasi BypassIO pada volume tersebut segera diblokir, jatuh kembali ke jalur I/O tradisional, yang mengakibatkan performa game yang terdegradasi.

Minifilter yang tidak memfilter IRP_MJ_READ atau IRP_MJ_WRITE secara otomatis ikut serta dalam dukungan BypassIO, seolah-olah mereka telah menambahkan SUPPORTED_FS_FEATURES_BYPASS_IO di SupportedFeatures.

Operasi FS_BPIO_OP_ENABLE dan FS_BPIO_OP_QUERY gagal pada tumpukan jika ada minifilter terlampir yang tidak ikut serta.

Menerapkan dukungan untuk permintaan BypassIO

Minifilter harus menambahkan dukungan untuk permintaan BypassIO, yang dikirim melalui kode kontrol FSCTL_MANAGE_BYPASS_IO . Lihat Operasi BypassIO Pendukung untuk detailnya.

Menentukan apakah BypassIO berfungsi

Perintah fsutil tambahan mengeluarkan FSCTL_MANAGE_BYPASS_IO menentukan operasi FS_BPIO_OP_QUERY. Hasil yang ditampilkan mengidentifikasi driver pertama yang mencegah BypassIO dan alasan mengapa.

> fsutil bypassIo state /v <path>

Di mana <jalur> dapat berupa volume, direktori, atau nama file tertentu, dan /v adalah bendera verbose opsional.

Dalam contoh pertama ini, katakanlah minifilter WOF belum memilih bypassIO. Menjalankan perintah fsutil bypassIo state c:\ menghasilkan output berikut:

BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.

Dalam contoh kedua ini, menjalankan fsutil bypassIO state /v c:\ pada sistem di mana BitLocker diaktifkan menghasilkan output berikut:

BypassIo on "c:\" is partially supported
    Volume stack bypass is disabled (fvevol.sys)
      Status:  495 (The specified operation is not supported while encryption is enabled on the target object)
      Reason:  BitLocker Drive Encryption is enabled.
    Storage Type:   NVMe
    Storage Driver: BypassIo compatible
    Driver Name:    stornvme.sys

Perilaku khusus NTFS

BypassIO dapat diaktifkan pada file penduduk NTFS; namun, file mengambil jalur I/O tradisional selama itu adalah residen. Jika penulisan terjadi pada file sedih sehingga menjadi tidak dikenal, sistem beralih untuk menggunakan jalur BypassIO.

Pemadatan NTFS tidak dapat diaktifkan pada file aktif BypassIO.

Enkripsi NTFS dapat diaktifkan pada file aktif BypassIO. BypassIO dijeda.

BypassIO tidak memengaruhi operasi baca/tulis offload.