Здравствуйте, C0nsul, Вы писали:
C>1) Зачем обнулять свободные страницы памяти?
Взято
отсюда:
Windows NT удовлетворяет классу защиты C2, и поэтому должна при выделении
страниц пользовательским процессам чистить их. Рассмотрим поток системного
процесса, который занимается очисткой фреймов. Последнее, что делается
в Phase1Initialization() это вызов функции MmZeroPageThread. Как не трудно
догадаться — поток предназначен для очистки свободных страниц и перемещении
их в список нулевых страниц.
MmZeroPageThread
{
//
//.... неинтересные вещи пропущены ;)
//
while(1)
{
KeWaitForSingleObject(MmZeroingPageEvent,8,0,0,0); // ждем события
while(!KeTryToAcquireSpinLock(MmPfnLock,&OldIrql)); // захватить PfnDatabase
while(MmFreePageListHead.Count){
MiRemoveAnyPage(MmFreePageListHead.FirstFn&MmSecondaryColorMask);
// вытащить страницу из списка свободных
Va=MiMapPageToZeroInHyperSpace(MmFreePageListHead.FirstFn);
KeLowerIrql(OldIrql);
memset(Va,0,0x1000); // clear page
while(!KeTryToAcquireSpinLock(MmPfnLock,&OldIrql);
MiInsertPageInList(&MmZeroedpageListHead,FrameNum);
// вставить очищенную страницу в список Zero
}
MmZeroingPageThreadActive=0; // очистить флаг
KeLowerIrql(OldIrql);
}
// никогда не выходит.
}
// функция просто отображает фрэйм на определенный адрес
// чтобы его можно было очистить
DWORD MiMapPageToZeroInHyperSpace(FrameNum)
{
if(FrameNum<MmKseg2Frame)return ((FrameNum+0x80000)<<12); // попали в область
// непосредственного отображения
TmpPte=0xc0301404;
TmpVa=0xc0501000;
*TmpPte=0;
invlpg((void*)TmpVa); // asm instruction in fact
*TmpPte=FrameNum<<12|ValidPtePte;
return TmpVa; // always 0xc0501000;
}
В каких случаях активизируется MmZeroingPageEvent? Это происходит при
добавлении фрейма в список свободных страниц:
MiInsertPageInList()
{
.....
if(MmFreePageListHead.Count>=MmMinimumFreePagesToZero&&
!MmZeroingPageThreadActive)
{
MmZeroingPageThreadActive=1;
KeSetEvent(&MmZeroingPageEvent,0,0);
}
....
}
Замечание: Ядро не всегда пологается на этот поток, иногда, встречается
код, который забирает одну из свободных страниц, а потом сам ее чистит.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth