2017-12-24 16 views
0

Sag mal, wenn ich eine große Datei, die ich in den virtuellen Adressraum meines Prozesslandkarte als solche:Klärung, wie virtuelle Speichermanager in Windows holt Speicher gemappt Dateidaten

//Error handling is omitted for brevity 
HANDLE hFile = CreateFile(L"path-to\\file", 
      GENERIC_READ, 
      FILE_SHARE_READ, NULL, OPEN_EXISTING, 
      FILE_ATTRIBUTE_NORMAL, NULL); 
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); 
char* pAddress = (char*)MapViewOfFile(hFileMapping, 
      FILE_MAP_READ, 0, 0, 0); 

//And get the data 
char data_byte = pAddress[offset]; 

//Then remember to do the cleanup .... 

Wann wird die virtuelle Kernel Speichermanager lasen die aktuellen Daten aus der Datei auf der Festplatte (oder führen die I/O-Operation die Daten von der Festplatte zu holen):

A) Wenn MapViewOfFile genannt wird, oder

B), wenn I zugreifen es mit pAddress[offset]?

Und eine zweite Frage, ob die Antwort oben B ist - wenn er holt sich die Daten:

C) Ist es die gesamte Datei lesen oder

D) Nur die Umgreifen Seite (4K Größe, oder so)?

+3

Antwort - B und D – RbMm

Antwort

3

B und D

wenn Sie MapViewOfFile (ZwMapViewOfSection) kernel Reserve Bereich von für virtuell nennen, aber nicht mit realen physischen Seiten zuordnen (also nicht physische Seiten zuordnen beginnen). Wenn Sie zum ersten Mal auf eine Adresse in der Abschnittsansicht zugreifen - weil sie noch nicht mit der physischen Seite verknüpft ist (PTE nicht gültig) - wird die Ausnahme von der CPU generiert. Während das System diese Ausnahme handhabt, weist es bereits eine physische Seite zu, verknüpft die virtuelle Adresse mit dieser Seite, liest Daten aus der Datei ein (wenn Abschnitt durch Datei gesichert wird) und setzt die Ausführung von der Anweisung fort, die eine Ausnahme erzeugt.

so System nicht nur Daten aus Datei lesen, wenn Sie es im Speicher zuordnen, aber warten Sie, bis Ihr erster Zugriff darauf. und beim ersten Zugriff - es gelesen Daten nicht ganzen Abschnitt Bereich (Abschnitt kann nicht von Anfang und Ende der Datei nicht am Ende der Datei beginnen) aber nur zugegriffen Seite (kann mehrere Seiten sein)

+0

Die 'ETHREAD' structure hat einige Werte, die möglicherweise beeinflussen, wie viele Seiten beim Behandeln eines Seitenfehlers als Cluster eingelesen werden: 'DisablePageFaultClustering' (Standardwert ist false) und' ReadClusterSize' (Standardwert ist 7). Es scheint zu funktionieren wie erwartet. Ich habe 'ReadClusterSize' für einen Thread auf 3 gesetzt und auf eine zugeordnete Datendatei zugreifen lassen. In einem lokalen Kernel-Debugger konnte ich sehen, dass nach dem Laden von zwei sequentiellen Seiten die nächsten 'ReadClusterSize - 1'-Seiten bereits gültig waren. – eryksun

Verwandte Themen