|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|
Адресация переменных и всей структуры программы на реальной памяти в ОС20.11.2017, 21:38. Показов 4522. Ответов 42
Метки нет (Все метки)
Доброго времени суток, Вопрос по памяти, не совсем понятно:
1. Я написал программу 1.cpp, выполняю ее компиляцию, если я не использую динамическое выделение памяти, то при ее компиляции, исходя из объявленных переменных и еще чего-то там(?????), вычисляется объем памяти, требуемый для выполнения программы, затем происходит линковка - компоновка написанной программы, адресация каждой инструкции и разрешение имен для ф-ций(их адресация) . Линкер делает адресацию относительно "нуля" всего блока инструкций. Таким образом получается исполняемый файл - блок инструкций с рассчитанным, для его выполнения, объемом данных, у которого каждая инструкция теперь имеет адрес и за именем ф-ции скрывается адрес. 2. При запуске такого файла, ОС выделяет память, рассчитанную при компиляции и загружает программу в какую-то область оперативки с адресом X, где X и является по-сути тем самым "нулем" программы. ОС настраивает процессор на выполнение 1-ой инструкции и начинается ее выполнение, как только он доходит до инстр. вызова ф-ции, он кладет в IP адрес след.инструкции (в стек?) и переходит по адресу, который был дан ф-ции при линковке, передавая пар-ры этой ф-ции в стек обл-ти памяти где лежит наша программа. (Как этот стек выделяется? Это часть памяти, рассчитанной при компиляции? ) , затем ф-ция выполняется, работая с лок. переменными, которые лежат в том же стеке, и дойдя до return из стека (IP???) выдергивается адрес возврата и "процессор возвращается с каким - то значением". 3. При использовании динамического выделения, у нас и статическая память будет иметь место, в которой будет храниться выполняемая программа? и в процессе выполнения программы, дойдя до инструкции malloc (new), происходит выделение дин.памяти "где-то" в опер. памяти. Верно ли я понимаю, скорректируйте, пожалуйста)))) Хочу понять и иметь общее представление о данном процессе) Буду очень рад, если кто-нибудь возьмется написать поэтапно все это)))
2
|
|
| 20.11.2017, 21:38 | |
|
Ответы с готовыми решениями:
42
GlobalAlloc и адресация структуры Адресация переменных по стандарту МЭК 61131-3
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 30.11.2017, 00:00 | |
|
Все адреса в программе внутренние. Физический вообще, наверное, только в самом процессоре есть.
И что за защита стека указателями? Ты про его ограниченный размер, что ли? Ну указатель 4/8 байт, а выделить памяти по нему можно много, она же вне стека.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 30.11.2017, 00:09 | ||||
|
1) Принцип as if говорит что наблюдаемое поведение программы должно совпадать с ее исходником. То есть, frab должно вернуть x+y. А вот локальные переменные компилятор имеет право выкинуть или наоборот добавить. 2) Компилятор никому не обязан хранить локальные переменные в стеке, если они помещаются в регистрах. Где на всех набрать регистров это уже другой вопрос.
0
|
||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
|
||||
| 30.11.2017, 00:45 | ||||
|
0
|
||||
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|||
| 02.12.2017, 12:23 [ТС] | |||
|
1. Считал я смещения так: пользовался для каждой переменной операцией взятия адреса &. Затем переводил из (hex) в (dec) // мне так пока что понятнее// и у каждой переменной получилось такое смещение. Я то думал, что при компиляции все идет линейно: от базового адреса добавляются смещения, в зависимости от размера переменной, но в моем примере этого не заметил я, тут вроде бы эта "линейность" в начале, а потом смещения уже пар-ов ф-ции Frab() другие, потом снова идет эта "линейность" с шагами на размер переменной. Вот почему так?
Может 472 - это уже другая "страница" виртуальной памяти?? Которая, как мы с Вами говорили, находится уже в другом месте физической памяти, так? А та уже забилась. 2. 3.
0
|
|||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
|
|||
| 02.12.2017, 12:44 | |||
|
0
|
|||
|
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
|
|||
| 02.12.2017, 12:45 | |||
|
0
|
|||
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|
| 02.12.2017, 14:35 [ТС] | |
|
То есть Вы хотите сказать, что лок. переменные хранятся в стеке, но доступ к ним не через LIFO, а прямой. И Получается все лок. переменные из стека удаляются, кроме лок. переменных main() // при вызовах только из main()//
0
|
|
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
|
|
| 02.12.2017, 15:28 | |
|
Программе доступны две области памяти: стек и куча.
С кучей все понятно - программа запрашивает выделение кусков памяти под переменные с помощью malloc/free или new/delete, после чего ОС выдает ей их адреса (или не выдает в случае ошибки). Произвольного доступа к куче нет. Вы не можете напрямую писать, скажем, по адресу 0x1234. Зато динамическим выделением можно получить от ОС огромные куски памяти, даже больше чем есть оперативки в железе (механизм подкачки). Стек же это служебная непрерывная структура данных. Основное предназначение это сохранение и восстановление при входе в подпрограммы. При этом сохраняются как минимум адрес возврата и состояние регистров процессора. Причем это происходит именно через стековый механизм: они кладутся на стек, а когда надо - по одному снимаются. По историческим причинам стек растет вниз - от конца доступной памяти к началу. Чтобы локальные переменные разных функций (особенно при рекурсии) не путались, они размещаются там же, в стеке, но доступ к ним идет напрямую. Низкоуровневая работа со стеком довольно хитрая и отличается от компилятора к компилятору, я с этим глубоко не разбирался. Вот область стека доступна программе для записи в произвольную область. Правда, учитывая что она активно используется компилятором, пользоваться этим не стоит. Кроме того, объем стека довольно невелик. По умолчанию в Linux он составляет около 8 МБ.
0
|
|
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
||||||
| 02.12.2017, 15:57 [ТС] | ||||||
|
1. Так, получается что когда у нас на этапе линковки у каждой иснтрукции, переменной рассчитывается смещение, относительно базового адреса, затем при запуске exe выделяется память под "это все" при помощи страничной организации памяти - это куча? Что конкретно в ней хранится? Команды для процессора?
2. Исходя из чего назначается область памяти стека для конкретной программы?Откуда этот адрес берется? Во время компиляции? 3. При выходе из ф-ции лок переменные удаляются из стека? 5. Для моей программы что будет в стеке, а что в куче?
7. При закрытии exe файл удаляется? 8. Правда, что если ты выделил малоком память без фри , то при закрытии exe ОС все равно почистит память. Это плохая практика, но все же?
0
|
||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 02.12.2017, 16:34 | |||
|
0
|
|||
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|||||||||
| 02.12.2017, 17:00 | |||||||||
|
0
|
|||||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,094
|
|||||||||||||
| 02.12.2017, 17:02 | |||||||||||||
|
Про страничную организацию памяти просто забудьте. Вы занимаетесь прикладным, а не системным программированием.
loc_var в стеке dyn_var в куче. Точнее, сам указатель все еще в стеке, но вот указывает на кучу.
0
|
|||||||||||||
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|
| 02.12.2017, 23:41 [ТС] | |
|
На рисунке то, что я выделил красным - это куча?
Регистры переменных, это регистры процессора? Получается при загрузке лок. переменных в память они по возможности загружаются именно в них, а вот если их не хватает - то в стек? То есть идея такая: 1. Написали программу, у каждой инструкции, переменной есть свое смещение. 2. При запуске exe ОС выделяет память под это: Сегмент стека, сегмент данных и сегмент кодов. 3. В сегменте кодов хранятся инструкции для процессора из нашей программы 4. В сегменте данных хранятся данные (переменные глобальные), но могут и локальные? 5. В стеке хранятся лок. переменные, если при регистров не хватает, указатели на данные из сегмента данных. 6. При вызове ф-ции локальные переменные берутся из стека или из регистров (если их хватило) 7. Затем, дойдя до инстр. RET у этих регистров или ячеек в стеке можно данные перезаписать 8. При вызове следующей ф-ции лок. пер опять пишуться в регистры процессора, при нехватке в стек "на место предыдущих" 9. После закрытия exe, вся память, которая была выделена проге освобождается. // 10. malloc() realloc() calloc() работают неявно? То есть под объявлением переменной int x=10 скрывается malloc()? Когда мы хотим динамическое выделение (самое медленное) - скажем при вводе данных с клавиатуры, у нас в куче (сегмент данных см. скрин) по мере ввода выделяется память доп.
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 02.12.2017, 23:45 | |
|
Как сегмент кода может быть кучей?
malloc() работает явно.
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 02.12.2017, 23:48 | ||
|
0
|
||
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|
| 02.12.2017, 23:50 [ТС] | |
|
А по поводу остального? Значит куча - это сегмент данных
0
|
|
|
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
|
|
| 03.12.2017, 00:19 | |
|
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 03.12.2017, 00:21 | |||
Сообщение было отмечено prado777 как решение
Решение1) Только в exe файле все же секции, а не сегменты. 4) Локальные переменные в стеке, а не в загруженной из exe секции данных. 6) Ну, вернее процессор постоянно жонглирует этими переменными одни выгружая в стек, другие наоборот загружая в регистры. 7) Стандартная практика - при вызове функции состояние регистров сохраняется в стек, при RET возвращается как было.
1
|
|||
|
5 / 5 / 1
Регистрация: 20.11.2017
Сообщений: 51
|
|
| 03.12.2017, 00:24 [ТС] | |
|
Спасибо!
0
|
|
|
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
|
|
| 03.12.2017, 01:19 | |
|
0
|
|
| 03.12.2017, 01:19 | |
|
Адресация переменных: найти и исправить ошибку в коде
Сегментная адресация памяти Туториал по написанию реальной программы Адресация памяти, помогите разобраться Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|