Подтвердить что ты не робот

Распределение памяти памяти

Я пытаюсь изучить язык ассемблера, и мне нужно разъяснить что-то. Пожалуйста, поправьте меня, если я ошибаюсь в этом, потому что я мало знаю о сборке.

Все обучающие программы, которые я смотрю, имеют переменные программ сборки, назначенные для адреса памяти, такого как 0x0000, и я могу понять, что вы должны вручную назначать адреса памяти в сборке, но как вы знаете, какой адрес использовать?

Очевидно, что имеет смысл начать с наименьшего адреса памяти, но что, если назначаемая переменная больше, чем память, доступная в 0x0000? Переместит ли переменная на 0x0001 или 0x0002? Если бы это произошло, это не помешало бы другим переменным назначать пробелы с одинаковой нумерацией (или вы не должны назначать их близкими)?

Если у меня есть две программы, написанные в процессе сборки одновременно (в современной ОС), и я использовал одни и те же адреса памяти в обеих программах, будет ли одна программа конфликтующей с другой, или же ОС просто назначит доступную адрес памяти независимо от того, что было написано в программе?

Любая информация по этому вопросу оценена.

4b9b3361

Ответ 1

Ответ на вторую часть вашего вопроса (на большинстве современных ОС) - это виртуальная память.

Вы начинаете с аппаратного уровня с физической памятью. Это то, что ты можешь на самом деле тыкать пальцем. Это то, что видит операционная система. Операционная система позволяет запускать процессы с абстракцией, называемой виртуальной памятью.

Каждый процесс получает свое собственное пространство виртуальной памяти. Поэтому он может притворяться, что это единственный процесс, и он имеет массу памяти. Затем каждый раз, когда вы получаете доступ к памяти, вы указываете виртуальный адрес, который сопоставляется с физическим адресом. Операционная система хранит таблицу, для которой виртуальный адрес сопоставляется с фактическими физическими адресами в ОЗУ. Как правило, это делается с использованием некоторых специальных аппаратных средств (MMU, модуль управления памятью) по соображениям производительности, но вы также можете сделать это на 100% в программном обеспечении.

Итак, когда вы говорите 0x000 в своей программе, это виртуальный адрес. При чтении или записи он переходит на физический адрес компьютера. Таким образом, в другом процессе один и тот же виртуальный адрес 0x000 отображает другой физический адрес. Эта система позволяет вам писать свою программу, не зная точно, сколько оперативной памяти доступно или какой адрес будет загружен в вашу программу. Это также предотвращает вашу программу из памяти, которая принадлежит другой программе.

Что касается первой части, абсолютно. Различные типы данных занимают разные объемы памяти. Вы должны знать, сколько места вам нужно, когда вы размещаете свои структуры данных. Также есть вопросы по выравниванию байтов. Многобайтовые типы данных (например, числа с плавающей запятой) часто должны начинаться с адреса, который делится на 2 или 4 или числа байтов, необходимых для хранения поплавка - это требование процессора или ОЗУ. Таким образом, вы не можете просто объединить все свои данные вместе, один байт после следующего, вы должны выложить его в определенном порядке, например, собрать вместе кусочки головоломки, если вы хотите свести к минимуму неиспользованную память.

Ответ 2

Это не совсем ответ, но в этой книге есть ответ. Я могу только порекомендовать его. Он научит вас основам, как это название говорит о программировании с нуля.

ProgrammingGroundUp

Ответ 3

Зависит от цели и типа памяти (RAM, ROM и т.д.), о которой вы говорите. Если вы говорите о ОЗУ в небольшом встроенном проекте, вы можете просто иметь несколько файлов для отслеживания, а листы данных для микроаудитора будут сообщать вам о различных адресах области памяти. В случае, когда имеется несколько "модулей", вы должны использовать компоновщик для связывания объектных файлов с исполняемым файлом. Компоновщик может повторно назначить адрес памяти, чтобы они не перекрывались, или вы можете иметь центральный файл, где определены все ячейки памяти, а другие модули используют это как ресурс. Сожалею. Это большой вопрос с большим количеством ответов.