Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Раскручиванием программного стека называется процесс удаления





Из него значений, в результате которого уничтожаются стековые

Фреймы вызванных функций.

Увеличение программного стека происходит в направлении уменьшения

Адресов выделенной физической памяти компьютера. Код программы,

Напротив, размещается в младших адресах. Далее следует область данных, где

Размещаются внешние и статические переменные и константы, а затем

динамически распределяемая память («куча»). При использовании больших

Локальных массивов данных или при значительной глубине рекурсии возможно

Переполнение стека, т.е. разрастание его до других разделов памяти.

Рассмотрим схематический программный код и изменение стека в

Процессе его выполнения.

void func2() {

int i=256;

}

void func1() {

int k=128;

// Когда поток управления достигает

// этого места, то, двигаясь вглубь стека,

// увидим локальную переменную k,

// фрейм функции func1(), адрес возврата

// в main(), переменную j

Func2();

}

void main(void){

int j=64;

Func1();

}

void func2() {

int i=256;

}

void func1() {

int k=128;

Func2();

}

void main(void){

int j=64;

// Когда поток управления

// достигает этого места, в стеке

// размещена переменная j

Func1();

}

Вершина

Стека

Младшие адреса памяти

• Код программы

• Статические данные

• Куча

j=64

Стек

Старшие адреса памяти

Вершина

Стека

Младшие адреса памяти

• Код программы

• Статические данные

• Куча

j=64

Адрес возврата в main()

k=128

Фрейм для func1()

Стек

Старшие адреса памяти

Имеется несколько механизмов раскручивания программного стека [2]:

• естественное раскручивание в процессе выполнения программы;

• раскручивание, связанное с обработкой исключительных ситуаций;

• раскручивание путем применения функции longjmp();

• и, наконец, путем прямой модификации регистра указателя стека CPU

Важно заметить, что в случае обработки исключений, как и при

Естественном разматывании стека, удаление автоматических локальных







Date: 2015-12-12; view: 501; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию