· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Сколько должен жрать RAM'a маааленький ехешни

Посл.отвђт Сообщенiе


Дата: Дек 28, 2002 15:31:52

Господа, такой вопросик - я когда то на асме под досом баловался и так понимаю, что если ехешник 5 кг весит, то и в памяти где-то столько же будет (динамически ничего не просит).

А вот надо мне теперь мАААленькую утиль под Вынь32 сделать - и что я вижу? Ехешник сам всего - ничего, а в памяти 500 килов съел. Это если я окон вообще не создаю. А если создаю - более тонны.. Ну я понимаю, Вынь создает структуры там у себя чтобы окно описать и все такое. Но совесть-то надо иметь!?

Как с таким расходом DDR'a бороться?


Дата: Дек 28, 2002 17:57:08

[EHOT: [i]Как с таким расходом DDR'a бороться?[i]]

Ответ простой - никак.

Стек - одна страничка для начала.
Память на структуры объектов "процесс" и "поток" - как минимум.
Ну это, правда, в ядре.
Блоки окружения процесса и потока.
Еще кое-какие нужные структуры.

А длл: kernel32, user32 и т.п. В NT каждый процесс имеет свою копию.
Код разделяет физические страницы, а вот секция данных индивидуальна.
Они то в основном и жрут.

Так что не трать силы - бесполезно.


Дата: Дек 28, 2002 22:41:26

А длл: kernel32, user32 и т.п. В NT каждый процесс имеет свою копию.
Код разделяет физические страницы, а вот секция данных индивидуальна.
Они то в основном и жрут.


Не правда. DLL'и у всех програм те-же самые, то-есть одна копия на всю систему. А если программа исменила данные/код DLL'a, то только эти изменения сохраняутся отдельно (одна страница - 4096 байтов).


Дата: Дек 29, 2002 17:59:48 · Поправил: Four-F

[comrade: Не правда. DLL'и у всех програм те-же самые, то-есть одна копия на всю систему. А если программа исменила данные/код DLL'a, то только эти изменения сохраняутся отдельно (одна страница - 4096 байтов).]

Ох, лень писать, да ладно, раз пошла такая пьянка.

Я уже оговаривался, что имею ввиду NT. Оговариваюсь еще раз.
Для 9x сами смотрите.
В 9x все системные длл действительно разделяются между процессами.
Но что там с секцией данных я уже не помню.


Входим в SoftICE

cls

Чтоб лог поменьше был.

proc

Выбираем любые два процесса (можно больше - по вкусу), кроме idle (у него вообще юзерных модулей нет), System и smss.

Переключаемся на адресный контекст выбранного процесса:

addr <имя процесса>

Смотрим какие модули у него в юзере:

mod -u

Можно и не смотреть, т.к. kernel32, user32, advapi32 и gdi32 практически в каждый процесс отображаются (кроме вышеперечисленных).
Выбираем, например advapi32 (у него секция данных побольше)

Смотрим адрес и размер (у мя 4 страницы) секции данных:

map32 advapi

Смотрим в какие физические страницы отображена секция данных:

page <адрес секции данных> l 4

Если у вас размер .data для advapi32 другой, то подставляете свое значение (в страницах). Видим физические адреса.

Проделываем все вышеописанное (начиная с команды addr) для другого (других) процесса.
Идем в SoftICE Symbol Loader и сохраняем лог в файл: File->Save SoftICE History As...
Открываем в нескольких (по числу просмотренных прцессов) экземплярах notepad, сравниваем и анализируем результаты. Критикуем меня если не прав ;-)

Теоретически, не должно найтись двух одинаковых модулей, у которых есть хоть одна страница секции данных отображенная в один и тот же физический адрес.

В NT каждый процесс получает свою копию системной длл, причем все секции разделяют одни и те же физические страницы, кроме секции данных. Если процесс что-то пишет в секцию кода например, то тогда эта страница переотображается в другую физ страницу. А вся секция данных у каждого процесса своя.

Вообще посмотреть что куда мапится у процесса можно по команде:

query

А потом брать каждый диапазон и смотреть по каким физ адресам он отображен, все той же page.

Можно еще проанализировать системные модули (mod -s), но там немного сложнее все.


Дата: Дек 30, 2002 09:16:28

Ну ладно, своим знанием вы меня, товарищь, закапали.


Дата: Янв 4, 2003 16:09:33

> Стек - одна страничка для начала

Если не ошибась, то для начала три странички - сверху и снизу PAGE_GUARD :)


Дата: Янв 5, 2003 13:16:21

Чуть-чуть ошибся ;-) страничка PAGE_GUARD только снизу.
Я сразу хотел поправиться да заленился.

Щас глянул. Реально, для процесса, кот ваще ничего не делает

.code
start:
invoke Sleep, -1
ret
end start

Под стек уже 2 страницы выделено + 1 сторожевая.
А сразу за стеком (вверх) у мя куча начинается. 3 паги выделенных, между прочим.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.069