Память микропроцессорной системы выполняет функцию временного или постоянного хранения данных и команд. Объем памяти определяет допустимую сложность выполняемых системой алгоритмов, а также в некоторой степени и скорость работы системы в целом. Все чаще в составе микропроцессорных систем используется флэш-память
Для организации памяти микропроцессорных систем применяются постоянные запоминающие устройства ( ПЗУ)
Память проги начального запуска программы boot является машинно-зависимой операцией. На большинстве машин эта операция поддерживается базовой системой ввода/вывода (Basic Input/ Output System — BIOS). BIOS является резидентным в энергонезависимой памяти и вызывается автоматически при запуске процессора. Ожидается, что средства, предоставляемые BIOS, должны поддерживать начальную загрузку автономных программ.
Большинство систем BIOS при перезагрузке выполняет также диагностические операции, чтобы убедиться, что аппаратное обеспечение функционирует правильно.
Урок 43. Виртуальная память
BIOS не понимает формат файловой системы FreeBSD. Вместо этого процедура начальной загрузки считывает из зарезервированной области загрузочного диска программу. Эта программа сразу же выполняет в FreeBSD программу boot. Последняя является автономной программой общего назначения, которую система может использовать для начальной загрузки и исполнения других автономных программ. Автономной (standalone) является такая программа, boot которая может работать без помощи ядра FreeBSD.
Автономные программы обычно компонуются с автономной библиотекой ввода/вывода, библиотекой, поддерживающей FreeBSD-подобный интерфейс ввода/вывода для различных аппаратных устройств. Автономная библиотека ввода/вывода предоставляет эти возможности через набор автономных драйверов устройств и библиотечных процедур, поддерживающих чтение файлов из файловых систем FreeBSD, которые находятся на устройствах. Программа boot хранится в месте, доступном BIOS, которое представляет собой несколько первых секторов системного диска.
После начальной загрузки и запуска программы boot она должна загрузить файл, содержащий исполняемый образ загружаемой программы, а затем должна запустить загруженную программу. Чтобы загрузить соответствующий файл, boot должна знать имя пути загружаемого файла и аппаратное устройство, на котором файл находится
Стековой называют память, доступ к которой организован по принципу: «последним записан — первым считан» (Last Input First Output — LIFO). Использование принципа доступа к памяти на основе механизма LIFO началось с больших ЭВМ. Применение стековой памяти оказалось очень эффективным при построении компилирующих и интерпретирующих программ, при вычислении арифметических выражений с использованием польской инверсной записи. В малых ЭВМ она стала широко использоваться в связи с удобствами реализации процедур вызова подпрограмм и при обработке прерываний.
Принцип работы стековой памяти состоит в следующем Когда слово А помещается в стек, оно располагается в первой свободной ячейке памяти. Следующее записываемое слово перемещает предыдущее на одну ячейку вверх и занимает его место и т.д. Запись 8-го кода, после H, приводит к переполнению стека и потере кода A. Считывание слов из стека осуществляется в обратном порядке, начиная с кода H, который был записан последним. Заметим, что выборка, например, кода E невозможна до выборки кода F, что определяется механизмом обращения при записи и чтении типа LIFO. Для фиксации переполнения стека желательно формировать признак переполнения.
Что такое динамическая память. Утечка памяти. Стек и куча. Статическая память. Обзорный урок #45
Перемещение данных при записи и считывании информации в стековой памяти подобно тому, как это имеет место в сдвигающих регистрах. С точки зрения реализации механизма доступа к стековой памяти выделяют аппаратный и аппаратно-программный (внешний) стеки.
ОЗУ и ПЗУ
По назначению микросхемы памяти делят на две группы: для оперативной запоминающих устройств (ОЗУ)и для постоянных запоминающих устройств (ПЗУ).Оперативные запоминающих устройства предназначены для хранения переменной информации: программ и чисел, необходимых для текущих вычислений. Такие ЗУ позволяют в ходе выполнения программы заменять старую информацию новой. По способу хранения информации ОЗУ разделяют на статические и динамические. Статические ОЗУ, элементами памяти в которых являются триггеры, способны хранить информация неограпичеппое время (при условии, что имеется напряжение питания)
Постоянные ЗУ предназначены для хранения постоянной информации: подпрограмм, микропрограмм, констант и т.п. Такие ЗУработают только в режиме многократного: считывания. По способу прогрвммирования, т.е. занесения информации, пзУ разделяет на масочные (заказные), программируемые пользователем (ППЗУ) и репрограммнруемые (РПЗУ).
Первые две разновидности ПЗУ программируют однократно и они не допускают последующего изменения занесенной информации. По устройству накопителя ПЗУ существенно отличаются от ОЗУ, прежде всего тем, что место ЭП в накопителе Пзу занимают перемычки между шинами в вида пленочных проводников, диодов или транзисторов. Наличие перемычки соответствует 1, ее отсутствие 0, либо наоборот, если выходы ИС инверсные.
специальная область памяти — это таблица векторов прерываний.
Вообще, понятие прерывания довольно многозначно. Под прерыванием в общем случае понимается не только обслуживание запроса внешнего устройства, но и любое нарушение последовательной работы процессора. Например, может быть предусмотрено прерывание по факту некорректного выполнения арифметической операции типа деления на ноль. Или же прерывание может быть программным, когда в программе используется команда перехода на какую-то подпрограмму, из которой затем последует возврат в основную программу. В последнем случае общее с истинным прерыванием только то, как осуществляется переход на подпрограмму и возврат из нее.
Любое прерывание обрабатывается через таблицу векторов (указателей) прерываний. В этой таблице в простейшем случае находятся адреса начала программ обработки прерываний, которые и называются векторами. Длина таблицы может быть довольно большой (до нескольких сот элементов). Обычно таблица векторов прерываний располагается в начале пространства памяти (в ячейках памяти с малыми адресами). Адрес каждого вектора (или адрес начального элемента каждого вектора) представляет собой номер прерывания.
9.Основные методы адресации:
Широко используются следующие методы адресации операнда с различной кратностью обращения (R) в память:
1. Непосредственная (R = 0).
3. Косвенная (R > 2).
Непосредственная адресация операнда. При этом способе операнд располагается в адресном поле команды. Обращение к регистровой памяти (РП) или оперативной памяти (ОП) не производится. Таким образом, уменьшается время выполнения операции, сокращается объем памяти. Непосредственная адресация удобна для задания констант, длина которых меньше или равна длине адресного поля команды.
Прямая адресация операндов. При этом способе адресации обращение за операндом в РП или ОП производится по адресному коду в поле команды, т.е. исполнительный адрес операнда совпадает с адресным кодом команды (Аи = Ак).
Обеспечивая простоту программирования, этот метод имеет существенные недостатки, так как для адресации к ячейкам памяти большой емкости (число адресов М велико) требуется «длинное» адресное поле в команде. Прямая адресация используется широко в сочетании с другими способами адресации. В частности, вся адресация к «малой» регистровой памяти ведется только с помощью прямой адресации.
Косвенная адресация операндов.При этом способе адресный код команды указывает адрес ячейки памяти, в которой находится не сам операнд, а лишь адрес операнда, называемый указателем операнда. Адресация к операнду через цепочку указателей (косвенных адресов) называется косвенной.
Адрес указателя, задаваемый программой, остается неизменным, а косвенный адрес может изменяться в процессе выполнения программы. Косвенная адресация, таким образом, обеспечивает переадресацию данных, т.е. упрощает обработку массивов и списковых структур данных, упрощает передачу параметров подпрограммам, но не обеспечивает перемещаемость программ в памяти
Индексная адресация.Для работы программ с массивами, требующими однотипных операций над элементами массива, удобно использовать индексную адресацию. Схема индексной адресации аналогична базированию путем суммирования (см. рис. 3.5).
В этом случае адрес i-гo операнда в массиве определяется как сумма начального адреса массива (задаваемого полем смещения С) и индекса И, записанного в одном из регистров РП, называемом теперь индексным регистром. Адрес индексного регистра задается в команде полем адреса индекса — Аин (аналогично Аб ).
В каждом i-м цикле содержимое индексного регистра изменяется на величину постоянную (часто равную 1). Использование индексной адресации значительно упрощает программирование циклических алгоритмов.
Для эффективной работы при относительной адресации применяется комбинированная индексация с базированием, при которой адрес операнда вычисляется как сумма трех величин (рис. 3.7):
Рис. 3.6.Схема формирования относительного адреса способом совмещения кодов базы и смещения.
Рис. 3.7 Схема формирования дополнительного адреса при индексной адресации и базировании: АИН — адрес индексного регистра.
Стековая память (стек) является эффективным элементом современных ЭВМ, реализует неявное задание адреса операнда. Хотя адрес обращения в стек отсутствует в команде, он формируется схемой управления автоматически по специальному правилу.
Автоинкрементная адресация очень близка к косвенной адресации, но отличается от нее тем, что после выполнения команды содержимое используемого регистра увеличивается на единицу или на два. Этот метод адресации очень удобен, например, при последовательной обработке кодов из массива данных, находящегося в памяти. После обработки какого-то кода адрес в регистре будет указывать уже на следующий код из массива. При использовании косвенной адресации в данном случае пришлось бы увеличивать содержимое этого регистра отдельной командой.
Автодекрементная адресация работает похоже на автоинкрементную, но только содержимое выбранного регистра уменьшается на единицу или на два перед выполнением команды. Эта адресация также удобна при обработке массивов данных. Совместное использование автоинкрементной и автодекрементной адресаций позволяет организовать память стекового типа (см. раздел 2.4.2).
Из других распространенных методов адресации можно упомянуть об индексных методах, которые предполагают для вычисления адреса операнда прибавление к содержимому регистра заданной константы (индекса). Код этой константы располагается в памяти непосредственно за кодом команды.
Отметим, что выбор того или иного метода адресации в значительной степени определяет время выполнения команды. Самая быстрая адресация — это регистровая, так как она не требует дополнительных циклов обмена по магистрали. Если же адресация требует обращения к памяти, то время выполнения команды будет увеличиваться за счет длительности необходимых циклов обращения к памяти. Понятно, что чем больше внутренних регистров у процессора, тем чаще и свободнее можно применять регистровую адресацию, и тем быстрее будет работать система в целом.
РЕГИСТЫ МПС
Регистр — блок памяти малого объема, встроенный в микропроцессор, к которому он адресуется независимо от шины адреса. Емкость регистра определяется длиной машинного слова, а время доступа к регистру значительно меньше, чем к ОЗУ.
Регистры могут иметь много различных назначений; некоторые ЭВМ даже позволяют программисту присваивать регистрам разнообразные частные функции. Большинство ЭВМ, однако, содержит несколько основных регистров: счетчик команд, регистр команд, регистр адреса памяти, аккумулятор, регистры общего назначения. индексные регистры, регистр условий, указатель стека.
Счетчик команд (СК) содержит адрес ячейки памяти, в которой находится очередная команда. Цикл выполнения команды начинается с того, что ЦП посылает содержимое счетчика команд в шину адреса; таким образом ЦП извлекает из памяти первое слово команды. При этом увеличивается на единицу содержимое счетчика команд и, таким образом, в следующем цикле команды из памяти будет извлечена следующая из последовательности команд. Если команда многобайтная, то ЦП увеличивает на 1 содержимое счетчика команд (инкрементирует) столько раз, сколько это нужно. Таким образом, ЦП извлекает из памяти и реализует команды последовательно, если только команда передача управления или условный переход не изменит содержимое счетчика команд.
Регистр команд сохраняет код команды до тех пор, пока она не будет дешифрирована.
Регистр адреса памяти содержит адрес данных в памяти. Адреса могут представлять собой часть команд или данные. Многие ЭВМ имеют по несколько регистров.
Аккумуляторы- это регистры временного хранения, которые используются в процессе вычисления. В большинстве ЭВМ, таких как калькуляторы, в аккумуляторе всегда содержится один из операндов арифметических операций. Электронно-вычислительная машина может также использовать аккумуляторы при выполнении логических операций.
Таким образом, аккумуляторы ЭВМ — это в основном наиболее часто используемые регистры. Многие из широко используемых ЭВМ имеют по одному аккумулятору; программы для таких ЭВМ затрачивают много команд и времени на пересылку данных в аккумулятор и из него. Большинство более совершенных ЭВМ имеет по несколько аккумуляторов; поэтому у программы нет необходимости многократно пересылать данные.
Регистры общего назначения выполняют различные функции. Они могут служить в качестве регистров временного хранения данных или адресов. Программисту предоставляется возможность определять их как аккумуляторы или как счетчики команд.
Индексные регистры используются для адресации данных. Содержимое индексного регистра складывается с адресом ячейки памяти, который содержится в команде. Затем сумма образует действительный адрес данных и исполнительный адрес.
Если содержимое индексного регистра изменяется, одна и та же команда может быть использована для обработки данных из ячеек памяти с различными адресами. Можно пересылать данные из одной области памяти в другую подобно тому, как если бы использовались индексные регистры. Некоторые ЭВМ имеют автоиндексацию, при помощи которой индексный регистр каждый раз, когда используется, автоматически увеличивает (автоинкрементация) или уменьшает (автодекрементация) содержимое на 1. Каждая команда в ЭВМ с индексными регистрами должна содержать признаки, указывающие используется ли в данной команде индексация. Если ЭВМ имеет более чем один регистр, команда должна также содержать указание, какой из регистров в данной команде используется.
Регистр кода условий или регистр состояния содержит набор одноразрядных признаков, которые отображают состояние ЦП или нескольких внешних входов или выходов. Эти признаки — основа для работы ЭВМ, принимающей решение. Различные ЭВМ имеют различное число и назначение признаков.
Большинство устаревших ЭВМ имеет один или два признака, так как это связано, прежде всего, со стоимостью аппаратных средств. Новейшие ЭВМ имеют по несколько признаков. ЦП может иметь признаки, которые могут быть изменены или сохранены извне при операциях ввода или вывода.
Регистр указателя стека SP — это 16-битовый регистр, который определяет смещение текущей вершины стека.
Он реализован в виде двух 8-битных регистров, доступных в пространстве памяти ввода-вывода.
По функциональному назначению, определяемому системой команд, МП делятся на универсальные и специализированные.
Универсальные МП способны реализовать любой алгоритм, который предварительно кодируется в системе команд данного МП. Они используются в качестве основных процессоров микроЭВМ. Следует отметить, что большинство универсальных МП аппаратно поддерживает только целочисленную арифметику. Арифметика же с плавающей точкой реализуется на них программно.
Специализированные МП служат для решения задач определенного класса. Приборы этого типа используются в качестве сопроцессоров, дополняющих основные процессоры, и выполняют роль акселераторов. Сопроцессор расширяет набор команд ЭВМ. Когда основной процессор получает команду, которая не входит в его рабочий набор, он передает управление сопроцессору с целью ее выполнения.
Источник: arhivinfo.ru
2.4.2. Функции памяти
Память микропроцессорной системы выполняет функцию временного или постоянного хранения данных и команд. Объем памяти определяет допустимую сложность выполняемых системой алгоритмов, а также в некоторой степени и скорость работы системы в целом. Модули памяти выполняются на микросхемах памяти (оперативной или постоянной). Все чаще в составе микропроцессорных систем используется флэш-память (англ. — flash memory), которая представляет собой энергонезависимую память с возможностью многократной перезаписи содержимого.
Информация в памяти хранится в ячейках, количество разрядов которых равно количеству разрядов шины данных процессора. Обычно оно кратно восьми (например, 8, 16, 32, 64). Допустимое количество ячеек памяти определяется количеством разрядов шины адреса как 2 N , где N — количество разрядов шины адреса.
Чаще всего объем памяти измеряется в байтах независимо от разрядности ячейки памяти. Используются также следующие более крупные единицы объема памяти: килобайт — 2 10 или 1024 байта (обозначается Кбайт), мегабайт — 2 20 или 1 048 576 байт (обозначается Мбайт), гигабайт — 2 30 байт (обозначается Гбайт), терабайт — 2 40 (обозначается Тбайт) Например, если память имеет 65 536 ячеек, каждая из которых 16-разрядная, то говорят, что память имеет объем 128 Кбайт. Совокупность ячеек памяти называется обычнопространством памяти системы.
Для подключения модуля памяти к системной магистрали используются блоки сопряжения, которые включают в себя дешифратор (селектор) адреса, схему обработки управляющих сигналов магистрали и буферы данных (рис. 2.18).
Оперативная память общается с системной магистралью в циклах чтения и записи, постоянная память — только в циклах чтения. Обычно в составе системы имеется несколько модулей памяти, каждый из которых работает в своей области пространства памяти. Селектор адреса как раз и определяет, какая область адресов пространства памяти отведена данному модулю памяти. Схема управления вырабатывает в нужные моменты сигналы разрешения работы памяти (CS) и сигналы разрешения записи в память (WR). Буферы данных передают данные от памяти к магистрали или от магистрали к памяти.
В пространстве памяти микропроцессорной системы обычно выделяются несколько особых областей, которые выполняют специальные функции.
Память программы начального запуска всегда выполняется на ПЗУ или флэш-памяти. Именно с этой области процессор начинает работу после включения питания и после сброса его с помощью сигнала RESET.
Рис. 2.18. Структура модуля памяти.
Память для стека или стек (Stack) — это часть оперативной памяти, предназначенная для временного хранения данных в режиме LIFO (Last In — First Out).
Особенность стека по сравнению с другой оперативной памятью — это заданный и неизменяемый способ адресации. При записи любого числа (кода) в стек число записывается по адресу, определяемому как содержимое регистра указателя стека, предварительно уменьшенное (декрементированное) на единицу (или на два, если 16-разрядные слова расположены в памяти по четным адресам). При чтении из стека число читается из адреса, определяемого содержимым указателя стека, после чего это содержимое указателя стека увеличивается (инкрементируется) на единицу (или на два). В результате получается, что число, записанное последним, будет прочитано первым, а число, записанное первым, будет прочитано последним. Такая память называется LIFO или памятью магазинного типа (например, в магазине автомата патрон, установленный последним, будет извлечен первым).
Принцип действия стека показан на рис. 2.19 (адреса ячеек памяти выбраны условно).
Пусть, например, текущее состояние указателя стека 1000008, и в него надо записать два числа (слова). Первое слово будет записано по адресу 1000006 (перед записью указатель стека уменьшится на два). Второе — по адресу 1000004. После записи содержимое указателя стека — 1000004.
Если затем прочитать из стека два слова, то первым будет прочитано слово из адреса 1000004, а после чтения указатель стека станет равным 1000006. Вторым будет прочитано слово из адреса 1000006, а указатель стека станет равным 1000008. Все вернулось к исходному состоянию. Первое записанное слово читается вторым, а второе — первым.
Рис. 2.19. Принцип работы стека.
Необходимость такой адресации становится очевидной в случае многократно вложенных подпрограмм. Пусть, например, выполняется основная программа, и из нее вызывается подпрограмма 1. Если нам надо сохранить значения данных и внутренних регистров основной программы на время выполнения подпрограммы, мы перед вызовом подпрограммы сохраним их в стеке (запишем в стек ), а после ее окончания извлечем (прочитаем) их из стека.
Если же из подпрограммы 1 вызывается подпрограмма 2, то ту же самую операцию мы проделаем с данными и содержимым внутренних регистров подпрограммы 1. Понятно, что внутри подпрограммы 2 крайними в стеке (читаемыми в первую очередь) будут данные из подпрограммы 1, а данные из основной программы будут глубже. При этом в случае чтения из стека автоматически будет соблюдаться нужный порядок читаемой информации. То же самое будет и в случае, когда таких уровней вложения подпрограмм гораздо больше. То есть то, что надо хранить подольше, прячется поглубже, а то, что скоро может потребоваться — с краю.
В системе команд любого процессора для обмена информацией со стеком предусмотрены специальные команды записи в стек (PUSH) и чтения из стека (POP). В стеке можно прятать не только содержимое всех внутренних регистров процессоров, но и содержимое регистра признаков (слово состояния процессора, PSW). Это позволяет, например, при возвращении из подпрограммы контролировать результат последней команды, выполненной непосредственно перед вызовом этой подпрограммы. Можно также хранить встеке и данные, для того чтобы удобнее было передавать их между программами и подпрограммами. В общем случае, чем больше область памяти, отведенная под стек, тем больше свободы у программиста и тем более сложные программы могут выполняться.
Следующая специальная область памяти — это таблица векторов прерываний.
Вообще, понятие прерывания довольно многозначно. Под прерыванием в общем случае понимается не только обслуживание запроса внешнего устройства, но и любое нарушение последовательной работы процессора. Например, может быть предусмотрено прерывание по факту некорректного выполнения арифметической операции типа деления на ноль. Или же прерывание может быть программным, когда в программе используется команда перехода на какую-то подпрограмму, из которой затем последует возврат в основную программу. В последнем случае общее с истинным прерыванием только то, как осуществляется переход на подпрограмму и возврат из нее.
Любое прерывание обрабатывается через таблицу векторов (указателей) прерываний. В этой таблице в простейшем случае находятся адреса начала программ обработки прерываний, которые и называются векторами. Длина таблицы может быть довольно большой (до нескольких сот элементов). Обычно таблица векторов прерываний располагается в начале пространства памяти (в ячейках памяти с малыми адресами). Адрес каждого вектора (или адрес начального элемента каждого вектора) представляет собой номер прерывания.
В случае аппаратных прерываний номер прерывания или задается устройством, запросившим прерывание (при векторных прерываниях), или же задается номером линии запроса прерываний (при радиальных прерываниях). Процессор, получив аппаратное прерывание, заканчивает выполнение текущей команды и обращается к памяти в область таблицы векторов прерываний, в ту ее строку, которая определяется номером запрошенного прерывания.
Затем процессор читает содержимое этой строки (код вектора прерывания) и переходит в адрес памяти, задаваемый этим вектором. Начиная с этого адреса в памяти должна располагаться программа обработки прерывания с данным номером. В конце программы обработки прерываний обязательно должна располагаться команда выхода из прерывания, выполнив которую, процессор возвращается к выполнению прерванной основной программы. Параметры процессора на время выполнения программы обработки прерывания сохраняются в стеке.
Пусть, например, процессор (рис.2.20) выполнял основную программу и команду, находящуюся в адресе памяти 5000 (условно). В этот момент он получил запрос прерывания с номером (адресом вектора) 4. Процессор заканчивает выполнение команды из адреса 5000. Затем он сохраняет в стеке текущее значение счетчика команд (5001) и текущее значение PSW.
После этого процессор читает из адреса 4 памяти код вектора прерывания. Пусть этот код равен 6000. Процессор переходит в адрес памяти 6000 и приступает к выполнению программы обработки прерывания, начинающейся с этого адреса. Пусть эта программа заканчивается в адресе 6100. Дойдя до этого адреса, процессор возвращается к выполнению прерванной программы.
Для этого он извлекает из стека значение адреса (5001), на котором его прервали, и бывшее в тот момент PSW. Затем процессор читает команду из адреса 5001 и дальше последовательно выполняет команды основной программы.
Рис. 2.20. Упрощенный алгоритм обработки прерывания.
Прерывание в случае аварийной ситуации обрабатывается точно так же, только адрес вектора прерывания (номер строки в таблице векторов) жестко привязан к данному типу аварийной ситуации.
Программное прерывание тоже обслуживается через таблицу векторов прерываний, но номер прерывания указывается в составе команды, вызывающей прерывание.
Такая сложная, на первый взгляд, организация прерываний позволяет программисту легко менять программы обработки прерываний, располагать их в любой области памяти, делать их любого размера и любой сложности.
Во время выполнения программы обработки прерывания может поступить новый запрос на прерывание. В этом случае он обрабатывается точно так же, как описано, но основной программой считается прерванная программа обработки предыдущего прерывания. Это называется многократным вложением прерываний. Механизм стека позволяет без проблем обслуживать это многократное вложение, так как первым из стека извлекается тот код, который был сохранен последним, то есть возврат из обработки данного прерывания происходит в программу обработки предыдущего прерывания.
Отметим, что в более сложных случаях в таблице векторов прерываний могут находиться не адреса начала программ обработки прерываний, а так называемые дескрипторы (описатели) прерываний. Но конечным результатом обработки этого дескриптора все равно будет адрес начала программы обработки прерываний.
Наконец, еще одна специальная область памяти микропроцессорной системы — это память устройств, подключенных к системной шине. Такое решение встречается нечасто, но иногда оно очень удобно. То есть процессор получает возможность обращаться к внутренней памяти устройств ввода/вывода или каких-то еще подключенных к системной шине устройств, как к своей собственной системной памяти. Обычно окно в пространстве памяти, выделяемое для этого, не слишком большое.
Все остальные части пространства памяти, как правило, имеют универсальное назначение. В них могут располагаться как данные, так и программы (конечно, в случае одношинной архитектуры). Иногда это пространство памяти используется как единое целое, без всяких границ.
А иногда пространство памяти делится на сегменты с программно изменяемым адресом начала сегмента и с установленным размером сегмента. Оба подхода имеют свои плюсы и минусы. Например, использование сегментов позволяет защитить область программ или данных, но зато границы сегментов могут затруднять размещение больших программ и массивов данных.
В заключение остановимся на проблеме разделения адресов памяти и адресов устройств ввода/вывода. Существует два основных подхода к решению этой проблемы:
- выделение в общем адресном пространстве системы специальной области адресов для устройств ввода/вывода;
- полное разделение адресных пространств памяти и устройств ввода/вывода.
Источник: studfile.net
Функции управления памятью
Эти функции используются в сопоставлении файлов.
CreateFileMappingA | Создает или открывает именованный или неименованный объект сопоставления файлов для указанного файла. |
CreateFileMappingW | Создает или открывает именованный или неименованный объект сопоставления файлов для указанного файла. |
CreateFileMapping2 | Создает или открывает именованный или неименованный объект сопоставления файлов для указанного файла. Вы можете указать предпочтительный узел NUMA для физической памяти в качестве расширенного параметра; см. параметр ExtendedParameters . |
CreateFileMappingFromApp | Создает или открывает именованный или неименованный объект сопоставления файлов для указанного файла из приложения Магазина Windows. |
CreateFileMappingNuma | Создает или открывает именованный или неименованный объект сопоставления файлов для указанного файла и задает узел NUMA для физической памяти. |
FlushViewOfFile | Записывает на диск диапазон байтов в сопоставленном представлении файла. |
GetMappedFileName | Проверяет, находится ли указанный адрес в сопоставленном в памяти файле в адресном пространстве указанного процесса. Если это так, функция возвращает имя файла, сопоставленного в памяти. |
MapViewOfFile | Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса. |
MapViewOfFile2 | Сопоставляет представление файла или раздела на основе файла подкачки с адресным пространством указанного процесса. |
MapViewOfFile3 | Сопоставляет представление файла или раздела на основе файла подкачки с адресным пространством указанного процесса. |
MapViewOfFile3FromApp | Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса из приложения Магазина Windows. |
MapViewOfFileEx | Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса. Вызывающий объект может дополнительно указать предлагаемый адрес памяти для представления. |
MapViewOfFileExNuma | Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса и задает узел NUMA для физической памяти. |
MapViewOfFileFromApp | Сопоставляет представление сопоставления файлов с адресным пространством вызывающего процесса из приложения Магазина Windows. |
MapViewOfFileNuma2 | Сопоставляет представление файла или раздела на основе файла подкачки с адресным пространством указанного процесса. |
OpenFileMapping | Открывает именованный объект сопоставления файлов. |
OpenFileMappingFromApp | Открывает именованный объект сопоставления файлов. |
UnmapViewOfFile | Отменяет сопоставление сопоставленного представления файла из адресного пространства вызывающего процесса. |
UnmapViewOfFile2 | Отменяет сопоставление ранее сопоставленного представления файла или раздела на основе файла подкачки. |
UnmapViewOfFileEx | Отменяет сопоставление ранее сопоставленного представления файла или раздела на основе файла подкачки. |
Функции AWE
AllocateUserPhysicalPages | Выделяет страницы физической памяти для сопоставления и отмены сопоставления в любом регионе AWE процесса. |
AllocateUserPhysicalPagesNuma | Выделяет страницы физической памяти для сопоставления и отмены сопоставления в любой области AWE процесса, а также указывает узел NUMA для физической памяти. |
FreeUserPhysicalPages | Освобождает страницы физической памяти, ранее выделенные с помощью AllocateUserPhysicalPages. |
MapUserPhysicalPages | Сопоставляет ранее выделенные страницы физической памяти по указанному адресу в регионе AWE. |
MapUserPhysicalPagesScatter | Сопоставляет ранее выделенные страницы физической памяти по указанному адресу в регионе AWE. |
Функции кучи
GetProcessHeap | Получает дескриптор для кучи вызывающего процесса. |
GetProcessHeaps | Получает дескрипторы для всех кучи, допустимых для вызывающего процесса. |
HeapAlloc | Выделяет блок памяти из кучи. |
HeapCompact | Объединяет смежные свободные блоки памяти в куче. |
HeapCreate | Создает объект кучи. |
ХиапДестрой | Уничтожает указанный объект кучи. |
HeapFree | Освобождает блок памяти, выделенный из кучи. |
HeapLock | Пытается получить блокировку, связанную с указанной кучей. |
HeapQueryInformation | Извлекает сведения об указанной куче. |
HeapReAlloc | Перераспределяет блок памяти из кучи. |
HeapSetInformation | Задает сведения о куче для указанной кучи. |
Куча | Извлекает размер блока памяти, выделенного из кучи. |
HeapUnlock | Освобождает владение блокировкой, связанной с указанной кучей. |
HeapValidate | Пытается проверить указанную кучу. |
HeapWalk | Перечисляет блоки памяти в указанной куче. |
Функции виртуальной памяти
DiscardVirtualMemory | Удаляет содержимое памяти диапазона страниц памяти без списания памяти. Содержимое отброшенной памяти не определено и должно быть перезаписано приложением. |
OfferVirtualMemory | Указывает, что данные, содержащиеся в диапазоне страниц памяти, больше не нужны приложению и могут быть удалены системой при необходимости. |
Предварительная выборкаVirtualMemory | Предварительная выборка диапазонов виртуальных адресов в физическую память. |
QueryVirtualMemoryInformation | Возвращает сведения о странице или наборе страниц в виртуальном адресном пространстве указанного процесса. |
ReclaimVirtualMemory | Освобождает диапазон страниц памяти, которые были предложены системе с помощью OfferVirtualMemory. |
SetProcessValidCallTargets | Предоставляет CFG список допустимых целевых объектов косвенных вызовов и указывает, должны ли они быть помечены как допустимые. |
VirtualAlloc | Резервирует или фиксирует область страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualAlloc2 | Резервирует, фиксирует или изменяет состояние области памяти в виртуальном адресном пространстве указанного процесса. Функция инициализирует память, выделенную нулем. |
VirtualAlloc2FromApp | Резервирует, фиксирует или изменяет состояние области страниц в виртуальном адресном пространстве вызывающего процесса. Память, выделенная этой функцией, автоматически инициализируется нулевым значением. |
VirtualAllocEx | Резервирует или фиксирует область страниц в виртуальном адресном пространстве указанного процесса. |
VirtualAllocExNuma | Резервирует или фиксирует область памяти в виртуальном адресном пространстве указанного процесса и задает узел NUMA для физической памяти. |
VirtualAllocFromApp | Резервирует, фиксирует или изменяет состояние области страниц в виртуальном адресном пространстве вызывающего процесса. Память, выделенная этой функцией, автоматически инициализируется нулевым значением. |
VirtualFree | Освобождает или удаляет область страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualFreeEx | Освобождает или удаляет область памяти в пределах виртуального адресного пространства указанного процесса. |
VirtualLock | Блокирует указанную область виртуального адресного пространства процесса в физической памяти. |
VirtualProtect | Изменяет защиту доступа в регионе зафиксированных страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualProtectEx | Изменяет защиту доступа в регионе зафиксированных страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualProtectFromApp | Изменяет защиту в области зафиксированных страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualQuery | Предоставляет сведения о диапазоне страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualQueryEx | Предоставляет сведения о диапазоне страниц в виртуальном адресном пространстве вызывающего процесса. |
VirtualUnlock | Разблокирует указанный диапазон страниц в виртуальном адресном пространстве процесса. |
Глобальные и локальные функции
См. также глобальные и локальные функции. Эти функции обеспечивают совместимость с 16-разрядной версией Windows и используются с динамическим обменом данными (DDE), функциями буфера обмена и объектами данных OLE. Если в документации не указано, что следует использовать глобальную или локальную функцию, новые приложения должны использовать соответствующую функцию кучи с дескриптором, возвращенным GetProcessHeap. Для использования функций, эквивалентных глобальной или локальной функции, задайте для параметра dwFlags функции кучи значение 0.
GlobalAlloc, LocalAlloc | Выделяет указанное количество байтов из кучи. | HeapAlloc |
GlobalDiscard, LocalDiscard | Отменяет указанный глобальный блок памяти. | Не применяется |
GlobalFlags, LocalFlags | Возвращает сведения об указанном объекте глобальной памяти. | Не применяется Используйте HeapValidate для проверки кучи. |
GlobalFree, LocalFree | Освобождает указанный объект глобальной памяти. | КучаFree |
GlobalHandle, LocalHandle | Извлекает дескриптор, связанный с указанным указателем на глобальный блок памяти. Эту функцию следует использовать только с ole и функциями буфера обмена, которым она требуется. | Не применяется |
GlobalLock, LocalLock | Блокирует глобальный объект памяти и возвращает указатель на первый байт блока памяти объекта. | Не применяется |
GlobalReAlloc, LocalReAlloc | Изменяет размер или атрибуты указанного объекта глобальной памяти. | HeapReAlloc |
GlobalSize, LocalSize | Извлекает текущий размер указанного объекта глобальной памяти. | Размер кучи |
GlobalUnlock, LocalUnlock | Уменьшает количество блокировок, связанных с объектом памяти. Эту функцию следует использовать только с ole и функциями буфера обмена, которым она требуется. | Не применяется |
Неправильные функции памяти
BadMemoryCallbackRoutine | Определяемая приложением функция, зарегистрированная с помощью функции RegisterBadMemoryNotification , которая вызывается при обнаружении одной или нескольких плохих страниц памяти. |
GetMemoryErrorHandlingCapabilities | Возвращает возможности системы обработки ошибок памяти. |
RegisterBadMemoryNotification | Регистрирует уведомление о проблеме памяти, которое вызывается при обнаружении одной или нескольких плохих страниц памяти. |
UnregisterBadMemoryNotification | Закрывает указанный дескриптор уведомления о неправильной памяти. |
Функции анклава
CreateEnclave | Создает неинициализированный анклав. Анклав — это изолированная область кода и данных в адресном пространстве приложения. Только код, который выполняется в анклаве, может получить доступ к данным в том же анклаве. |
InitializeEnclave | Инициализирует анклав, созданный и загруженный данными. |
IsEnclaveTypeSupported | Извлекает, поддерживается ли указанный тип анклава. |
LoadEnclaveData | Загружает данные в неинициализированный анклав, созданный путем вызова CreateEnclave. |
Функцииthunk ATL
AtlThunk_AllocateData | Выделяет место в памяти для thunk ATL. |
AtlThunk_DataToCode | Возвращает исполняемую функцию, соответствующую параметру AtlThunkData_t. |
AtlThunk_FreeData | Освобождает память, связанную с thunk ATL. |
AtlThunk_InitData | Инициализирует thunk ATL. |
Устаревшие функции
Эти функции предоставляются только для обеспечения совместимости с 16-разрядными версиями Windows:
Приведенная ниже функция может возвращать неверные сведения и не должна использоваться. Вместо этого используйте функцию GlobalMemoryStatusEx .
Источник: learn.microsoft.com