2fsd. Вы предлагаете на каждое выделение 2-256 байт, выделять по 2 страницы. Это не очень оптимально, если учесть, что код будет в дальнейшем имплантирован в драйвер, как я писал. Но для обычных приложений, решение неплохое. Хотя по моему глубокому убеждению, писать юзерское приложение нужно на безопасных языках таких как Шарп, ява. С нужен для системных вещей, их можно создать в виде библиотек, которые потом можно юзать в Шарповом приложении. Делать юзерское приложение на чистом С, думаю это overkill. Тогда уж лучше используя Qt. Прошу не реагировать очень бурно, это только мое мнение по шарпу, этот форум о асме и с и заслуживал отдельного топика, который уже был создан и закрыт. Код который я делаю в дальнейшем будет использоваться в драйвере придется только заменить malloc на ExAllocatePool и а free на ExFreePool, и требуется аккуратное программирование уже в юзерленде. И тестировать тщательно сначала в 3 кольце. И отсюда выделять память тоже требуется экономно. Вот собственно и все причины. Кроме того, допустим я выделяю память 10 раз по 255 байт, Хорошо выделили страницу, работаем в ней так как 255 байт * 10 = 2550 байт, в пределы страницы помещаемся. Затем потребовалось 20 по 255 байт получаем 5100 байт, это больше чем страница, нужно снова выделять страницу, да еще следить за продолжением выделенного массива, который начинается в одной странице и продолжается в другой, таким образом плавно переходим к тому, что придется создать отдельный менеджер памяти страниц в коде. Так?
neutronion чиста конкретную? например, http://pdos.csail.mit.edu/~baford/vm/ http://swtch.com/~rsc/papers/vx32/ ну и кема, бокс, конечно. можете даже плугинируемый и скриптабельный чекер замутить типа вг. если вытянете, конечно.
Сдается мне, что выделение страниц хорошо по следующему сценарию: Выделил нужное количество страниц и работаешь до завершения приложения/драйвера. Тогда конечно все упрощается, но страницы будут заняты на постоянку, не знаю насколько это хорошо. С учетом, того, что сейчас много памяти, вроде бы ничего решение. И реально упрощает жизнь, хотя некоторые крутые программисты могут сказать, что это не круто. Опять таки, есть минус. Такой код конечно отслеживает переполнение за пределы страницы, и избавляет от гемора по выделению/освобождению памяти, но он не защищает от переполнения буферов внутри страницы. Что думаете?
отсюда вывод, что выделение памяти плюс 4 байт на cookies не такая плохая идея, для проверки валидности памяти и удаления.
т.е. Резюмируя: 1) Выделяем память плюс 4 байт под куки 2) Пользуемся ею, после использования проверяем, не переписали ли куки 3) Перед освобождением памяти устанавливаем куку в ноль 4) После того как думаем, что все освободили ищем куки в памяти, которая в тех пределах, где выделяется хип. Если находим, значит имеется косяк и где-то память не освободили. (это только в дебажном варианте) Код (Text): #ifdef _debug #defien COOKA 0 #else #define COOKA 4 #endif #define CODE_DEAD 0xc0dedead ...где-то во глубине char *_buff = (char*) malloc(size + COOKA); memset(_buff+size,CODE_DEAD,COOKA); #ifdef _debug if(!memcmp(_buff[size],CODE_DEAD, COOKA)) Alarm(); ...где то освобождаем memset(_buff[size],'\0',COOKA); free(_buff); ... если после этого находим в памяти куку Alarm();
Остался важный вопрос где искать? Возникла такая идея, есть предложение рассмотреть поиск в памяти с точки зрения пределов из математики. То есть: -Когда мы выделяем память, то в переменной содержится адрес, это адрес виртуальной памяти. Запоминаем его, это будет предел А. Но при выделении памяти у нас имеется также размер выделенной памяти. Это предел Б(если к адресу выделенной памяти прибавить размер). Теперь при любом выделении памяти, мы сравниваем адрес выделенной памяти с пределом А, если он меньше предела А, то обновляем предел А на новый адрес памяти, если адрес новой памяти + размер больше предела Б, то также обновляем предел Б. Таким образом мы имеем диапазон памяти, который имеет тенденцию к расширению, в котором после освобождения памяти и будем искать магическое число. После того как поискали и ничего не нашли обнуляем предел А и предел Б. И все начинается заново.