/ / Какви ограничения за персонализираното управление на паметта има в win32? windows, api, winapi, памет, монтаж

Какви ограничения за персонализираното управление на паметта има в win32? windows, api, winapi, памет, монтаж

Така адресното пространство в паметта в 32-битова програма е 4 гигабайта. Съответно, в 64-битово приложение, има ~ 18 екзабайта адресируемо пространство.

Приложният програмен интерфейс kernel32.dll има разнообразни методи относно купчината и / или паметта на програмата.

Така че моето сегашно разбиране е, че напримерако се обадите на HeapAlloc и го предадете на паметта, която трябва да разпределите, тя ще върне указател на адреса на това разпределено място в паметта ... (Моля, поправете ме, ако греша тук.)

Сега предимството на използването на функциите win32-api за това очевидно е, че Windows знае най-добре къде е пуснал други компоненти като заредени DLL. Ето защо питам ...

Има ли фиксирана позиция в паметта за DLL файлове. Мисля, че прочетох някъде, че за 32-битова често е горната половина на паметта (0x80000000 и нагоре), но дори и да е вярно, каква би била позицията за 64-битовите приложения?

Също така, не е ли възможно просто да използвате показалеца на някаква памет свободно, без Windows да я разпредели първо? Какви ще бъдат страничните ефекти?

Аз съм полу-нови по този въпрос, така че всяка помощ или съвети са оценени! =)

Отговори:

6 за отговор № 1

Също така, не е ли възможно просто да използвате показалеца на някаква памет свободно, без Windows да я разпредели първо? Какви ще бъдат страничните ефекти?

Нежеланите реакции са прости: приложението ви ще се срине.

Windows (и всяка друга нормална операционна система) използва виртуалнипамет: операционната система извежда физическата памет във виртуалното адресно пространство, което ви вижда процесът. И изпълнява това картографиране при поискване: когато го поискате да разпредели пакет от памет, той картографира съответния диапазон от адреси на виртуална памет към валидна памет.

Писането на произволен адрес означава, че ще ударите страница с памет, която не е била онагледена от операционната система, към която и да е поддържаща памет. След това ще получите нарушение на достъпа (или грешка при сегментиране на * nix)

Има ли фиксирана позиция в паметта за DLL файлове

Не. Как може да има? Ако имаше един DLL файл, може да се направи. Какво ще стане, ако приложението ви зареди две DLL файлове? Какво ще стане, ако зареди 40? 400? И всеки DLL има различен размер, така че ако те са заредени на фиксирани места, те може да се окажат припокриващи се.

Освен това, последните версии на Windows изпълняват случайно разпознаване на адресно пространство: за да смекчи някои проблеми със сигурността, Windows се опитва да гарантира, че зарежда DLL и изпълними файлове различен местоположения, ако стартирате приложението няколко пъти.

Накратко: процесът ви работи под Windows. Той е гражданин на Windows и трябва да се подчинява на законите на Windows. Ако се нуждае от достъп до ресурс (включително, но не само, памет), той трябва да поиска от Windows да направи този ресурс достъпен.