Почему местоположение 0x00000000 доступно, если это флэш-память

Как я знаю, ячейка памяти 0x00000000 не доступна через указатель в C, но недавно в моем проекте я смог получить доступ к нулевому расположению, используя указатель.
Нулевым местом является флэш-память.
Но согласно посту Почему нулевой адрес используется для нулевого указателя? , ссылка на ноль через указатель является зарезервированным значением. Итак, мой вопрос заключается в том, что это зарезервированное значение, почему это не выполняется для памяти, отображаемой для мигания в нулевом местоположении?

Процессор: TMS470Rxx

ОПЕРАЦИОННЫЕ СИСТЕМЫ : Micro C OS-II

Спасибо

-6

Решение

Решение о том, что происходит при использовании того или иного адреса, является довольно сложным. Это зависит от архитектуры процессора, ОС и иногда «что делает какое-то программное обеспечение».

Процессор может не иметь защиты памяти, или нулевой адрес действительно может быть «использован для чего-то» (в реальном режиме x86, в котором работает DOS, нулевой адрес содержит таблицу векторов, где происходит прерывание и такой переход, поэтому он невероятно чувствителен к будучи перезаписанным — следовательно, плохо написанные программы могут и могут привести к сбою не только самих себя, но и всей машины в DOS).

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

ОС может разрешить доступ к нулевому адресу время от времени:
Много лет назад у меня была ошибка в драйвере Windows, в котором использовался NULL-указатель, и что в этой конкретной ситуации адрес 0 не вызывал сбой. Сбой произошел намного позже, когда содержимое адреса нуля использовалось для чего-то — в этот момент система показала синий экран (по крайней мере, пока я не подключил отладчик и не отладил проблему, а затем исправил ее, чтобы она не пыталась использовать NULL-указатель — я не помню, пришлось ли мне выделять память или просто пропускал этот бит, если указатель был NULL).

Выбор 0 для NULL основан на комбинации «мы должны выбрать какое-то значение (и нет ни одного значения, которое может быть на 100% уверенным, что никто никогда не будет использовать)» — особенно на машинах с 16 или 32 диапазон адресов. Обычно, однако, нулевой адрес, если он используется, содержит что-то «специальное» (векторная таблица для прерываний, загрузочный код для процессора или подобное), так что вы вряд ли сможете осмысленно хранить там данные. C и C ++, так как языки не требуют, чтобы к NULL-указателям нельзя было получить доступ [но также не «позволял вам» свободно обращаться к этому местоположению], просто это значение можно использовать как «указатель, который ни на что не указывает «- и спецификация также предусматривает случай, когда ваше значение NULL не является фактически нулевым. Но компилятор должен иметь дело с «ZERO означает NULL для указателей, поэтому замените его на X».

Нулевое значение, по крайней мере иногда, имеет преимущество перед другими значениями — в основном, у многих процессоров есть специальные инструкции для сравнения или определения нуля.

1

Другие решения

Существует много платформ, где нулевой адрес ведет себя иначе, чем на обычном настольном ПК.

Существуют микроконтроллеры, в которых аппаратные устройства отображаются в памяти на нулевом уровне устройства.

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

Разные платформы работают по-разному.

2

По вопросам рекламы [email protected]