Другие языки программирования и технологии

Как операционная система знает что программа выполнила недопустимую операцию?

Начиная с OS/2, Windows NT 3.1 и Windows 95 операционная система знает, что при выполнение программы произошёл сбой. А MS-DOS вместо того чтобы перестать выполнять приложения и выйте в command.com напрочь зависала, иногда портилась файловая система и терялись файлы.
Через Page Fault. В многозадачных ОС программы выполняются в своих независимых адресных пространствах, имеющих ограниченный набор адресов. При переключении контекста процессора на поток другого процесса полностью подменяется таблица страниц, и процессы не видят адресов друг друга. Но область памяти ядра видна всем процессам (это делается для избежания переключения контекста при обработке прерываний). Страницы памяти ядра помечены более высоким уровнем доступа, так, что только код ядра имеет к ним доступ.

Чайническая фраза микрософта "недопустимая операция" означает, что программа обратилась к памяти по адресу, который не принадлежит её адресному пространству (либо это память ядра, либо - сегмент кода, который обычно защищается от записи, либо - попытка записи в другой участок памяти, помеченный только для чтения (например, отмапленный в память файл в режиме только для чтения), либо - вообще неопределённый для программы адрес). Тогда процессор генерирует прерывание (в разных ОС называемое Page Fault, Segmentation Violation и т.п.), которое обрабатывается ядром операционки. И тогда уже в программе генерируется исключение (в Unix - сигнал). Если оно не обрабатывается программой, то процесс завершается с ошибкой.

Бывают и "легитимные" случаи возникновения пэйдж фолтов, например, обращение к странице, выгруженной в файл подкачки, или (в Unix) - первая попытка записи в общую страницу родительского и дочернего процессов. В первом случае требуемая страница подгружается из файла, а во втором - делается её копия для процесса, пытающегося её модифицировать. После этого инструкция, вызвавшая прерывание, рестартуется.

В досе все программы толклись в одном и том же адресном пространстве, и каждая программа имела доступ ко всей памяти - и своей, и других программ, и ядра ОС, и отображаемой памяти устройств. Поэтому можно было писать, что угодно и куда угодно, и соответственно, читать всю память.
Евгений Широченков
Евгений Широченков
87 571
Лучший ответ
Потому что в дос был реальный режим, а в винде защищённый.
Михаил Ящук
Михаил Ящук
62 355