По ходу написания различных программ у меня возник один очень интересный вопрос: Как опаределяется начальное значение esp при запуске программы? Кауда ОС помещает стек определенной программы и можно ли определить его местонахождение ? вот) заранее благодарен...
_ir4_Y_ Для винды в заголовках PE-формата, есть поля, скоко надо стека в нач.момент и скоко возможно всего! Т.е. винда соглассно этим значениям выделяет область памяти, которая и используется как стек. Если стек закончен, т.к. нач.размер может быть израсходован винда еще выделает и т.д. пока не исчерпается максимально возможное значение.
Все лежит в хидере. Стандартно линкер задает ESP=00130000 и винда выделяет под это безобразие три страницы. На низлежащие страницы винда ставит PAGE_GUARD и стек растет вниз по мере обращения. Выполнив команду CALL $ можно узнать по возникшему исключению, сколько максимально винда дает стека 1 процессу. У меня минимум ESP=00033000. То есть винде не жалко (00130000-00033000)/1000 = FD = 253д страниц
Товарищи какая винда=) я про Linux спрашивал) пасиба конечно, но расскажите про стек в Linux и ещё мона раскадать как проги определяют где чей стек при многозадачности заранее благодарен
_ir4_Y_ Сорри, но большинство идей по PE-формату откуда взято? С ELF-формата, вот и глянь его, там должны быть подобные поля!
_ir4_Y_ Тут есть старая статья про организацию адресного пространства в Линуксе: http://tldp.org/LDP/khg/HyperNews/get/memory/linuxmm.html В последних версиях ядра (2.4.х - 2.6) стартовый адрес стека в юзере непостоянен. Видимо, это сделано чтоб насолить любителям эксплоитов
еще под MS-DOS была задачка написать программу, выводящую содержимое регистров на экран. под Linux/bsd решение ничем не отличается. в чем сложность?! сохраняем регистры в памяти (стеке или сегменте данных) и потом юзаем системные вызовы или стандартную библиотеку - это уже кому что по вкусу.
тьфу, перепутал MZ-поле Initial SS:SP с полями SizeOfStackReserve & SizeOfStackCommit. Но суть не меняется почти )
Great pushad - это ты еще порядок поклажи регистров знать должен, а так же - что присходит сначала - уменьшение ESP и его засовывание в стек или наоборот. так что проще засунуть регистры в сегмент данных через mov, типа mov [xxxxxxh],esp ... mov [yyyyyh],eax а потом уже их выводить на экран или, что проще в файл в двочином виде, а потом его глянуть в hexedit
ESP на всех последних процах кладется на момент перед выполнением PUSHAD'а. А порядок регистров я примерно помню
Ты ж сказал надо вывести все регистры? Чем pushad не вариант + ,конечно, отдельные push с сегментными регистрами