Windows-та виртуальді жадымен жұмыс істеу

ЖОСПАР

1. Процестің виртуальді жадының күйі
2. Виртуальді жадыны босату және үлестіру, резервтеу.
3. Нақты жадыда виртуаль беттердің бұғатталуы
4. Виртуальді бетке қатынаудың атрибуттарын өзгерту
5. Процесс беттерінің жұмысты жиынын басқару
6. Виртуальді жадының блоктарын көшіру және инициализациялау
7. Жады күйін анықтау
8. Басқа процесте виртуальді жадымен жұмыс
Процестің виртуальді жадының күйі
Windows-та процестің сызықты адресі 32 биттен тұрады және 0х00000000-дан 0XFFFFFFFF-ке дейін аралығында өзгереді. Бұл теориялық түрде процеске 4 Гбайт логикалық жадыға қатынауға рұқсат береді. Windows NT операциялық жүйелерінде 0x00000000-дан 0x7FFFFFFF дейін адрестер диапазонымен бұл жадының екі кіші гигабайты процеске қатынай алады, 0x80000000-ден 0xFFFFFFFF дейінгі адрестер диапазонында екі үлкен гигабайт жүйемен қолданылады. Windows 98 операциялық жүйесінде процеске 2 Гбайт жады қатынауға болатын, операциялық жүйе көрсеткіштер арқылы мәндерді меншіктеуді тексеру үшін 0x00000000-дан 0x0000FFFF-ке дейінгі адрестер диапазонымен жадының тағы 64 кбайт пайдаланады, ескі MS-DOS және Windows 3.1 операциялық жүйелер сәйкестігін қолдау үшін олардың мәндері NULL-ге инициализацияланған.
Windows операциялық жүйелерінде процестің виртуальді адресі сол процестің сызықты адресінен тек сызықты адрестің биттер интерпретациясымен ерекшеленеді.Сондықтан, Windows-ғы әрбір процеске виртуальді жадының екі гигабайтына қатынай алады. Бұл процесс барлық жадыны біруақытта пайдаланады деп айтуға болмайды. Процеске қатынай алатын виртуальді жадының саны физикалық жадының және дискілердің көлеміне байланысты. Виртуальді жадыны қолдануда процесті шектеу үшін биттер кестесінде кейбір биттер мүмкіндікті емес болып белгіленуі мүмкін.
Бұл ескертпелерден кейін процестің виртуальді жадының күйін баяндауға көшеміз. Процестің көз-қарасымен қарағанда виртуальді жадының беттер үш күйдің біреуінде болуы мүмкін:
□ пайдалану үшін бос (free);
□ пайдалану үшін процеске үлестірілген (committed).
□ резервтелген,бірақ процеспен пайдаланылмайды (reserved);
Бұл күйлерді аңығырақ баяндайық. Бастапқыда, процесті іске қосқанда, виртуальді жадының барлық беттері бос болып есептелінеді, программаның өзі жүктелген беттерден басқа. Барлық модульдердің жүктеу адрестерін программаны жөндеу кезінде Visual C++ құру ортасында Debug/Modules меню пунктінде таңдап құруға болады. Виртуальді жадының бос немесе резервтелген беттерін пайдалануға үлестіру үшін процесс VirtualAlloc функциясын шақыру қажет. Бұл функцияның сәтті аяқталуынан кейін процесс оған үлестірілген виртуальді жадыны пайдалана алады.Үшінші күйі виртуальді беттерді резервтелген деп сипаттайды. Бұл виртуальді беттерді ары қарай қолдану үшін процеспен резервтелген және олардың адресін процеспен нақты емес көрсетусіз пайдалану үшін жүйемен берілмейді. Айтып кететін жәйт, виртуальді беттерді резервтеу кезінде нақты жады бұл беттерге бөлінбейді.

Виртуальді жадыны босату және үлестіру, резервтеу.
Виртуальді жадының облысын резервтеу және үлестіру үшін процесс VirtualAlloc функциясын шақыру қажет, ол келесі прототипке ие:
LPVOID VirtualAlloc(
LPVOID lpAddress, // резервтеу және үлестіру үшін облыс
SIZE_T dwSize, // облыс өлшемі
DWORD flAllocationType, // үлестіру типі
DWORD flProtect // қатынауды қорғау типі
) ;
Сәтті аяқталу кезінде бұл функция процеспен үлестірілген немесе резервтелген виртуаль жадының адресін қайтарады, ал сәтсіз аяқтау кезінде кезінде - NULL қайтарады.Мұнда айтып кетейік, егер виртуальді жадыны VirtualAlloc функциясымен үлестіру сәтті аяқталса, онда бөлінген жады автоматты түрде нөльдермен инициализацияланады. Бұл функцияның параметрлерінің тағайындалуын баяндайық.
lpAddress параметрі шақыртылатын программамен орнатылады және резервтеу немесе үлестіргісі келген процесс, виртуальді жадының бастапқы адресін жүйеге көрсетеді.Бұл адрес алдыңда резервтелген және бос виртуальді жадыны көрсетеді. Бұл адресті орнату кезінде келесі жағдайларды айырады:
 виртуальді жадыны резервтеу кезінде бұл адрес жүйемен шекараға дейін 64 Кбайтқа тегістеледі, ол көрсетілген адреске сай келеді;
 алдыңда резервтелген облыстан виртуальді жадыны үлестіру жағдайда, адресі бар виртуальді беттің шекарасына дейін бұл адрес операциялық жүйемен дөңгелектенеді.
 егер IpAddress параметрі Null-ге тең болса, операциялық жүйе виртуальді жадының бастапқы адресін өзі өзгертеді.
dwSize параметрі шақыртылатын программамен орнатылады және үлестіретін немесе резервтелген облысында виртуальді жадының өлшемін байттармен көрсетеді; Егер IpAddress параметрі Null-ге тең болса, онда жүйе бұл шаманы виртуальді беттің үлкен жағына қарай еселеген өлшемге дейін дөңгелектейді. Егер жады нақты адрестер бойынша үлестірілсе, онда бұл жады IpAddress-тен IpAddress+ dwSize диапазонынан байттары бар барлық беттерінен тұрады.
flAllocationType параметрі программамен орнатылады және VirtualAlloc функция орындайтын операция типіне көрсетеді. Бұл параметрдің мәні болып келесі жалаушалардың кез-келген құрамасы болуы мүмкін:
 MEM_COMMIT – программада жадыны үлестіру;
 MEM_RESERVE – физикалық жадының облысын резервтеу;
WINDOWS NT/2000 операциялық жүйесінде бұл параметрде келесі жалаушалар орнатылуы мүмкін:
 MEM_RESET – жады уақытша қолданылмайды;
 MEM_TOP_DOWN – бос адрестердің үлкенінен бастап жадыны үлестіру. Сонымен бірге, WINDOWS 98 операциялық жүйесінде жалауша орнатылу мүмкін:
 MEM_WRITE_WATCH – жазу жүргізілген виртуальді беттердің адрестерін сақтау.
        
        Windows-та виртуальді жадымен жұмыс істеу
ЖОСПАР
* Процестің виртуальді жадының күйі
* Виртуальді жадыны босату және үлестіру, резервтеу.
* Нақты жадыда ... ... ... Виртуальді бетке қатынаудың атрибуттарын өзгерту
* Процесс беттерінің жұмысты жиынын басқару
* ... ... ... ... және ... Жады күйін анықтау
* Басқа процесте виртуальді жадымен жұмыс
Процестің виртуальді жадының күйі
Windows-та процестің сызықты адресі 32 ... ... және ... ... ... ... өзгереді. Бұл теориялық түрде процеске 4 Гбайт логикалық жадыға қатынауға ... ... Windows NT ... ... ... 0x7FFFFFFF дейін адрестер диапазонымен бұл жадының екі кіші гигабайты процеске қатынай алады, 0x80000000-ден 0xFFFFFFFF дейінгі адрестер диапазонында екі үлкен ... ... ... Windows 98 операциялық жүйесінде процеске 2 Гбайт жады қатынауға болатын, операциялық жүйе көрсеткіштер арқылы мәндерді ... ... үшін ... 0x0000FFFF-ке дейінгі адрестер диапазонымен жадының тағы 64 кбайт пайдаланады, ескі MS-DOS және Windows 3.1 операциялық жүйелер ... ... үшін ... ... ... ... ... жүйелерінде процестің виртуальді адресі сол процестің сызықты ... тек ... ... ... ... ... ... әрбір процеске виртуальді жадының екі гигабайтына қатынай алады. Бұл процесс барлық жадыны біруақытта пайдаланады деп айтуға болмайды. Процеске қатынай алатын ... ... саны ... ... және ... көлеміне байланысты. Виртуальді жадыны қолдануда процесті шектеу үшін биттер кестесінде кейбір биттер мүмкіндікті емес ... ... ... ... ... ... ... жадының күйін баяндауға көшеміз. Процестің көз-қарасымен қарағанда виртуальді жадының беттер үш күйдің біреуінде ... ... ... үшін бос (free);
* пайдалану үшін процеске үлестірілген (committed).
* ... ... ... (reserved);
Бұл күйлерді аңығырақ баяндайық. Бастапқыда, процесті іске қосқанда, виртуальді ... ... ... бос ... ... ... өзі ... беттерден басқа. Барлық модульдердің жүктеу адрестерін программаны жөндеу кезінде Visual C++ құру ... ... меню ... ... құруға болады. Виртуальді жадының бос немесе резервтелген беттерін пайдалануға үлестіру үшін ... ... ... ... ... Бұл ... ... аяқталуынан кейін процесс оған үлестірілген виртуальді жадыны пайдалана алады.Үшінші күйі виртуальді беттерді резервтелген деп сипаттайды. Бұл виртуальді ... ары ... ... үшін ... резервтелген және олардың адресін процеспен нақты емес ... ... үшін ... берілмейді. Айтып кететін жәйт, виртуальді беттерді резервтеу кезінде нақты жады бұл ... ... ... ... және үлестіру, резервтеу.
Виртуальді жадының облысын резервтеу және ... үшін ... ... ... ... ... ол ... прототипке ие:
LPVOID VirtualAlloc(
LPVOID lpAddress, // резервтеу және үлестіру үшін облысSIZE_T ... ... ... ... // ... ... ... қатынауды қорғау типі
) ;
Сәтті аяқталу кезінде бұл функция процеспен үлестірілген немесе резервтелген виртуаль жадының адресін қайтарады, ал сәтсіз аяқтау ... ... - NULL ... ... кетейік, егер виртуальді жадыны VirtualAlloc функциясымен үлестіру сәтті аяқталса, онда бөлінген жады ... ... ... ... Бұл функцияның параметрлерінің тағайындалуын баяндайық.
lpAddress параметрі шақыртылатын ... ... және ... немесе үлестіргісі келген процесс, виртуальді жадының бастапқы адресін жүйеге көрсетеді.Бұл адрес алдыңда ... және бос ... ... ... Бұл ... орнату кезінде келесі жағдайларды айырады:
* виртуальді жадыны резервтеу ... бұл ... ... ... ... 64 ... ... ол көрсетілген адреске сай келеді;
* алдыңда резервтелген облыстан виртуальді жадыны үлестіру жағдайда, адресі бар виртуальді ... ... ... бұл ... ... ... ... егер IpAddress параметрі Null-ге тең болса, операциялық жүйе виртуальді жадының бастапқы адресін өзі ... ... ... программамен орнатылады және үлестіретін немесе резервтелген облысында виртуальді жадының өлшемін байттармен көрсетеді; Егер IpAddress параметрі Null-ге тең ... онда жүйе бұл ... ... ... үлкен жағына қарай еселеген өлшемге дейін дөңгелектейді. Егер жады нақты адрестер ... ... онда бұл жады ... ... dwSize ... ... бар ... беттерінен тұрады.
flAllocationType параметрі программамен орнатылады және VirtualAlloc функция орындайтын операция типіне көрсетеді. Бұл ... мәні ... ... жалаушалардың кез-келген құрамасы болуы мүмкін:
* MEM_COMMIT - программада жадыны үлестіру;
* MEM_RESERVE - физикалық жадының ... ... NT/2000 ... жүйесінде бұл параметрде келесі жалаушалар орнатылуы мүмкін:
- MEM_RESET - жады уақытша қолданылмайды;
- MEM_TOP_DOWN - бос ... ... ... ... ... ... бірге, Windows 98 операциялық жүйесінде жалауша орнатылу мүмкін:
- MEM_WRITE_WATCH - жазу ... ... ... ... сақтау.
Кейін бұл беттердің адрестерін GetWriteWatch функциясын шақыру арқылы ... ... ... ... ... ... ... функциясы көмегімен алуға болады. Бұл функцияларды қолдану тек Windows 98 ... ... ... ... ... біз ... ... қарастырмаймыз.
flProtect параметрі виртуальді жадының облысында қатынау атрибуттарын орнатады, олар ... ... ... тек ... ... ... ... береді. Бұл параметр келесі жалаушалардың құрамасы болуы мүмкін:
- RAGE_READONLY - виртуальді беттерді тек оқуға рұқсат етеді;
- RAGE_READWRITE - ... ... ... және ... ... ... ... - виртуальді беттерде кодтың орындалуына және оқуына рұқсат етеді;
- ... - ... ... ... ... ... - ... беттерді КЭШ-ке орналастыруға міндетті емес.
Атап кетейік, кодты тек орындату үшін арналған (RAGE_EXECUTE жалаушасы) бетке жазуға ... ... ... ... ... қате ... (access ... Бұл қате виртуальді бетке кез-келген қатынас құруда пайда болады, ол RAGE_NOACCESS жалаушасымен белгіленеді.
Windows NT/2000 операциялық жүйесінде flProtect параметрінде ... ... ... ... - ... ... бұл ... орнатылса және бетке үндеу жүргізілсе, оқу немес жазу, бәрібір, жүйе бұл жалаушаны босатады және 0x80000001 коды бар EXCEPTION_GUARD_PAGE типті ... ... ... ... ... ... бөлу керек болса, бұл жалауша пайдаланады.Мысалы, кейбір ... ... ... ... қолданылатын облыстың соңғы виртуальді беті үшін бұл жалаушаны орнатыға болады. Онда бұл бетке қатынауға әрекет жасаған кезде ... ... және ... үшін ... жады ... ... ... Сонымен бірге, PAGE_GUARD жалаушасы RAGE_NOACCESS жалаушасымен сәйкес пайдалана алмайды.
Виртуальді жадымен жұмыс аяқталғаннан кейін, VirtualFree функциясын пайдаланып оны босату қажет, ол ... ... ... VirtualFree (
lpvoid lpAddress, // виртуальді жады ... ... ... ... ... ... // операция типі
);
Сәтті аяқталу кезінде бұл функция ... емес мән ... ал ... аяқтау кезінде кезінде - False қайтарады. Бұл функцияның параметрлерін баяндау соңғы параметрден бастайық, өйткені оның мәндері алғашқы екі параметрді ... ... ... әсер ... параметрі келесі екі жалаушалардың кез-келген құрамасын қабылдау мүмкін:
- MEM_DECOMMIT - ... ... ... ... ... - ... ... босату.
Егер MEM_DECOMMIT жалаушасы пайдаланса, онда жады босатылмайды, резервтелген күйде қалады. Резервтелген виртуальді жадыны босату үшін, MEM_RELEASE жалаушасын ... ... ... бұл ... мәнін орнатуға байланысты VirtualFree функциясымен жұмыс істейтін жады облысының күйіне сәйкес болуы қажеттілігін атап кету қажет.
IpAddress параметрі ... ... ... көрсету қажет, ол үшін үлестіруді немесе босатуды болдыртпау керек. Егер dwFreeType параметрінде MEM_RELEASE жалаушасы орнатылса, онда бұл ... ... ... ... ... ... келу қажет.
dwSize параметрі үлестіруді болдыртпауды қажет ететін, виртуальді жадының облысының өлшемін ... ... ... ... ... жалаушасы орнатылса, онда dwSize параметрінің мәні нөльге тең болу керек.
Енді, VirtualAlloc және VirtualFree ... ... ... мысалдарға көшейік. Алдымен, 21.1-листингтегі программаны қарастырайық, ол виртуальді жады облысын бүтін сандар массивіне үлестіреді, содан кейін оны босатады. Бұл ... бір ... ... атап өтейік. Виртуальді жады облысын лезде үлестіру үшін, ... ... ... Null ... ... ... Бұл жағдайда виртуальді жады облысының бастапқы адресін процеске үлестіру үшін жүйе өзі анықтайды. Нақты виртуаль адрес бойынша жадыны ... ... ... ... ... виртуальді жады облысын нақты адрес бойынша қалай үлестіруге болатыны ... Атап ... бұл ... ... ... мәні MEM_RESERVE және MEM_COMMIT жалаушаларының құрамасы ретінде орнатылу қажет. Яғни, жадыны нақты адрес бойынша үлестіру кезінде бұл жады алдын-ала резервтелу ... ол ... ... бір ... ... ... ... адрес бойынша виртуальді адресті үлестіру.
21.2-листингтегі программада бір кезге көңіл ... Біз ... ... ... адресін 0x00890002 орнатсақ та, жүйе оны бәрібір виртуальді беттің жақын төменгі шекараға дейін, яғни 0x00890000 дейін теңістіреді.
Енді жадыны екі кезеңге ... ... ... ... ... ... ал ... кейін бұл виртуаль жадының қайсібір бөлігін үлестіреміз. Қалай ол ... - ... ... ... Бұл программада VirtualFree функциясы виртуаль жады облысының үлестіруін орындатпау үшін де ... ... ... үлестіруі және резервтелуі.
Бұл тараудың қорытындысында, 21.4-листингтегі программаны қарастырайық, ол бетті қорғау күйіне орнатады. Бұл бетке бірінші қатынас құруда жүйе PAGE_GUARD ... ... және ... ... ... ... күйі өзгермейді. Бетке қайталап қатынау қарапайым түрде жүргізіледі, яғни ешқандай шығару генерирленбейді. Атап өтейік, үлестірілген виртуаль жадының бастапқы күйі нөльдермен ... ... ... бұл кодтың тек Windows 2000 операциялық жүйесінде жұмыс істейтінін атап кетейік.
21.4-листинг.Виртуаль жадының қорғалынатын бетіне қатынас ... ... ... ... ... виртуаль жадының қайсібір облысы процеспен жиі пайдаланса, онда жүйеге нақты жадыдан бұл виртуальді ... ... ... тыйым салуға болады, басқаша айтқанда, нақты жадыда бұл виртуальді беттерді жабады және бұғаттайды. Бұл үшін VirtualLock функциясын қолдану қажет, ол ... ... ... ... ... lpAddress, // облыс адресі
SIZE_T dwSize // облыс өлшемі
) ;
Сәтті аяқталу ... бұл ... ... емес мән ... ал ... ... кезінде кезінде - False қайтарады. IpAddress және dwSize параметрлері сәйкесінше нақты жадыда жабылатын базалық адресті және облыс өлшемін ... Атап ... ... ... ... дейінгі адрестер диапазоны бар барлық виртуаль беттер нақты жадыда жабылады. Мұнда нақты ... ... ... ... ... ... жабуға болмайды, яғни олар үшін PAGE_NOACCESS жалауша орнатылады. Сонымен бірге, операциялық жүйе нақты жадыда процеске лезде 30 виртуаль ... аса ... ... бермейді.
Нақты жадыда виртуальді беттерді бұғаттауды болдыртпау үшін VirtualUnlock функциясы қолданылады, ло келесі прототипке ие:
BOOL VirtualUnlock(
LPVOID ... ... ... ... ... ... ;
Сәтті аяқталу кезінде бұл функция нөльдік емес мән ... ал ... ... ... кезінде - False қайтарады. Бұл функцияның параметрлері VirtualLock функциясының параметрлері сияқты мәндері бар. Мұнда VirtualUnLock функциясын шақыртқанға дейін ... ... ... дейінгі адрестер диапазоны алдын-ала VirtualLock функциясымен бұғатталу қажет. Егер бұл шарт ... онда ... жүйе ... беттерінің жұмыс жиынынан беттер босатылады.Айтып кетейік, VirtualLock және VirtualUnLock функциялары тек Windows NT/2000 ... ... ... ... 21.5-листингте виртуальді жадыда беттерді бұғаттайтын, ал содан кейін босататын программа келтірілген.
21.5-листинг. Виртуальді беттерді бұғаттау және босату.
Виртуальді ... ... ... ... ... ... ... атрибуттарын өзгерту VirtualProject функциясымен шақыртады, ол келесі прототипке ие:
BOOL ... ... ... жады облысының адресі
SIZE Т dwSize, // жады ... ... ... ... жаңа ... жалаушалары
PDWORD lpflOldProtect// қатынаудың ескі атрибуттарына көрсеткіш
) ;
Сәтті аяқталу кезінде бұл функция мән қайтарады, ал сәтсіз ... ... ... - False ... Бұл функцияның параметрі VirtualAlloc функциясымен виртуаль жадыны үлестіру кезінде сол ... ие ... Тек бір ... бар, қатынаудың ескі атрибуттары VirtualProject функциясымен lpfloadProject адресі бойынша қайтарылады, оны шақыртатын программа орнату қажет.
21.6-листингте виртуальді бетке қатынауға атрибуттарды ... ... ... ол ... ... ... ғана емес ... да рұқсат береді.
21.6-листинг. Процестің виртуаль беттерінің жұмысты ... ... және оқу. ... ... ... ... ... жұмысты жиынына кіретін беттер санын білу үшін GetProcessWorkingSetSize функциясын шақырту арқылы білуге болады, ол келесі прототипке ие:
BOOL ... ... ... ... ... // жұмысты жиынның мин. ... ... ... // ... ... ... ... ;
Сәтті аяқталу кезінде бұл функция нөльдік емес мән ... ал ... ... кезінде кезінде - False қайтарады. Бұл функцияны шақыртқанда hProcess ... ... ... ... ... ол үшін біз ... ... жиын диапазонын білуіміз қажет. GetProcessWorkingSetSize функциясының сәтті ... ... ... және ... ... ... адрестер бойынша қайтарады,сәйкесінше процестің жұмысты жиынның минимальді және максимальді өлшемдері байттармен берілген. Процестің жұмысы кезінде виртуаль жадының менеджері бұл диапазонда ... ... ... ... ... қолдайды. Процесс беттерінің жұмысты жиынның минимальді және максимальді ... ... ... ... арқылы өзгертуге болады, ол келесі прототипке ие:
SetProcessWorkingSetSize(
HANDLE ... ... ... ... // ... ... мин. өлшемі
SIZE_T dwMaxWorkingSetSize // жұмысты жиынның ... ... ... аяқталу кезінде бұл функция нөльдік емес мән ... ал ... ... ... ... - False қайтарады. GetProcessWorkingSetSize функциясында сияқты hProcess параметрінде процесс дескрипторы бар, ол үшін ... ... ... ... ... dwMinWorkingSetSize және dwMaxWorkingSetSize параметрлері шақыртылатын программада орнатылады. Олар процестің жұмысты жиынын жаңа минимальді және ... ... ... ... Егер бұл екі ... ... -1 орнатылса, онда процестің жұмысты жиынның беттерінен барлық беттер бөлінеді.
Атап өтейік, SetProcessWorkingSetSize функциясы процесс ... ... ... диапазонын, тек егре hProcess процесс дескрипторында PROCESS_SET_QUOTA қатынау режімі орнатылса ғана ... Бұл ... ... ... ... егер процесс әкімшімен құрылса.
Қорытындыда атап кетейік, GetProcessWorkingSetSize және ... ... тек Windows NT/2000 ... ... ... ... 21.7-листингте процесс беттерінің жұмысты жиынның өлшемдерін анықтайтын, ал содан кейін жаңа өлшемдерді анықтайтын программа келтірілген.
Виртуальді жадының блоктарын көшіру және инициализациялау
Жады ... бір ... ... үшін ... ... ... ол ... прототипке ие:
VOID FiliMemory (
PVOID Destination, // жады ... ... ... блок ... Fill // ... ;
Бұл функция жады блогын толтырады, оны байтпен берілген ұзындығы және базалық адресі сәйкесінше Length және Destination ... ... Fill ... ... жады блогын нөльдермен толтыру қажет болса, онда ол үшін ZeroMemory
Функциясын пайдалануға болады, ол келесі ... ... ... (
PVOID Destination, // жады блогының адресіSIZE_T Length, // блок ... ... ... ... ... ... функцияның параметрлерінің тағайындалуы сияқты, тек символ-толтырғыш жоқ.
Виртуальді жады блогын көшіру үшін CopyMemory функциясын қолданады, ол келесі прототипке ие:
VOID ... ... ... ... ... адресі
CONST VOID *Source, // бастапқы облыстың адресі
SIZE_T ... жады ... ... ... жады блогын көшіреді, оның байтпен берілген ұзындығы және базалық адресі ... Length және Source ... ... ... бойынша жады облысына беріледі. Атап кетейік, CopyMemory функциясының орындалу нәтижесі алдын-ала болжамбаған, егер бастапқы және нәтижелік жады ... ... ... ... жады ... ... үшін MoveMemory функциясы қолданылады, ол келесі прототипке ие:
VOID MoveMemory (
PVOID ... ... ... адресі
CONST VOID *Source, // бастапқы облыстың адресі
SIZE_T ... жады ... ... ... функцияның параметрлері CopyMemory функциясының қолданатын программаны келтірейік.
21.8-листингі. Виртуальді жадының блоктарын көшіру және инициализациялау
Жады күйін анықтау
Процестің ... жады ... ... ... ... ... көмегімен анықтауға болады, ол келесі прототипке ие:
dword ... ... ... ... ... // ... үшін буфер DWORD dwLength // буфер ... ... ... ... облысына көрсетеді, бұл үшін ол жөнінде ақпаратты алу ... ... ... ... ... атрибуты бар тізбектелген виртуаль жады санымен анықталады.
lpBuffer параметрі MEMORY_BASIC_INFORMATION ... ... ... оған VirtualQuery функциясы виртуаль жады облысының lpAddress параметрімен көрсетілген ақпаратты ... ... ... ... бар. Оған lpBuffer ... көрсетеді.
VirtualQuery функциясының аяқталуынан кейін lpBuffer адресі бойынша құрылымға жазылған нақты байттар санын қайтарады.
VirtualQuery функциясын пайдаланатын программаның мысалын келтірмей тұрып, ... ... ... ... ол келесі өрістерден тұрады:
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID ... ... жады ... базалық адресі
PVOID AllocationBase; // үлестірілген жады облысының базалық адресіDWORD ... // ... ... қатынау атрибутыSIZE_T RegionSize; // бірдей атрибуты бар облыс өлшемі
DWORD ... жады ... Protect; // ... жады ... қатынау атрибутыDWORD Туре; // виртуаль жады облысындағы беттер типі
}MEMORY_BASIC_INFORMATION, * ... ... ... соңғы өрісін алып тастап, барлық өрістердің мәндері, виртуаль ... ... үшін ... ... параметрлердің мәндерімен сәйкес болады. Бұл өрістерді баяндайтын тек жады облысында ерекшеліктер болады.
BaseAddress және AllocationBase өрістері мәндерінің ... ... ... ... ... ... көрсетеді, оның күйін біз білгіміз келеді, ал екіншісі алдыңда VirtualAlloc функциясымен үлестірілген, бізге қажетті облысы бар ... жады ... ... және Protect өрістерінің тағайындалуы арасында да сондай айырмашалық бар. VirtualAlloc функциясымен ... ... ... жады ... ... атрибуттары болады, ал екінші өріс - виртуаль жады облысына қатынау атрибуттары, ол туралы ақпаратты біз алғымыз келеді. Бұл өрістердің мәндері ... ... ... ... ... мәндері сияқты болады. State өрісінің мәндері VirtualAlloc функциясын шақырудағы flAllocationType параметрінің мәндері сияқты болады.
Type өрісі ... жады ... ... ... баяндайды, ол жайында ақпарат анықталады.Ол өріс келесі мәндердің біреуін қабылдау мүмкін:
* mem_image -- ... ... ... -- ... жобаланған файл;
* мем_private -- процеске тәуелді жады.
Енді, ... ... жады ... күйін анықтау үшін VirtualQuery функциясын қолданаданатын программаны келтірейік.
21.9-листингі. Виртуальді жадының блоктарын көшіру және ... ... ... жадымен жұмыс
Windows операциялық жүйелерінде келесі функциялардың жиыны болады:
* virtualAllocEx -- виртуаль жадыны үлестіру (Windows ... ... -- ... ... ... ... virtuaiProtectEx -- қатынау атрибуттарын өзгерту;
* virtuaiQueryEx -- облыс күйін анықтау.
Бұл функциялар басқа процестің адрестік кеңістігінде виртуальді ... ... үшін ... Және де ... ... тек Windows NT/2000 ... ... жұмыс істейді. Бұл функциялардың аттары қарастырылғани функциялардың аттарынан тек Ex суффиксімен ... Бұл ... ... ... ... ... ... сияқты параметрлері болады, бірақ қосымша бірінші параметр болып процесс дескрипторы болып табылады, оның ... ... ... ... ... және ... бұл ... кейбіреулерін қолданатын программалар келтірілген. Бұл біреуінің виртуальді жадысы арқылы хабарлармен айырбастайтын екі консольдік ... Бұл ... ... процестің виртуальді жадысына қатынас құратын программа, ReadProcessMemory және WriteProcessMemory функцияларын қолдану қажет.
Басқа процестің виртуальді жадысынан деректерді оқу үшін ... ... ... прототипке ие:
BOOL ReadProcessMemory (
HANDLE ... ... ... ... ... базалық адресі
LPVOID lpBuffer, // мәліметтер буфері
DWORD nSize, // оқылатын байттардың саны
LPDWORD ... // ... ... ... ;
Басқа процестің виртуальді жадысына деректерді жазу үшін ... ... ... ... ... ... ... hProcess, // процесс дескрипторы
LPCVOID lpBaseAddress, // облыстың ... ... ... ... ... ... оқылатын байттардың саны
LPDWORD lpNumberOfBytesRead // оқылған байттар саны
) ;
Бұл екі ... да ... ... ... ... емес мән ... ал ... жағдайда - False мәнін қайтарады. Бұл функциялар параметрлерінің тағайындалуын баяндайық. Алғашқы екі ... типі және ... екі ... үшін ... ... ал ... үш параметр бірдей типке ие болады, бірақ мағынасы бойынша ерекшеленеді.
hProcess параметрінде, функциясы ... ... ... ... процестің дескрипторы болу керек.
lpBaseAddress параметрі, функциясы қатынас ... ... жады ... ... ...
lpBuffer параметрі жады облысына көрсетеді, оған ReadProcessMemory функциясы басқа процестің виртуальді жадысынан деректерді оқиды, ал WriteProcessMemory функциясы басқа ... ... ... ... ... функциясы басқа процестің виртуальді жадысынан оқитын nSize параметрінде байттар саны болады, ал WriteProcessMemory ... ... ... ... ... ... параметрі қос сөзге көрсету қажет, оған ReadProcessMemory немесе WriteProcessMemory шақыртылатын функция оқылған немесе жазылған байттар санын сәйкес орналастырады. Бұл ... null ... ... ... және ... шақыртылатын функция оны елемейді.
Енді, 21.10 и 21.11-листингтерде екі программаны келтірейік, оның біріншісі консольдік процесс құрады, ал содан кейін сол процестің ... ... ... оқиды және жазады. Виртуальді жадының адресі бойынша туынды консольдік процесс жауапты хабар жазу ... ол осы ... ... жол ... ... ... ... хабарларды дұрыс алып және жазу үшін программалар виртуальді жадыға өзінің қатынау құруын үйлестіретінін айтып кетейік.
21.10-листингі. ... ... ... ... ... ... ... жаулап алған виртуальді жадымен жұмыс.

Пән: Информатика
Жұмыс түрі: Реферат
Көлемі: 9 бет
Бұл жұмыстың бағасы: 200 теңге









Ұқсас жұмыстар
Тақырыб Бет саны
Құжаттарды бір-бірімен ұқсастығы78 бет
Ақпараттық қауіпсіздік түрлері14 бет
Жадыны Windows NT,Unix операциялық жүйелерінде қорғау13 бет
5-сыныптың «Ежелгі дүние тарихы» оқулығымен оқушылардың жұмыс істеуі42 бет
8 сыныптың бағдарламасына сай MS Windows-тың стандартты бағдарламаларын оқыту барысында қолданылатын оқыту бағдарламасын жасау86 бет
Access мәліметтер базасымен жұмыс істеу11 бет
Access мәліметтер қоймасымен жұмыс істеу15 бет
Access –те жұмыс істеу29 бет
Android OS жұмыс істеу принципі және Android OS қосымша құру23 бет
Delphi бағдарламалық ортасында «Pascal бағдарламалау тілінде файлдармен жұмыс істеу» электрондық оқу құралынжасап шығару19 бет


Исходниктер
Пәндер
Көмек / Помощь
Арайлым
Біз міндетті түрде жауап береміз!
Мы обязательно ответим!
Жіберу / Отправить


Зарабатывайте вместе с нами

Рахмет!
Хабарлама жіберілді. / Сообщение отправлено.

Сіз үшін аптасына 5 күн жұмыс істейміз.
Жұмыс уақыты 09:00 - 18:00

Мы работаем для Вас 5 дней в неделю.
Время работы 09:00 - 18:00

Email: info@stud.kz

Phone: 777 614 50 20
Жабу / Закрыть

Көмек / Помощь