Сейчас на форуме: bedop66938, -Sanchez-, barsik, vasilevradislav, vsv1 (+6 невидимых) |
eXeL@B —› Крэки, обсуждения —› Объем оперативы Asm приложений |
Посл.ответ | Сообщение |
|
Создано: 27 декабря 2007 03:07 · Личное сообщение · #1 Доброго времени суток уважаемые форумчане! Опять таки вопросик к вам - почему прога написанная на ассемблере "голыми руками" и Raw-размером 1кб занимает в памяти 2 метра? Поначалу я думал, что эти 2 метра съедаются на внутренние структуры ОС для поддержания работоспособности приложения, пока своими глазами не увидел прогу, занимающую в памяти пару сотен килобайт. Подскажите, как же и мне написать прогу, настолько нетребовательную к памяти. PS: В аттаче прога на асме, написанная голыми руками. Импортируется всего 2 функции - жрет 2 метра оператоса. А также в аттаче скрин с популярным менеджером закачек Orbit, один из процессов которого занимает в памяти 600кб(видел даже меньше, но не могу найти ту прогу). Ну что, кто поможет раскрыть эту страшную тайну поедания ресурсов. PS2: Только не говорите, что производители железа сговорились с мелкими, и те просто так от нечего делать тратят наши ресурсы, чтобы мы апгрейживались. Сами понимаете что это не так. eb82_26.12.2007_CRACKLAB.rU.tgz - memorylow.rar |
|
Создано: 27 декабря 2007 04:13 · Поправил: HellStudent · Личное сообщение · #2 smex Чел, а вот моя мега-крутая прога, написанная на Delphi за 4 сек (File -> New -> VCL form application ) Она, как видишь, занимает ок 600 к. в памяти Конечно же, ни на что не "намякаю", но ответ на твой вопрос напрашивается сам собой. 99d9_26.12.2007_CRACKLAB.rU.tgz - MyProg.JPG |
|
Создано: 27 декабря 2007 04:56 · Личное сообщение · #3 Думаеш я настолько ламер с кривыми руками. Да с виду пробовал что только мог. И с размером страниц баловался (щас минимально возможная, меньше - прога вылетает) и тд. Даже не на асме написал, а в машинных кодах. Ну объясните мне дураке на асме написать прогу как HellStudent написал в делфи. Или же это может невозможно? Но не верю я в это. У ассемблера куда больше возможностей чем у делфи. Рискну предположить может какие поля PE заголовка не оптимальны? Верю что на этом форуме есть люди которые умеют писать на асме... PS: HellStudent прям просто File -> New -> VCL form application? У меня чего то больше 3 х метров выходит. Можеш попотробнее как ты делал и в какой версии делфи. |
|
Создано: 27 декабря 2007 05:44 · Личное сообщение · #4 |
|
Создано: 27 декабря 2007 09:24 · Личное сообщение · #5 |
|
Создано: 27 декабря 2007 09:28 · Личное сообщение · #6 |
|
Создано: 27 декабря 2007 15:37 · Личное сообщение · #7 |
|
Создано: 27 декабря 2007 18:02 · Поправил: smex · Личное сообщение · #8 Но тогда как же у HellStudent прога получилась в памяти 600кб. Я не прошу чтобы моя прога занимала в памяти 10кб, а всего лишь не хочу 2 метра тратить. Я знаю что можно прогу написать которая в памяти меньше метра будет весить, а вы мне доказываете что все нормально и меньше никак... sss Можно поподробнее, что заразмер стэка. Я его нигде не указывал походу. А насчте TLS ты уверен что метр? Не может быть, сам много раз видел проги в памяти занимающие меньше метра. Значит TLS ну никак и близко метр занимать не может. |
|
Создано: 27 декабря 2007 18:18 · Личное сообщение · #9 |
|
Создано: 27 декабря 2007 18:31 · Личное сообщение · #10 smex, а ты знаешь, что считает taskmanager? я вот не копался, и четко ответить на вопрос не могу. скачай processexplorer марка руссиновича и посмотри сколько весит та хваленая тобой прога, которая в таскманагере весит меньше метра. если считать по страницам, то занято всяко больше метра всегда, одни тока ntdll, kernel32, user32, образ программы... ----- Недостаточно только получить знания:надо найти им приложение |
|
Создано: 27 декабря 2007 18:47 · Личное сообщение · #11 |
|
Создано: 27 декабря 2007 18:52 · Личное сообщение · #12 |
|
Создано: 27 декабря 2007 20:42 · Поправил: s0larian · Личное сообщение · #13 drin, не копируются но проецируются. То есть, Rascal имел ввиду что это часть твоего процесса. Да, она одинаковая и общая, но, с точки зрения процесса, она его неотъемлемая часть. ProcessExplorer показывает что моя C++ win32/API HelloWorld кушает 3 метра в Release. Как только вызовешь Open File диалог и пройдёшься по дискам/сетке будут ещё больше т.к. подгрузится туча кода. |
|
Создано: 27 декабря 2007 21:21 · Поправил: Rascal · Личное сообщение · #14 drin я к тому, что все зависит от того, как считать. считать все страницы в процессе, страницы, которые не сброшены в своп, не считать общую память(как раз эти самые dll)... так что это достаточно эфемерные величины(размеры, которые показывают таск манагеры), пока не увидеть алгоритм расчета ----- Недостаточно только получить знания:надо найти им приложение |
|
Создано: 27 декабря 2007 21:46 · Поправил: smex · Личное сообщение · #15 |
|
Создано: 27 декабря 2007 22:19 · Поправил: Rascal · Личное сообщение · #16 smex, ты читал все, что написано выше? пока не поймешь, как таскманагер считает память, не сможешь понять откуда у тебя потребляется 2 мб. и соответственно не удастся добиться уменьшения. но ваще скажу по секрету, если ты оставишь программу крутиться в фоне, без окна, то будет скушано мало памяти. еще раз повоторю - скачай processexplorer и посмотри, сколько памяти потребленной показывает он. ща напишу сколько видят занятыми памяти у jdeveloper'a виндовый манагер и руссиновича... Значит физический памяти одинаково - 144 mb, виртуальной памяти в processexplorer - 833 mb. тока вот не выводится, сколько страниц скинуты в своп. ----- Недостаточно только получить знания:надо найти им приложение |
|
Создано: 28 декабря 2007 03:00 · Личное сообщение · #17 Посмотрел "монитором" Руссиновича: моя прога на асме занимает физической памяти 2 метра, а виртуальной 500 кб, та прога с точностью наоборот... Поэтому само собой назревает вопрос: 1. Что за виртуальную память имеет ввиду Руссинович (не подкачка ли) 2. Физическая память как понимаю важнее, а моя прога хавает ее аж 2 метра, а тот навороченный менеджер закачк 500кб. Непорядок, я тоже так хочу! |
|
Создано: 28 декабря 2007 05:30 · Поправил: sss · Личное сообщение · #18 smex пишет: sss Можно поподробнее, что заразмер стэка. Я его нигде не указывал походу. А насчте TLS ты уверен что метр? Не может быть, сам много раз видел проги в памяти занимающие меньше метра. Значит TLS ну никак и близко метр занимать не может. Посмотри описание функции CreateThread() в MSDN... Ну а конкретней: To specify a different default stack size, use the STACKSIZE statement in the module definition (.DEF) file. А на счет TLS я напутал конечно с размером. Это на стэк потока выделяется 1 МБ. Но при этом, такие компиляторы как Delphi при инициализации приложения (библиотеки VCL) с удовольствием резервируют память в TLS. В VC++ есть декларатор __declspec( thread ), который размещает переменную (объект) в TLS. В Delphi тоже есть, но я уже забыл какой. |
|
Создано: 28 декабря 2007 06:34 · Личное сообщение · #19 Продолжу однако. Реальное состояние занимаемого ресурса "оперативная память" процессом регулируется понятием рабочего набора процесса. Каждый раз, когда вы вызываете CreateProcess, происходит резервирование минимального рабочего набора для процесса. Управление рабочим набором производит менеджер виртуальной памяти. Политика управления рабочими наборами сложная тема. Политика различается в зависимости от типа ОС и текущего положения в конкретной системе. Подробнее: Process Working Set в MSDN и в книге "Внутренне устройство Windows 2000" Соломона и Руссиновича. |
|
Создано: 31 декабря 2007 01:15 · Личное сообщение · #20 Небольшое замечание. Вообще этот процесс автора "занимает" вообще на XP SP2 6 000 352 "памяти". На других версиях ОС будут другие данные, наибольшее значение будет на Vista. "мЕЛКОМЯГКИЕ" ВООБЩЕ НЕДОГОВАРИВАЮТ. оБЩАЯ ПАМЯТЬ БУДЕТ - ImageSize твоего образа - плюс адресное пространство (ну, размер) спроецированных DLL, а так как твои USER32 и KERNEL32 для своей работы требуют разного(!!!) количества dependency DLL, зависящих от ОС (наименьшее будет на w2k Prof), то и размер "запрашиваемой" памяти будент разный. Вообще, туман по "корпоративной" памяти спроецированных системных DLL Соломон и Русинович не рассеивают, они его просто "Обходят." И последнее, для USER32 MessageBox OriginalFirstThunk должен "быть" не $FFFFFFFF, а 0. Не все SP это принимают. После попытки определения по адресу $FFFFFFFF загрузчик спотыкнётся и полезет в другую таблицу по FirstThunk, но дополнительно поставит охрану на первый спотык, что также сожрёт память. |
eXeL@B —› Крэки, обсуждения —› Объем оперативы Asm приложений |