Как постоянная память реализована в C?

Я думаю строка, которую необходимо добавить к .emacs,

(setq default-directory "C:/Documents and Settings/USER NAME/Desktop/" )

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

23
задан Peter Mortensen 4 December 2012 в 08:24
поделиться

6 ответов

Это не особенность языка C , а особенность совместной работы компилятора / компоновщика и операционной системы.

Когда вы компилируете такой код, происходит следующее :

  • Компилятор поместит строку в секцию данных только для чтения.

  • Компоновщик собирает все данные в таких секциях только для чтения и помещает их в один сегмент. Этот сегмент находится в исполняемом файле и помечен атрибутом «только для чтения».

  • Теперь идет загрузчик исполняемого файла операционной системы. Он загружает исполняемый файл (точнее, отображает его в память). Как только это будет сделано, загрузчик обходит разделы и устанавливает права доступа для каждого сегмента. Для сегмента данных только для чтения он, скорее всего, отключит доступ для выполнения кода и записи. Код (например, ваши функции) получает права на выполнение, но не имеет права записи. Обычные данные, такие как статические переменные, получают доступ для чтения и записи и так далее ...

Вот как это делают современные операционные системы.

Как уже говорилось, это не особенность языка Си. Если вы скомпилируете ту же задачу для DOS, например, программа будет работать, но защита от записи будет невозможна, потому что загрузчик DOS не знает о разделах только для чтения.

32
ответ дан 29 November 2019 в 01:45
поделиться

Исполняемые файлы содержат две части: раздел .data, содержащий глобальные переменные, и раздел .text, содержащий фактический машинный код.

Строки помещаются в раздел .data. Когда C видит «Hello world», он помещает строку «Hello world» в сам исполняемый файл и заменяет экземпляр «Hello world» в программе на адрес, по которому эта строка в итоге загружается.

сказал это, я не уверен, почему он доступен только для чтения - теоретически программа должна иметь возможность изменять свою собственную память ..

6
ответ дан 29 November 2019 в 01:45
поделиться

Истинная постоянная память реализуется подсистемой памяти ОС. ОС может пометить определенные страницы как доступные только для чтения.

4
ответ дан 29 November 2019 в 01:45
поделиться

Пример того, как это сделать в Linux, приведен на странице 179 в Advanced Linux Programming , авторы Марк Митчелл, Джеффри Олхэм и Алекс Самуэль.

2
ответ дан 29 November 2019 в 01:45
поделиться

Как отмечали другие люди, то, сохраняется ли содержимое константных строк в постоянной памяти, определяется операционной системой, компилятором и архитектурой микросхемы.

Точнее, стандарт C определяет, что строки в кавычках считаются имеющими тип «const char []» (или слова на этот счет, у меня нет стандарта под рукой).

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

На практике это означает, что программа C или C ++, которая хочет быть переносимой, должна избегать изменение постоянных строк.

Как правило, компилятор не позволяет изменять содержимое "const". переменные, поэтому в большинстве случаев вы можете рассматривать «const» как «только для чтения». К сожалению, для char * и const char * есть особое исключение, в основном по историческим причинам. Это означает, что такой код:

char *x = "Hello, World";
*x = 'h';

будет компилироваться без ошибок или предупреждений, даже если он вызывает неопределенное поведение.

1
ответ дан 29 November 2019 в 01:45
поделиться

Вы можете попробовать что-нибудь вроде

s[4] = '0';

и посмотреть, говорит ли он «hello w0rld» при вызове

puts(s);

. Если это вызывает немедленную ошибку сегментации или исключение предотвращения выполнения данных, то, вероятно, это только чтение. (Если система позволяет вам это избежать, это не значит, что это хорошая идея.)

0
ответ дан 29 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: