Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Страничная организация памяти



Отношение между виртуальной и реальной памятью

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

 

ВОПРОС 27

 

Защита памяти (англ. Memory protection) — это способ управления правами доступа к отдельным регионам памяти. Используется большинством многозадачных операционных систем. Основной целью защиты памяти является запрет доступа процессу к той памяти, которая не выделена для этого процесса. Такие запреты повышают надежность работы как программ так и операционных систем, так как ошибка в одной программе не может повлиять непосредственно на память других приложений. Следует различать общий принцип защиты памяти и технологии ASLR или NX-бит.

Альтернативное определение Защита памяти - избирательная способность предохранять выполняемую задачу от записи или чтения памяти предназначенной другой программе.

 

Сегментирование памяти[править | править вики-текст]

Основная статья: Сегментная защита памяти

Сегментирование памяти означает разбиение компьютерной памяти на фрагменты переменной длины, называемые сегментами (см Сегментная адресация памяти).

В архитектуре x86 есть несколько режимов сегментации, которые могут использоваться для защиты памяти.[1] В процессорах архитектуры x86, существуют глобальная дескрипторная таблица и локальная дескрипторная таблица, описывающие сегменты памяти. Указатели на сегменты в подобных процессорах хранятся в специализированных сегментных регистрах. Изначально их было 4: CS (code segment), SS (stack segment), DS (data segment) и ES (extra segment); затем добавили ещё два: FS и GS.[1]

 

Страничная память[править | править вики-текст]

Основная статья: Страничная организация памяти

При страничной организации памяти, все адресное пространство делится на фрагменты фиксированного размера, называемые страницами. Их размер кратен степени 2, и обычно равен 4096, но возможно использование одновременно нескольких размеров страниц (4 кб, 2-4МБ в x86, от 4 до 256 кб в IA64). При помощи механизмавиртуальной памяти, каждая страница виртуальной памяти может быть поставлена в соответствие любой странице физической памяти, либо помечена как защищенная. При помощи виртуальной памяти возможно использование линейного адресного пространства виртуальной памяти, которое на самом деле образовано фрагментированными участками адресного пространства физической памяти.

Многие архитектуры, использующие страничную организацию памяти, в том числе и наиболее популярная x86, реализуют защиту памяти на уровне страниц.

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

При таком отображении, приложение не имеет возможности обратиться к странице, отсутствующей в её таблице страниц. Если при обращении по произвольному адресу не было найдено подходящее отображение, происходит исключительная ситуация page fault (PF).

Следует заметить, что page fault — это не фатальное событие. Эти прерывания могут использоваться не только для защиты памяти, но и другими способами. Так, ОС, перехватив PF, может загрузить страницу в память, например, если она была ранее выгружена на жесткий диск в процессе подкачки страниц, после чего приложение может продолжать работу. Такая схема позволяет прозрачным способом увеличить количество доступной приложениям памяти.

 

ВОПРОС 28

 

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

1.Внешние;

.Внутренние;

.Программные.

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

Например прерывание с номером 9 - прерывание от клавиатуры, которое генерируется при нажатии и при отжатии клавиши. Используется для чтения данных с клавиатуры. Обозначается в ОС как IRQ1, где IRQ - обозначение прерывания, а 1 - приоритет прерывания.

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

Предположим, что в момент поступления сигнала прерывания от некоторого источника программа А находится в решении. В результате управление автоматически передается обработчику прерываний. После завершения обработки управление может быть снова передано в ту точку программы А, где ее выполнение было прервано:

 

1.2Векторы прерываний

 

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

Таблица векторов прерываний занимает первый килобайт оперативной памяти - адреса от 0000: 0000 до 0000: 03FF. Таблица состоит из 256 элементов - FАR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором - адрес сегмента обработчика прерывания. Векторами являются просто полные адреса памяти программы (в сегментированной форме), которая должна быть активизирована в случае возникновения прерывания.

Прерыванию с номером 0 соответствует адрес 0000: 0000, прерыванию с номером 1 - 0000: 0004 и т.д. Адрес такой состоит из пары 2-байтовых слов, поэтому каждый из векторов занимает четыре байта.

Можно просмотреть таблицу векторов прерываний в компьютере, если воспользоваться программой DЕBUG. Используйте команду D для вывода содержимого начала памяти: D 0: 0. Программа DЕBUG покажет вам первые 128 байтов или 32 вектора, которые могут иметь вид наподобие следующего:

 

 

1.3Механизм обработки прерываний

 

При обработке каждого прерывания должна выполняться следующая последовательность действий:

·Восприятие запроса на прерывание: прием сигнала и идентификация прерывания.

·Запоминание состояния прерванного процесса: определяется значением счетчика команд (адресом следующей команды) и содержимым регистров процессора.

·Передача управления прерывающей программе (в счетчик команд заносится начальный адрес подпрограммы обработки прерываний, а в соответствующие регистры - информация из слова состояния процессора).

·Обработка прерывания.

·Восстановление прерванного процесса и возврат в прерванную программу.

Главные функции механизма прерывания:

1.распознавание или классификация прерываний.

2.передача управления соответственно обработчику прерываний.

.корректное возвращение к прерванной программе (перед передачей управления обработчику прерываний содержимое регистров процессора запоминается либо в памяти с прямым доступом либо в системном стеке).

1.4Типы прерываний

 

Прерывания, возникающие при работе вычислительной системы, можно разделить на 4 группы:

 

 

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

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

Внешние прерывания возникают по сигналу какого-либо внешнего устройства например:

·Прерывание, которое информирует систему о том, что требуемый сектор диска уже прочитан, его содержимое доступно программе.

·Прерывание, которое информирует систему о том, что завершилась печать символа на принтере и необходимо выдать следующий символ.

·Прерывания по нарушению питания.

·Нормальное завершение некоторой операции ввода-вывода (нажатие клавиши на клавиатуре).

·Прерывание по таймеру.

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

Маскируемые и немаскируемые внешние прерывания

Существуют два специальных внешних сигнала среди входных сигналов процессора, при помощи которых можно прервать выполнение текущей программы и тем самым переключить работу центрального процессора. Это сигналы NMI (Nоn Mаsсаblе Intеrrupt, немаскируемое прерывани)INTR (intеrrupt rеquеst, запрос на прерывание).

Соответственно внешние прерывания подразделяются на два вида: немаскируемые и маскируемые.

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

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

Внутренние прерывания вызываются событиями, которые связаны с работой процессора и являются синхронными с его операциями, а именно прерывание происходит, когда:

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

·при наличии в поле кода не задействованной двоичной комбинации.

·при делении на нуль.

·при переполнении или исчезновении порядка.

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

Программные прерывания.

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

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

2.Исключения

 

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

прерывание исключение программа ошибка

2.1Общее понятие исключительной ситуации

 

Во время выполнения программы могут возникать ситуации, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления в соответствии с базовым алгоритмом невозможным или бессмысленными. Классические примеры подобных ситуаций приведены ниже Нулевое значение знаменателя при выполнении операции целочисленного деления. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению задачи. Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны. Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально. Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может озаботиться сохранением данных.Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.

 

2.2Виды исключительных ситуаций

 

Исключительные ситуации, возникающие при работе программы, можно разделить на два основных типа: синхронные и асинхронные, принципы реакции на которые существенно различаются. Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы. Так, ошибка чтения файла или коммуникационного канала, нехватка памяти - типичные синхронные исключения, так как возникают они только в операции чтения из файла или из канала или в операции выделения памяти соответственно. Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретно инструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питания или поступление новых данных. Некоторые типы ошибок могут быть отнесены как к синхронным, так и к асинхронным. Например, инструкция деления на нуль на многих программно-аппаратных платформах приводит к синхронному исключению, но на некоторых платформах за счёт глубокой конвейеризации исключение может оказаться асинхронным.

 

2.3Обработчики исключений

 

В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общей реакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачей пользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным и универсальным обработчиком исключений становится операционная система. Например, в операционную систему Windows встроена утилита Dr. Watson, которая занимается сбором информации об необработанном исключении и ее отправкой на специальный сервер компании Microsoft. Возможно игнорирование исключительной ситуации и продолжение работы, но такая тактика опасна, так как приводит к ошибочным результатам работы программ или возникновению ошибок впоследствии. Например, проигнорировав ошибку чтения из файла блока данных, программа получит в своё распоряжение не те данные, которые она должна была считать, а какие-то другие. Результаты их использования предугадать невозможно. Обработка исключительных ситуаций самой программой заключается в том, что при возникновении исключительной ситуации, управление передаётся некоторому заранее определённому обработчику - блоку кода, процедуре, функции, которые выполняют необходимые действия. Существует два принципиально разных механизма функционирования обработчиков исключений.

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

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

Неструктурная обработка исключений. Неструктурная обработка исключений реализуется в виде механизма регистрации функций или команд-обработчиков для каждого возможного типа исключения. Язык программирования или его системные библиотеки предоставляют программисту как минимум две стандартные процедуры: регистрации обработчика и разрегистрации обработчика. Вызов первой из них «привязывает» обработчик к определённому исключению, вызов второй - отменяет эту «привязку». Если исключение происходит, выполнение основного кода программы немедленно прерывается и начинается выполнение обработчика. По завершении обработчика управление передаётся либо в некоторую наперёд заданную точку программы, либо обратно в точку возникновения исключения (в зависимости от заданного способа обработки - с возвратом или без). Независимо от того, какая часть программы в данный момент выполняется, на определённое исключение всегда реагирует последний зарегистрированный для него обработчик. В некоторых языках зарегистрированный обработчик сохраняет силу только в пределах текущего блока кода (процедуры, функции), тогда процедура разрегистрации не требуется.

Неструктурная обработка - практически единственный вариант для обработки асинхронных исключений, но для синхронных исключений она неудобна: приходится часто вызывать команды установки/снятия обработчиков, всегда остаётся опасность нарушить логику работы программы, пропустив регистрацию или разрегистрацию обработчика.

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

 

 

ВОПРОС 29

 

 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 694; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.047 с.)
Главная | Случайная страница | Обратная связь