Когда я изучал внутреннее устройство исполняемых файлов у меня возник один вопрос. Зачем в них вводится деление на секции? Ведь данные по сути загружаются в одну и ту же область памяти.
У данных, кода, стека и других специальных типов секций разное назначение. Понятие секции позволяет назначить им разные атрибуты.
okante В основном для того, чтобы они имели разные права доступа. Чисто на всякий случай - чтобы данные в секции .data случайно не обработались как исполняемый код, или чтобы случайно не модифицировать секции .rdata или секцию импорта. Лично я в своих программах объединяю все секции в одну, благодаря чему exe-шник становится на пару килобайт легче. К сожалению нельзя изменить права доступа к стеку, что приводит к возможности существования ошибок типа переполнения буфера.
drmist Почему нельзя? Это притянутая за уши отмазка Как и заполнение дыр между сегментами в секции с помощью 0xCC. Вообще, сам Вон Ньюман велел хранить данные и код отдельно друг от друга. Потроны доступа к данным и коду обычно различаются. Поэтому, раздельное хранение данных и кода позволяет более эффективно использовать кеш, IMHO. К стеку это тоже имеет непостредственное отношение.
Я понял проще все это, но как известно, каждый понимает по разному! Как понял я: Человек привык разграничивать все, к примеру - Начальник\подчиненный, Черное\белое В программировании тоже он пришел к разграничению множетсва понятий. Потому что разделяя сложную задачу на ряд простых, то поняв одну за другой простые задачи легче понять сложную, чем не разбив ее. Казалось бы, а что на нам мешает держать все в одной секции как в .com файле? Но тут есть различия и нюансы: 1. Как обезопасить программы друг от друга? 2. Как понять что это ? Код или данные? 1. А почему они друг друга боятся? Да потому что либо программист может написать не верный код или другой программист побьет его программу (к примеру неверно работающий конвертер из wav 2 mp3 или вирус). Следовательно надо разделить прогрммы разных программистов друг от друга! Но причем здесь секции? Да тут такое же мышление, чтобы код не выполнялся в секции данных! Он не там лежит! В результате не верного программирования, когда программист точно знает что это код, а не данные ему проще отлаживать программу, а представь что в результате ошибочных действий процессор понял, что это не данные, а код? 2 Когда происходит компиляция, проще сделать в одной куче код, а вдругой данные. А затем зачем напрягаться, раз есть по разным местам, пусть и будут по разным местам и назовем их секциями кода и данных. Хочу сказать, что современный процессор умеет предсказывать поведение кода! От этого факта, тоже много мыслей, как хорших, так и не очень )
И еще: 1. Секции можно "размазать" по памяти весьма замысловатым образом 2. Секция неинициализированных данных может иметь ОЧЕНЬ большой размер, не увеличивая EXE 3. Секция может быть расшареной между instance'ами одного и того же EXE Quantum Фон Нойман
Ещё есть момент с адресом загрузки. Например, в одном файле могут быть небольшие куски кода/данных которые грузятся в области памяти разделённые несколькими мегабайтами адресного пространства. То есть, если попробовать решить проблему не секциями, а "образом памяти", то получится огромный файл и нолями. А кроме того, в embedded системах, в промежутке между адресами вышеупомянутых блоков, просто может ничего не быть. То есть, писать туда нельзя. След-но нужны секции. Ну и, как сказал Quantum, часто (например на PowerPC) ставят разные права доступа к страницам. То есть, из секции кода можно исполнять и читать, но нельзя туда писать. А из секции данных и стека нельзя исполнять. А вот const секция, доступна только для чтения.
Вообще-то он всегда Джон фон Нейман был, причем фон - это баронская приставка. А вот на еврейском точно не Ньюман http://www.rus-edu.bg/shp/edu/online/inf/bookinf/theory/chapter3/neumann.html Все машины в основном сегодня не фон-Неймановские - отсюда и вирусы.
Quantum Как можно "von" произносить как "фон"? Да очень просто - по правилам немецкой грамматики. Вообще во избежание путаницы фамилии нужно произносить на том языке, на котором их давали, а не с английско-нижегородским прононсом.