постоянная память и кучная память - PullRequest
3 голосов
/ 10 июня 2010

AFAIK, строковые литералы хранятся в постоянной памяти только для языка Си. где это на самом деле присутствует на оборудовании.

согласно моей куче знаний на RAM. Исправьте меня, если я ошибаюсь.

Насколько отличается куча от только для чтения памяти?

это зависит от ОС?

Ответы [ 4 ]

3 голосов
/ 10 июня 2010

Обычно это делается с помощью аппаратного обеспечения.

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

Таким образом, ОС / загрузчик следит за тем, чтобы страницы, на которых находятся строковые литералы, были помечены как доступные только для чтения.

Куча и постоянная память - это ортогональные проблемы.

1 голос
/ 10 июня 2010

Это зависит от операционной системы и оборудования.Спецификация говорит, что они могут быть помещены в постоянную память, а не должны быть.Если вы пишете C для простого встраиваемого устройства, то строки помещаются в ROM, и оперативная память выделяется из RAM;они физически разделены ( Гарвард ).Если это типичный Unix-подобный компьютер, то существует подсистема виртуальной памяти, которая преобразует логические адреса в физические адреса на страницах и может пометить некоторые страницы только для чтения и некоторые исполняемые, но сама память может быть либо данными, либо инструкциями (Фон Нейман ).

0 голосов
/ 10 июня 2010

С точки зрения hw, RAM - это RAM, и она может быть R / W.Память «только для чтения» - это атрибут, устанавливаемый программным обеспечением;в некоторых архитектурах (почти всех, к которым мы привыкли) существует аппаратная поддержка, позволяющая сделать часть памяти недоступной для записи (в том смысле, что при попытке доступа к адресу внутри этой памяти возникает «исключение»).

0 голосов
/ 10 июня 2010

Обычно это обычная виртуальная память процесса с набором защиты от записи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...