Виртуальное адресное пространство процесса.
Добрый день Уважаемые! С недавних пор меня стала волновать одна проблемка. В адресном пространстве любого процесса есть довольно большие участки со значением 0. Занимаясь оптимизацией поиска значений в памяти осенила меня мысль! Зачем перелопачивать эти нулевые участки если искомое значение не ноль? Да и даже при поиске нулевых значений я не думаю что нужное значение находится иммено в этих участках. Так вот вопрос: для чего нужны такие участки в памяти и можно ли их какнибудь обойти?
А что именно нужно то? :) Не достаточно ясно вопрос поставлен.
В адресном пространстве любого процесса есть и участки доступа к которым нет ни на чтение, ни на запись.
Цитата: Phodopus
В адресном пространстве любого процесса есть и участки доступа к которым нет ни на чтение, ни на запись.
и с этим трудно спорить))
Сложно понять о каких именно участках вы ведете речь. Все же ненулевых подавляющее большинство.
Цитата: Phodopus
Сложно понять о каких именно участках вы ведете речь. Все же ненулевых подавляющее большинство.
я имею ввиду нулевые участки станиц регионов доступных для чтения и записи.Сказочно бы было знать адреса и размеры этих участков, чтобы исключить их из поиска))тогда скорость поиска резко возрасла.У меня есть предположение что легендарный ArtMoney известный своей огромной скоростью поиска использует похожий механизм.
int search; //переменная для поиска
char *pbuff; // указатель на буфер куда я скопировал целый регион из памяти чужого процесса
int size_region; // размер региона
int offset = 0; // смещение в буфере
while(1)
{
if(offset > (size_region-4))
break;
//далее разыменовываю преобразованый указатель и сравниваю
if(search == *(int*)pbuff)
{
cout << "Значение найдено!\n";
offset += 4;
pbuff += 4;
}
else
{
offset ++;
pbuff ++;
}
}
Мне кажется, что в этом цикле оптимизировать уже нечего.
Знать бы мне адреса и размеры нулевых участков.
char *pnull;
int size_null_space;
while(1)
{
if(pbuff == pnull)
{
offset += size_null_space;
pbuff += size_null_space;
}
if(offset > (size_region-4))
break;
if(search == *(int*)pbuff)
{
cout << "Значение найдено!\n";
offset += 4;
pbuff += 4;
}
else
{
offset ++;
pbuff ++;
}
}
Цитата: Ramon
Благодарю! Глянул winternl.h. Впечатляет! Будет чем заняться долгими зимними вечерами))