Зачем обнулять страницы в Windows
От: C0nsul  
Дата: 12.11.05 19:59
Оценка:
В книге Рихтера написано:

При загрузке системы создается особый поток — поток обнуления страниц (zero page thread), которому присваивается нулевой уровень приоритета. Ни один поток, кроме этого, не может иметь нулевой уровень приоритета. Он обнуляет свободные страницы в оперативной памяти при отсутствии других потоков, требующих внимания со стороны системы.


1) Зачем обнулять свободные страницы памяти?
2) В каком процессе запускается этот поток?
Re: Зачем обнулять страницы в Windows
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 12.11.05 20:36
Оценка:
Здравствуйте, C0nsul, Вы писали:

C>В книге Рихтера написано:

C>1) Зачем обнулять свободные страницы памяти?

Для того, чтобы твой процесс случайно не подглядел данные, которые остались там от предыдущего процесса. Весьма вероятно, что там могут быть пароли, или еще что-то важное.
Re: Зачем обнулять страницы в Windows
От: Alex Fedotov США  
Дата: 12.11.05 21:49
Оценка:
Здравствуйте, C0nsul, Вы писали:

C>2) В каком процессе запускается этот поток?


В системном процессе.
-- Alex Fedotov
Re: Зачем обнулять страницы в Windows
От: gear nuke  
Дата: 13.11.05 07:18
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.