(wdm.h) RtlFillDeviceMemory 函式
例如,RtlFillDeviceMemory 函式會提供 RtlFillVolatileMemory 行為 (例如,在開發人員需要額外確定存取裝置記憶體時,不會干擾編譯程式優化) 設定緩衝區的內容。
語法
volatile void * RtlFillDeviceMemory(
[out] volatile void *Destination,
[in] size_t Length,
[in] int Fill
);
參數
[out] Destination
要填滿之內存區塊起始位址的指標。
[in] Length
要填入的記憶體區塊大小,以位元組為單位。 此值必須小於 Destination 緩衝區的大小。
[in] Fill
要填入記憶體區塊的位元組值。
傳回值
傳回 Destination 的值。
備註
函式無法辨識為編譯程式內部函數,因此編譯程式永遠不會完全優化呼叫 (,或將呼叫取代為) 的對等指令序列。 這與 RtlFillMemory 不同,這受限於各種編譯程序優化。
呼叫完成時,會以所需的值覆寫緩衝區。 例如,此函式記憶體存取 目的地 只會在函式內執行 (,編譯程式無法將記憶體存取移出此函式) 。
只有在 CPU 支援裝置記憶體上的未對齊記憶體存取時,函式才能執行未對齊的記憶體存取。 如果 CPU 不支援未對齊的裝置記憶體存取,則只會執行對齊的存取。
函式可能會在其作業中多次存取記憶體位置。
注意
此函式只會保證會遵守 CPU 存取對應為裝置記憶體的記憶體需求。 如果特定裝置有自己的存取特定需求,則不應該 (使用此函式,而是開發人員必須實作自己的存取子函式) 。 例如,除非 CPU 本身強制執行這些) 需求,否則此函式不保證 (產生的記憶體存取大小。
注意
此函式適用於所有版本的 Windows,而不只是最新版本。 您需要使用最新的 WDK,才能從 wdm.h 標頭取得函式宣告。 您也需要來自最新 WDK 的連結庫 (volatileaccessk.lib) 。 不過,產生的驅動程式會在舊版 Windows 上正常執行。
範例
// In this scenario we are setting data on memory mapped
// as "device memory" (for example, memory not backed by RAM).
// On some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (for example, a 4-byte
// load must be 4-byte aligned). Functions like memset, RtlFillMemory,
// and even RtlFillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use RtlFillDeviceMemory.
RtlFillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);
規格需求
需求 | 值 |
---|---|
標頭 | wdm.h (包含 Wdm.h) |
程式庫 | volatileaccessk.lib (核心模式) 、volatileaccessu.lib (使用者模式) |