Насколько я знаю, когда мы запускаем какую-либо программу, машинные инструкции программы загружаются в ОЗУ. Опять же, есть две области памяти: стек и куча.
Мой вопрос: в какой области памяти хранится машинная инструкция? стек или куча?
Я узнал, что следующая программа выдает ошибку времени выполнения, хотя внутри функции не объявлено ни одной переменной. Причиной этого является переполнение стека. Тогда я должен предположить, что машинные инструкции функции хранятся в стеке?
int func()
Решение
Ни как нет динамично Выделены пути стека и кучи.
Загрузчик исполняемых файлов загружает исполняемый файл (.text) и любые содержащиеся в нем статические данные, такие как начальные значения глобальных переменных (.data / .rodata), в неиспользуемую область ОЗУ. Затем он устанавливает любую инициализированную нулем память, которую запрашивал исполняемый файл (.bss).
Только затем стек настроен для main() , Память стека выделяется в стеке, если вы вводите другую функцию, содержащую адрес возврата, аргументы функции и любые локально объявленные переменные, а также любую память, выделенную через alloca() . [1] Память освобождается при выходе из функции.
05. Основы устройства компьютера. Регистры и команды процессора. [Универсальный программист]
Память кучи выделяется malloc() , calloc() , или же realloc() , Это выпущено, когда ты free() или же realloc() Это.
ОЗУ, используемое для исполняемого файла, и его статические данные не освобождаются до тех пор, пока процесс не завершится.
Таким образом, стек и куча, в основном, находятся под контролем приложения. Память самого исполняемого файла находится под контролем загрузчика исполняемых файлов / операционной системы. В правильно оборудованных операционных системах у вас даже нет доступа на запись в эту память.
Что касается вашего отредактированного вопроса, нет. (Плохой стиль, редактирование вопроса, чтобы дать ему совершенно новый угол.)
Исполняемый код остается там, где он был загружен. призвание функция делает не поместите машинные инструкции в стек. Единственное твое func() (функция без аргументов) места в стеке обратный адрес, указатель, который указывает, где выполнение должно продолжаться после возврата текущей функции.
Так как ни один из вызовов никогда не возвращается, ваша программа продолжает добавлять адреса возврата в стек до тех пор, пока он не сможет больше удерживаться. Это никак не связано с инструкциями машинного кода.
[1]: Обратите внимание, что ничего из этого на самом деле не является неотъемлемой частью стандарта языка Си, но от реализации, и может отличаться — я представил упрощенную версию дел. Например, параметры функции могут передаваться в регистрах ЦП, а не в стеке.
Другие решения
Ни того, ни другого.
Образ вашей программы содержит код и статические данные (например, все строковые константы, статические массивы и структуры и т. Д.). Они будут загружены в разные сегменты оперативной памяти.
Стек и куча — это динамические структуры для хранения данных, они будут созданы в начале вашей программы. Stack — это аппаратно-поддерживаемые решения, а heap — это решение, поддерживаемое стандартной библиотекой.
Партнёрская программа GLOBAXWEB в деталях.
Таким образом, ваш код будет расположен в сегменте кода, ваши статические данные и куча будут находиться в сегменте данных, а стек будет находиться в сегменте стека.
машинная инструкция программы загружена в ОЗУ
Подходит для размещенных «ПК-подобных» систем. На встроенных системах код чаще всего выполняется непосредственно из флэш-памяти
Опять же, есть две области памяти: стек и куча.
Нет, это слишком упрощение, слишком много, слишком плохих учителей программирования.
Есть также много других регионов: .data а также .bss куда идут все переменные со статическим хранилищем, .rodata куда идут константы и т. д.
Сегмент, в котором хранится программный код, обычно называется .text ,
Опять же, есть две области памяти: стек и куча.
Это не так просто. Обычно в основной операционной системе происходит больше всего:
- в каждом потоке имеется один стек;
- кучи столько, сколько вы решите выделить (на самом деле, что касается диспетчера памяти, вы просите некоторые страницы памяти «включить» в вашем виртуальном адресном пространстве, «куча» возникает из-за того факта, что обычно используются некоторые вид кода менеджера кучи для эффективного распределения этих частей памяти между выделениями);
- могут быть файлы с отображенной памятью и разделяемая память;
- наиболее важно, что исполняемый файл (и динамические библиотеки) отображаются в памяти процесса, обычно с зоной кода (так называемый «текстовый» сегмент), отображаемой в режиме только для чтения, и другими зонами (обычно относящимися к инициализированным глобальные и статические переменные и прочее, исправленные загрузчиком) при копировании при записи.
Итак, код хранится в соответствующем разделе исполняемого файла, который отображается в памяти.
Они обычно находятся в разделе под названием .text ,
В Linux вы можете перечислить разделы ELF-объекта или исполняемого файла с помощью size команда от core-utils, например, на tst Исполняемый файл ELF:
$ size -Ax tst | grep «^.text».text 0x1e8 0x4003b0 $
Есть несколько сегментов памяти в дополнение к стеку и куче. Вот пример того, как программа может быть размещена в памяти:
+————————+ high address | Command line arguments | | and environment vars | +————————+ | stack | | — — — — — — — — — — — | | | | | V | | | | ^ | | | | | — — — — — — — — — — — | | heap | +————————+ | global and read- | | only data | +————————+ | program text | low address | (machine code) | +————————+
Детали будут различаться в зависимости от платформы, но эта схема довольно распространена для систем на базе x86. Машинный код занимает собственный сегмент памяти (помечен .text в формате ELF), глобальные данные только для чтения будут храниться в другом сегменте ( .rdata или же .rodata ), неинициализированные глобалы в еще одном сегменте ( .bss ) и т. д. Некоторые сегменты доступны только для чтения, некоторые доступны для записи.
Ни кучи, ни стека.
Обычно исполняемые инструкции присутствуют в Сегмент кода .
Цитирование статьи в Википедии
В вычислениях сегмент кода, также известный как текстовый сегмент или просто как текст, является частью объектного файла или соответствующего раздела виртуального адресного пространства программы, который содержит исполняемые инструкции.
когда загрузчик помещает программу в память, чтобы она могла быть выполнена, выделяются различные области памяти (в частности, в виде страниц)
Во время выполнения сегмент кода объектного файла загружается в соответствующий сегмент кода в памяти. В частности, это не имеет никакого отношения к стеку или куче.
В приведенном выше фрагменте кода то, что вы испытываете, называется бесконечная рекурсия.
Даже если ваша функция не требует места в стеке для локальной переменной, она все еще нужно От себя обратный адрес из внешний функция перед вызовом внутренний функция, таким образом, требуя пространство стека, только никогда return [поп адреса вне стека] [как в точке, откуда нет возврата], тем самым исчерпывая пространство стека, вызывая переполнение стека.
Источник: web-answers.ru
Формат машинной команды
Машинная программа — последовательность машинных команд.
Принцип хранимой программы (принцип фон Неймана): во время исполнения программа хранится в оперативной памяти вместе с данными. Каждая команда программы занимает ячейку памяти и имеет свой адрес (адрес ячейки).
Формат команды. Для всякого процессора машинная команда имеет стандартный формат и строго фиксированную длину. Команда состоит из кода операции и адресной части. Код операции определяет действие, которое должен выполнить процессор; адресная часть содержит адреса величин, над которыми должна быть произведена эта операция:
В зависимости от структуры адресной части команды, процессоры делятся на трехадресные, двухадресные, одноадресные и безадресные (стековые).
Формат одноадресной команды:
Адрес аргумента или результата
(откуда взять или куда поместить)
Формат трехадресной команды:
Адрес первого аргумента
Адрес второго аргумента
Длина команды. Длина кода операции зависит от числа операций, входящих в систему команд компьютера. Так код операции длиной в 4 бита позволяет хранить коды до 16 (2 4 ) различных команд (с двоичными кодами от 0000 до 1111). Можно сформулировать простое правило определения оптимальной длины кода операции:
,
где К — количество команд в системе команд машинного языка, k — длина поля кода операции (в битах). Фактически во многих случаях длина поля кода операции берется с избытком, что, например, легко позволяет расширять систему команд.
Пример 1. В системе команд компьютера содержится 50 команд. Какова оптимальная длина кода операции?
Большинство арифметических и логических операций имеют два операнда и поэтому трехадресная структура машинной команды наиболее естественна. В двухадресной команде один из адресов используется и для аргумента и для результата (после выполнения команды), что несущественно влияет на методику программирования на языке машинных команд (ЯМК) такого компьютера. В одноадресной машине возникает необходимость использования специального элемента памяти, называемого сумматором или аккумулятором.
В трех- (двух-) адресной машине длины полей всех адресов одинаковы, поэтому общую длину команды (в битах) можно определить по формуле:
d = k + n а,
где k — длина поля кода операций, n — количество адресов в адресной части (n = 1, 2, 3), а — длина поля адресной части (в битах). Очевидно, в этом случае размеры адресуемого пространства (А — количество адресуемых ячеек памяти) определяются формулой:
А = 2 а .
Источник: studfile.net
Где машинные инструкции программы хранятся во время выполнения?
Насколько я знаю, всякий раз, когда мы запускаем какую-либо программу, машинные инструкции программы загружаются в ОЗУ. Опять же, есть две области памяти: стек и куча. Мой вопрос: в какой области памяти хранится машинная инструкция? стек или кучу? Я узнал, что следующая программа дает ошибку во время выполнения, хотя в функции нет переменной.
Причиной этого является переполнение стека. Тогда следует ли считать, что инструкции по машинам функции хранятся в стеке?
int func()
Muktadir Rahman 29 янв. 2015, в 16:07
Поделиться
Это зависит от операционной системы, но текстовый сегмент обычно не является ни стеком, ни кучей
Basile Starynkevitch 29 янв. 2015, в 15:10
как и почему он специально помечен как c++11 ?
Sourav Ghosh 29 янв. 2015, в 15:15
Пожалуйста, не редактируйте вопрос и добавьте в него еще один совершенно другой вопрос.
Спроси нового.
Sourav Ghosh 29 янв. 2015, в 15:15
Muktadir Rahman 29 янв. 2015, в 15:20
Ваш новый вопрос не имеет ничего общего с первым. Причина сбоя заключается в том, что параметры вызова функций, такие как адрес возврата, хранятся в стеке. Самого машинного кода нет.
Lundin 29 янв. 2015, в 15:23
Muktadir Rahman 29 янв. 2015, в 15:31
Muktadir Rahman 29 янв. 2015, в 15:31
Sourav Ghosh 29 янв. 2015, в 15:32
Просто из любопытства, почему тебя волнует, где хранятся машинные инструкции?
John Dibling 29 янв. 2015, в 15:45
Muktadir Rahman 29 янв. 2015, в 15:49
DevSolar 29 янв. 2015, в 15:59
Показать ещё 9 комментариев
Поделиться:
memory-management
7 ответов
Лучший ответ
Ни то, как динамически не распределяется так, как стека и кучи.
Исполняемый загрузчик загружает исполняемый файл (.text) и любые статические данные, которые он содержит, как начальные значения глобальных переменных (.data/.rodata), в неиспользуемую область ОЗУ. Затем он устанавливает любую нуль-инициализированную память, которую запросил исполняемый файл (.bss).
Только тогда стек устанавливается для main() . Хранилище стека выделяется в стеке, если вы вводите другую функцию, удерживая адрес возврата, аргументы функции и любые локально объявленные переменные, а также любую память, выделенную через alloca() . [1] Память освобождается при возврате из функции.
Память кучи выделяется malloc() , calloc() или realloc() . Он освобождается при free() или realloc() .
ОЗУ, используемое для исполняемого файла, и его статические данные не освобождаются до тех пор, пока процесс не завершится.
Таким образом, стек и куча, в основном, находятся под контролем приложения. Память самого исполняемого файла находится под управлением исполняемого загрузчика/операционной системы. В соответствующих оборудованных операционных системах у вас даже нет доступа для записи в эту память.
Что касается вашего отредактированного вопроса, нет. (Плохой стиль, редактирование вопроса, чтобы дать ему совершенно новый угол.)
Исполняемый код остается там, где он был загружен. Вызов функции не помещает машинные инструкции в стек. Единственное, что ваша функция func() (функция, не принимающая аргументов) в стеке — это обратный адрес, указатель, указывающий, где выполнение должно продолжаться после возвращения текущей функции.
Поскольку ни один из звонков никогда не возвращается, ваша программа продолжает добавлять обратные адреса в стек, пока это не сможет больше удерживаться. Это никак не связано с инструкциями машинного кода.
[1]: Обратите внимание, что ничто из этого на самом деле не является неотъемлемой частью стандарта языка C, но определено в реализации и может отличаться — я представил упрощенную версию дел. Например, параметры функции могут передаваться в регистры CPU, а не в стеке.
Источник: overcoder.net