Устройства ввода/вывода обмениваются информацией с магистралью по тем же принципам, что и память. Наиболее существенное отличие с точки зрения организации обмена состоит в том, что модуль памяти имеет в адресном пространстве системы много адресов (до нескольких десятков миллионов), а устройство ввода/вывода обычно имеет немного адресов (обычно до десяти), а иногда и всего один адрес.
Но модули памяти системы обмениваются информацией только с магистралью, с процессором, а устройства ввода/вывода взаимодействуют еще и с внешними устройствами, цифровыми или аналоговыми. Поэтому разнообразие устройств ввода/вывода неизмеримо больше, чем модулей памяти. Часто используются еще и другие названия для устройств ввода/вывода: устройства сопряжения, контроллеры, карты расширения, интерфейсные модули и т.д.
Самые простейшие устройства ввода/вывода выдают на внешнее устройство код данных в параллельном формате и принимают из внешнего устройства код данных в параллельном формате. Такие устройства ввода/вывода часто называют параллельными портами ввода/вывода. Они наиболее универсальны, то есть удовлетворяют потребности сопряжения с большим числом внешних устройств, поэтому их часто вводят в состав микропроцессорной системы в качестве стандартных устройств. Параллельные порты обычно имеются в составе микроконтроллеров. Именно через параллельные порты микроконтроллер связывается с внешним миром.
При обращении со стороны магистрали селектор адреса распознает адрес, приписанный данному устройству ввода/вывода. Схема управления выдает внутренние стробы обмена в ответ на магистральные стробы обмена. Входной буфер данных обеспечивает электрическое согласование шины данных с этим устройством ( буфер может и отсутствовать). Данные из шины данных записываются в регистр по сигналу С и выдаются на внешнее устройство. Выходной буфер данных передает входные данные с внешнего устройства на шину данных магистрали в цикле чтения из порта.
Более сложные устройства ввода/вывода (устройства сопряжения) имеют в своем составе внутреннюю буферную оперативную память и даже могут иметь микроконтроллер, на который возложено выполнение функций обмена с внешним устройством.
В составе микропроцессорных систем, как правило, выделяются три специальные группы устройств ввода/вывода:
К устройствам ввода для интерфейса пользователя относятся контроллеры клавиатуры, тумблеров, отдельных кнопок, мыши, трекбола, джойстика и т.д. К устройствам вывода для интерфейса пользователя относятся контроллеры светодиодных индикаторов, табло, жидкокристаллических, плазменных и электронно-лучевых экранов и т.д. В простейших случаях управляющих контроллеров или микроконтроллеров эти средства могут отсутствовать. В сложных микропроцессорных системах они есть обязательно. Роль внешнего устройства в данном случае играет человек.
Устройства ввода/вывода для длительного хранения информации обеспечивают сопряжение микропроцессорной системы с дисководами (компакт-дисков или магнитных дисков), а также с накопителями на магнитной ленте. Применение таких устройств существенно увеличивает возможности микропроцессорной системы в отношении хранения выполняемых программ и накопления массивов данных. В простейших контроллерах эти устройства отсутствуют.
Таймерные устройства отличаются от других устройств ввода/вывода тем, что они могут не иметь внешних выводов для подключения к внешним устройствам. Эти устройства предназначены для того, чтобы микропроцессорная система могла выдерживать заданные временные интервалы, следить за реальным временем, считать импульсы и т.д. В основе любого таймера лежит кварцевый тактовый генератор и многоразрядные двоичные счетчики, которые могут перезапускать друг друга. Процессор может записывать в таймер коэффициенты деления тактовой частоты, количество отсчитываемых импульсов, задавать режим работы счетчиков таймера, а читает процессор выходные коды счетчиков. В принципе выполнить практически все функции таймера можно и программным путем, поэтому иногда таймеры в системе отсутствуют. Но включение в систему таймера позволяет решать более сложные задачи и строить более эффективные алгоритмы.
Еще один важный класс устройств ввода/вывода — это устройства для подключения к информационным сетям (локальным и глобальным). Эти устройства распространены не так широко, как устройства трех перечисленных ранее групп, но их значение с каждым годом становится все больше. Сейчас средства связи с информационными сетями вводятся иногда даже в простые контроллеры.
Иногда устройства ввода/вывода обеспечивают сопряжение с внешними устройствами с помощью аналоговых сигналов. Это бывает очень удобно, поэтому в состав некоторых микроконтроллеров даже вводят внутренние ЦАП и АЦП.
Память микропроцессорной системы выполняет функцию временного или постоянного хранения данных и команд. Объем памяти определяет допустимую сложность выполняемых системой алгоритмов, а также в некоторой степени и скорость работы системы в целом. Модули памяти выполняются на микросхемах памяти (оперативной или постоянной). Все чаще в составе микропроцессорных систем используется флэш-память (англ. — flash memory ), которая представляет собой энергонезависимую память с возможностью многократной перезаписи содержимого.
Оперативная память общается с системной магистралью в циклах чтения и записи, постоянная память — только в циклах чтения. Обычно в составе системы имеется несколько модулей памяти, каждый из которых работает в своей области пространства памяти. Селектор адреса как раз и определяет, какая область адресов пространства памяти отведена данному модулю памяти. Схема управления вырабатывает в нужные моменты сигналы разрешения работы памяти (CS) и сигналы разрешения записи в память (WR). Буферы данных передают данные от памяти к магистрали или от магистрали к памяти.
В пространстве памяти микропроцессорной системы обычно выделяются несколько особых областей, которые выполняют специальные функции.
Память программы начального запуска всегда выполняется на ПЗУ или флэш-памяти. Именно с этой области процессор начинает работу после включения питания и после сброса его с помощью сигнала RESET.
Память для стека или стек (Stack) — это часть оперативной памяти, предназначенная для временного хранения данных в режиме LIFO (Last In — First Out).
Принцип действия стека показан на рис. 2.19 (адреса ячеек памяти выбраны условно).
Пусть, например, текущее состояние указателя стека 1000008, и в него надо записать два числа (слова). Первое слово будет записано по адресу 1000006 (перед записью указатель стека уменьшится на два). Второе — по адресу 1000004. После записи содержимое указателя стека — 1000004. Если затем прочитать из стека два слова, то первым будет прочитано слово из адреса 1000004, а после чтения указатель стека станет равным 1000006. Вторым будет прочитано слово из адреса 1000006, а указатель стека станет равным 1000008. Все вернулось к исходному состоянию. Первое записанное слово читается вторым, а второе — первым.
Следующая специальная область памяти — это таблица векторов прерываний.
Вообще, понятие прерывания довольно многозначно. Под прерыванием в общем случае понимается не только обслуживание запроса внешнего устройства, но и любое нарушение последовательной работы процессора. Например, может быть предусмотрено прерывание по факту некорректного выполнения арифметической операции типа деления на ноль. Или же прерывание может быть программным, когда в программе используется команда перехода на какую-то подпрограмму, из которой затем последует возврат в основную программу. В последнем случае общее с истинным прерыванием только то, как осуществляется переход на подпрограмму и возврат из нее.
Любое прерывание обрабатывается через таблицу векторов (указателей) прерываний. В этой таблице в простейшем случае находятся адреса начала программ обработки прерываний, которые и называются векторами. Длина таблицы может быть довольно большой (до нескольких сот элементов). Обычно таблица векторов прерываний располагается в начале пространства памяти (в ячейках памяти с малыми адресами). Адрес каждого вектора (или адрес начального элемента каждого вектора) представляет собой номер прерывания.
Прерывание в случае аварийной ситуации обрабатывается точно так же, только адрес вектора прерывания (номер строки в таблице векторов) жестко привязан к данному типу аварийной ситуации.
Программное прерывание тоже обслуживается через таблицу векторов прерываний, но номер прерывания указывается в составе команды, вызывающей прерывание.
Такая сложная, на первый взгляд, организация прерываний позволяет программисту легко менять программы обработки прерываний, располагать их в любой области памяти, делать их любого размера и любой сложности.
Во время выполнения программы обработки прерывания может поступить новый запрос на прерывание. В этом случае он обрабатывается точно так же, как описано, но основной программой считается прерванная программа обработки предыдущего прерывания. Это называется многократным вложением прерываний. Механизм стека позволяет без проблем обслуживать это многократное вложение, так как первым из стека извлекается тот код, который был сохранен последним, то есть возврат из обработки данного прерывания происходит в программу обработки предыдущего прерывания.
Отметим, что в более сложных случаях в таблице векторов прерываний могут находиться не адреса начала программ обработки прерываний, а так называемые дескрипторы (описатели) прерываний. Но конечным результатом обработки этого дескриптора все равно будет адрес начала программы обработки прерываний.
Наконец, еще одна специальная область памяти микропроцессорной системы — это память устройств, подключенных к системной шине. Такое решение встречается нечасто, но иногда оно очень удобно. То есть процессор получает возможность обращаться к внутренней памяти устройств ввода/вывода или каких-то еще подключенных к системной шине устройств, как к своей собственной системной памяти. Обычно окно в пространстве памяти, выделяемое для этого, не слишком большое.
Все остальные части пространства памяти, как правило, имеют универсальное назначение. В них могут располагаться как данные, так и программы (конечно, в случае одношинной архитектуры). Иногда это пространство памяти используется как единое целое, без всяких границ. А иногда пространство памяти делится на сегменты с программно изменяемым адресом начала сегмента и с установленным размером сегмента. Оба подхода имеют свои плюсы и минусы. Например, использование сегментов позволяет защитить область программ или данных, но зато границы сегментов могут затруднять размещение больших программ и массивов данных.
В заключение остановимся на проблеме разделения адресов памяти и адресов устройств ввода/вывода. Существует два основных подхода к решению этой проблемы:
Первый подход хорош тем, что при обращении к устройствам ввода/вывода процессор может использовать те же команды, которые служат для взаимодействия с памятью. Но адресное пространство памяти должно быть уменьшено на величину адресного пространства устройств ввода/вывода. Например, при 16-разрядной шине адреса всего может быть 64К адресов. Из них 56К адресов отводится под адресное пространство памяти, а 8К адресов — под адресное пространство устройств ввода/вывода.
Для чего нужен селектор адреса в составе модуля памяти
Вот такие вопросики обычной сложности. Отвечайте кратко и лаконично
kpot3113 писал(а):
И кто здесь сильно разбирается, а? Пару вопросиков, чтобы понять
З.Ы. пробуйте мож кто еще короче смогет
jum_jumangulov_ravil писал(а):
kpot3113 писал(а):
И кто здесь сильно разбирается, а? Пару вопросиков, чтобы понять
kpot3113 писал(а):
И кто здесь сильно разбирается, а? Пару вопросиков, чтобы понять
1.Содержимое регистра признаков будет копироваться при прерываниях или сохраняться при переключении задачи, если прерывание будет выполняться в режиме виртуального 8086. Содержимое ОЗУ и регистров ЦП сохраняется при напряжении питания 2.0В. При таком питающем напряжении системы ОЭВМ уже не могут.
2.В системе команд микропроцессорного ядра MicroBlaze при классификации по функциональному признаку можно выделить девять групп инструкций. В третью группу входят команды сдвига. Они позволяют реализовать операции арифметического или циклического сдвига данных, записанных в регистре общего назначения, номер которого указан в тексте команды. В этой группе предусмотрены инструкции, предназначенные для осуществления сдвига данных как в сторону младшего разряда, так и в направлении старшего разряда.
3.Можно установить еще 3 режима с понижением частоты тактирования FRAM в 3, 4 или 8 раз для целей снижения энергопотребления … Внутренний RC-генератор обеспечивает сравнительно высокую точность тактовой частоты — не хуже 2%. В то же время, ядра микроконтроллеров серий MB 90340 и MB 90345 способны работать с частотой тактирования 24 МГц, что на треть выше, чем у ранее разработанных микроконтроллеров (16 МГц)
Правильные ответы выделены зелёным цветом. Все ответы: Разъясняются основные понятия микропроцессорной техники, рассматриваются принципы функционирования микропроцессорных систем, предлагаются методы проектирования микропроцессорных систем на основе микроконтроллеров.
В чем главное преимущество микропроцессорной системы?
Сколько видов сброса реализовано в микроконтроллерах подгруппы PIC16F8Х?
Какая сфера применения является наиболее типичной для цифровых устройств на микроконтроллерах?
В каком порядке следуют типы информации в ассемблерной строке?
Какая шина персонального компьютера наиболее быстрая?
В чем основное преимущество шины ISA перед другими шинами компьютера?
Когда компьютер начинает цикл обмена по интерфейсу Centronics?
Какая из приведенных операций не требует проведения цикла обмена информацией?
К какой группе команд относятся команды работы со стеком?
Какие преимущества дает модульная организация микроконтроллера?
(3) создание разнообразных по структуре МК в пределах одного семейства
Какое значение сигнала считывается при вводе данных с порта микроконтроллера?
(3) логическое » И » над содержимым триггера данных и значением сигнала на внешнем выводе МК
Какой модуль микроконтроллера прекращает работу в режиме ожидания?
Какой формат команд используется в семействе микроконтроллеров среднего уровня PIC16CXXX?
Какой режим обмена предполагает отключение процессора?
Можно ли стереть бит защиты программного кода в микроконтроллерах подгруппы PIC16F8Х?
(2) можно, только если знать идентификационный код МК
(3) только вместе с содержимым памяти программ и данных МК
(2) средство для исполнения разработанной программы на программно-логической модели МК
(3) программа для оптимизации размещения данных в памяти МК
Какой процессор ПК был первым полностью 32-разрядным?
Какая операция на магистрали ISA не требует обмена сигналами?
(5) через равные промежутки времени, начиная от стартового бита
Какой тип обмена обеспечивает гарантированную передачу информации любому исполнителю?
Для чего нужен селектор адреса в составе модуля памяти?
(4) для выделения адресов этого модуля в адресном пространстве системы
Какой метод адресации предполагает размещение операнда внутри выполняемой программы?
Что отличает процессоры с RISC-архитектурой от процессоров с CISC–архитектурой?
(2) возможность параллельного исполнения нескольких команд
При каких условиях триггер переполнения таймера/счетчика генерирует запрос на прерывание микроконтроллера?
(4) при переполнении таймера/счетчика, если прерывания от таймера разрешены
Какой способ тактирования микроконтроллера обеспечивает наивысшую стабильность частоты?
Что дает двухступенчатый конвейер исполнения команд в PIC-микроконтроллерах?
(1) возможность одновременной выборки и исполнения команд
(3) возможность параллельного исполнения двух команд
(4) возможность динамического предсказания переходов
Микропроцессорная система какого типа не обеспечивает управление внешними устройствами?
(3) все типы обеспечивают управление внешними устройствами
Что может использоваться в качестве регистра назначения в системе команд микроконтроллеров подгруппы PIC16F8Х?
(1) рабочий регистр W или регистр, используемый в команде
(4) средство для крепления платы развития в устройстве
(1) она дополнительно увеличивает объем системной памяти
(4) она ускоряет обмен процессора с системной памятью
(5) она ускоряет обмен процессора с устройствами ввода-вывода
На основе чего организован внутренний календарь ПК?
Какие адресные разряды участвуют в цикле регенерации памяти?
(3) на шине PCI возможен синхронный и асинхронный обмен
При каком типе прерываний число различных прерываний может быть больше?
(3) максимальное число прерываний постоянно при любом типе прерываний
(5) внешнее устройство, с которым осуществляется сопряжение
Какой регистр определяет адрес текущей выполняемой команды?
Какая память не изменяет своего содержимого в ходе выполнения программы?
Для чего в первую очередь предназначен модуль выходного сравнения микроконтроллера?
(1) для формирования временных интервалов заданной длительности
(3) для измерения интервалов времени между событиями на выходах МК
Что используется в качестве простейшего устройства аналогового ввода информации в микроконтроллере?
Для каких целей используются регистры специальных функций PIC-микроконтроллера?
Какие команды микроконтроллеров подгруппы PIC16F8Х используются для организации условных переходов в программе?
(2) для задания всех используемых в программе параметров
Каков типичный объем памяти данных микроконтроллера?
Где хранится содержимое младшего байта счетчика команд микроконтроллеров подгруппы PIC16F8Х?
Как компьютер узнает об отсутствии бумаги в принтере при использовании Centronics?
(3) компьютер посылает специальный запрос о наличии бумаги
(5) принтер выдает особую комбинацию нескольких сигналов
Какой тип обмена обеспечивает более высокую скорость передачи информации?
(4) синхронный обмен с возможностью асинхронного обмена
(1) для хранения флагов результатов выполненных операций
(4) для определения режима работы микропроцессорной системы
Какой метод адресации наиболее удобен для последовательной обработки массивов данных?
Для чего используются команды программных прерываний?
Какие возможности отсутствуют при использовании микроконтроллеров с «закрытой» архитектурой?
(2) возможность подключения памяти программ и данных по параллельным магистралям
(3) возможность использования всей совокупности системы команд МК
Какой тип логической функции позволяет реализовать объединение «квазидвунаправленных» выходов микроконтроллера?
Как зависит ток потребления микроконтроллера от напряжения питания?
Какая архитектура используется в PIC-микроконтроллерах?
Какой режим обмена обеспечивает наибольшую скорость передачи информации?
Где хранятся биты конфигурации микроконтроллеров подгруппы PIC16F8Х?
(1) программа для контроля состояния внутренних регистров МК
(2) аппаратное устройство для реализации пошагового режима работы МК
(3) программно-аппаратное средство для замены МК в реальной схеме
Какая фирма является основным поставщиком процессоров для персональных компьютеров?
Какой тип прерываний требует более сложной аппаратуры устройства-исполнителя?
(3) запись и чтение могут следовать в произвольном порядке
(4) содержимое стековой памяти не меняется за время работы системы
(5) стековая память ускоряет работу памяти векторов прерываний
Каково разделение функций между внутренними регистрами процессора?
(3) половина регистров используется для данных, половина — для адресации
(5) одни регистры специализированные, другие — универсальные
Каково типичное соотношение между требуемыми объемами памяти программ и данных микроконтроллера?
(1) объем памяти данных больше объема памяти программ
(2) объем памяти данных меньше объема памяти программ
(3) объем памяти данных равен объему памяти программ
Для чего в первую очередь предназначен модуль входного захвата микроконтроллера?
(3) для измерения временных интервалов между событиями на входах МК
(4) для выдачи импульсов фиксированной продолжительности
Зачем нужна задержка времени при запуске тактового генератора микроконтроллера?
(2) для минимизации энергопотребления при запуске МК
(4) для исключения выдачи ложных сигналов на выходах МК
Сколько тактов занимает выполнение одного командного цикла PIC-микроконтроллером?
Какая архитектура обеспечивает более высокое быстродействие?
Какие команды микроконтроллеров подгруппы PIC16F8Х могут изменить все биты состояния?
(1) устройство для расширения объема внешней памяти МК
(2) устройство для «вскрытия» содержимого памяти программ МК
(3) схема для сопряжения МК с внешней памятью программ
(4) когда системная память имеет малое быстродействие
(5) когда объем системной памяти компьютера очень большой
(1) при нажатии — коды символов, соответствующих клавишам
(3) при нажатии и отпускании — коды символов, соответствующих клавишам
(5) при отпускании — коды символов, соответствующих клавишам
(1) распределение ресурсов с помощью переключателей на плате
(2) распределение ресурсов с помощью программы-драйвера платы
Какой параметр слабее других влияет на процесс обмена сигналами по магистрали?
(3) положительная или отрицательная логика шины данных
(5) неодновременное выставление сигналов на линиях шины
Какое устройство не относится к устройствам ввода-вывода?
Какой регистр процессора 8086/8088 определяет адрес ввода/вывода?
Сколько раз можно изменить содержимое памяти программ на основе ПЗУ масочного типа?
(3) один раз на стадии программирования пользователем
Какой параметр выходного сигнала изменяется при широтно-импульсной модуляции?
АЦП какого типа чаще всего используют в составе микроконтроллера?
Где хранится информация о выборе банка памяти данных микроконтроллеров подгруппы PIC16F8Х?
Какие действия выполняет команда CLRWDT системы команд микроконтроллеров подгруппы PIC16F8Х?
(4) сбрасывает в 0 содержимое сторожевого таймера и пределителя (если он используется)
(2) для задания контрольных точек останова при симуляции
Чем ограничена глубина вложений циклов вызова подпрограмм в микроконтроллере?
Где хранится указатель стека микроконтроллеров подгруппы PIC16F8Х?
Где хранится информация о направлении передачи информации портов ввода/вывода микроконтроллеров подгруппы PIC16F8Х?
Какой бит определяет режим работы таймера/счетчика микроконтроллеров подгруппы PIC16F8Х?
Какой бит определяет режим использования предделителя микроконтроллеров подгруппы PIC16F8Х?
Сколько источников запросов прерываний имеют микроконтроллеры подгруппы PIC16F8Х?
Структура какой шины влияет на разнообразие режимов обмена?
В какое состояние переходит счетчик команд микроконтроллеров подгруппы PIC16F8Х после сброса?
Что включает в себя понятие «закрытая архитектура» микроконтроллера?
(3) отсутствие возможности изменения тактовой частоты МК
(4) реализация большинства функций устройства внутренними средствами
(1) последовательность любых допустимых ASCII символов, заключенная в двойные кавычки и длиной до 132 колонок
(2) последовательность любых допустимых ASCII символов, заключенная между тире, длиной в пределах 80 колонок
(3) последовательность любых допустимых ASCII символов, заключенная между точками с запятой, длиной до 132 колонок
(4) последовательность любых допустимых ASCII символов, заключенная в двойные кавычки, длиной в пределах 80 колонок
Каков Ваш психологический возраст?
Из какой страны вы душой?
Этот тест определит ваш кругозор
А вы сможете продолжить эти 13 крылатых фраз?
Докажите свою высокоинтеллектуальность, набрав в нашем тесте на общие знания 13/13
Сможем ли мы угадать ваш возраст, задав вам 5 вопросов?
Тест, который осилят лишь настоящие профи в мировой географии
Тест, который покажет, каким животным вы являетесь в душе.
Насколько вы привлекательны?
Сможем ли мы определить ваш пол, узнав, что вы ненавидите?
Если вы закончите представленные 15 фраз, то вы настоящий интеллектуал!
Тест Роршаха расскажет, что сейчас творится у вас в голове
Тест на интеллект: Если наберете 9/9, то уровень вашего IQ точно выше среднего
А насколько хорошо натренирован ваш мозг?
Умеете ли вы готовить? Сложный кулинарный Блиц-тест ресторатора Ивана Шишкина
Тест на эрудицию: Ваш IQ высок, как Эверест, если вы сможете набрать 80%!
Тест на сленг СССР, который вы завалите, если не жили в то время
Помнишь, что ели в Советском Союзе?
Комментарии:
Популярные тесты
Каков Ваш психологический возраст?
Из какой страны вы душой?
Этот тест определит ваш кругозор
А вы сможете продолжить эти 13 крылатых фраз?
Докажите свою высокоинтеллектуальность, набрав в нашем тесте на общие знания 13/13
Сможем ли мы угадать ваш возраст, задав вам 5 вопросов?
Тест, который осилят лишь настоящие профи в мировой географии
Тест, который покажет, каким животным вы являетесь в душе.
Насколько вы привлекательны?
Сможем ли мы определить ваш пол, узнав, что вы ненавидите?
Если вы закончите представленные 15 фраз, то вы настоящий интеллектуал!
Тест Роршаха расскажет, что сейчас творится у вас в голове
Тест на интеллект: Если наберете 9/9, то уровень вашего IQ точно выше среднего
А насколько хорошо натренирован ваш мозг?
Умеете ли вы готовить? Сложный кулинарный Блиц-тест ресторатора Ивана Шишкина
Тест на эрудицию: Ваш IQ высок, как Эверест, если вы сможете набрать 80%!
Тест на сленг СССР, который вы завалите, если не жили в то время
Помнишь, что ели в Советском Союзе?
Преимущества
Можете встраивать тесты на Ваш сайт. Тест показывается нашем и других сайтах. Гибкие настройки результатов. Возможность поделиться тестом и результатами. Лавинообразный («вирусный») трафик на тест. Русскоязычная аудитория. Без рекламы!
Пользователям
Вам захотелось отдохнуть? Или просто приятно провести время? Выбирайте и проходите онлайн-тесты, делитесь результатом с друзьями. Проверьте, смогут они пройти также как Вы, или может лучше?
Внимание! Наши тесты не претендуют на достоверность – не стоит относиться к ним слишком серьезно!
За последнюю неделю дважды объяснял людям как организована работа с памятью в х86, с целью чтобы не объяснять в третий раз написал эту статью.
И так, чтобы понять организацию памяти от вас потребуется знания некоторых базовых понятий, таких как регистры, стек и тд. Я по ходу попробую объяснить и это на пальцах, но очень кратко потому что это не тема для этой статьи. Итак начнем.
Как известно программист, когда пишет программы работает не с физическим адресом, а только с логическим. И то если он программирует на ассемблере. В том же Си ячейки памяти от программиста уже скрыты указателями, для его же удобства, но если грубо говорить указатель это другое представление логического адреса памяти, а в Java и указателей нет, совсем плохой язык. Однако грамотному программисту не помешают знания о том как организована память хотя бы на общем уровне. Меня вообще очень огорчают программисты, которые не знают как работает машина, обычно это программисты Java и прочие php-парни, с квалификацией ниже плинтуса.
Так ладно, хватит о печальном, переходим к делу. Рассмотрим адресное пространство программного режима 32 битного процессора (для 64 бит все по аналогии) Адресное пространство этого режима будет состоять из 2^32 ячеек памяти пронумерованных от 0 и до 2^32-1. Программист работает с этой памятью, если ему нужно определить переменную, он просто говорит ячейка памяти с адресом таким-то будет содержать такой-то тип данных, при этом сам програмист может и не знать какой номер у этой ячейки он просто напишет что-то вроде: int data = 10; компьютер поймет это так: нужно взять какую-то ячейку с номером стопицот и поместить в нее цело число 10. При том про адрес ячейки 18894 вы и не узнаете, он от вас будет скрыт.
Все бы хорошо, но возникает вопрос, а как компьютер ищет эту ячейку памяти, ведь память у нас может быть разная: 3 уровень кэша 2 уровень кэша 1 уровень кэша основная память жесткий диск
Это все разные памяти, но компьютер легко находит в какой из них лежит наша переменная int data. Этот вопрос решается операционной системой совместно с процессором. Вся дальнейшая статья будет посвящена разбору этого метода.
Архитектура х86 поддерживает стек.
Стек это непрерывная область оперативной памяти организованная по принципу стопки тарелок, вы не можете брать тарелки из середины стопки, можете только брать верхнюю и класть тарелку вы тоже можете только на верх стопки. В процессоре для работы со стеком организованны специальные машинные коды, ассемблерные мнемоники которых выглядят так:
push operand помещает операнд в стек
pop operand изымает из вершины стека значение и помещает его в свой операнд
Стек в памяти растет сверху вниз, это значит что при добавлении значения в него адрес вершины стека уменьшается, а когда вы извлекаете из него, то адрес вершины стека увеличивается.
Теперь кратко рассмотрим что такое регистры. Это ячейки памяти в самом процессоре. Это самый быстрый и самый дорогой тип памяти, когда процессор совершает какие-то операции со значением или с памятью, он берет эти значения непосредственно из регистров. В процессоре есть несколько наборов логик, каждая из которых имеет свои машинные коды и свои наборы регистров. Basic program registers (Основные программные регистры) Эти регистры используются всеми программами с их помощью выполняется обработка целочисленных данных. Floating Point Unit registers (FPU) Эти регистры работают с данными представленными в формате с плавающей точкой. Еще есть MMX и XMM registers эти регистры используются тогда, когда вам надо выполнить одну инструкцию над большим количеством операндов.
Рассмотрим подробнее основные программные регистры. К ним относятся восемь 32 битных регистров общего назначения: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP Для того чтобы поместить в регистр данные, или для того чтобы изъять из регистра в ячейку памяти данные используется команда mov:
mov eax, 10 загружает число 10 в регистр eax.
mov data, ebx копирует число, содержащееся в регистре ebx в ячейку памяти data.
Регистр ESP содержит адрес вершины стека. Кроме регистров общего назначения, к основным программным регистрам относят шесть 16битных сегментных регистров: CS, DS, SS, ES, FS, GS, EFLAGS, EIP EFLAGS показывает биты, так называемые флаги, которые отражают состояние процессора или характеризуют ход выполнения предыдущих команд. В регистре EIP содержится адрес следующей команды, которая будет выполнятся процессором. Я не буду расписывать регистры FPU, так как они нам не понадобятся. Итак наше небольшое отступление про регистры и стек закончилось переходим обратно к организации памяти.
Как вы помните целью статьи является рассказ про преобразование логической памяти в физическую, на самом деле есть еще промежуточный этап и полная цепочка выглядит так:
Все линейное адресное пространство разбито на сегменты. Адресное пространство каждого процесса имеет по крайней мере три сегмента: Сегмент кода. (содержит команды из нашей программы, которые будут исполнятся.) Сегмент данных. (Содержит данные, то бишь переменные) Сегмент стека, про который я писал выше.
Линейный адрес вычисляется по формуле:
линейный адрес=Базовый адрес сегмента(на картинке это начало сегмента) + смещение
Сегмент кода
Сегмент данных
Сегмент стека
Используемый сегмент стека задается значением регистра SS. Смещение внутри этого сегмента представлено регистром ESP, который указывает на вершину стека, как вы помните. Сегменты в памяти могут друг друга перекрывать, мало того базовый адрес всех сегментов может совпадать например в нуле. Такой вырожденный случай называется линейным представлением памяти. В современных системах, память как правило так организована.
Теперь рассмотрим определение базовых адресов сегмента, я писал что они содержаться в регистрах SS, DS, CS, но это не совсем так, в них содержится некий 16 битный селектор, который указывает на некий дескриптор сегментов, в котором уже хранится необходимый адрес.
Так выглядит селектор, в тринадцати его битах содержится индекс дескриптора в таблице дескрипторов. Не хитро посчитать будет что 2^13 = 8192 это максимальное количество дескрипторов в таблице. Вообще дескрипторных таблиц бывает два вида GDT и LDT Первая называется глобальная таблица дескрипторов, она в системе всегда только одна, ее начальный адрес, точнее адрес ее нулевого дескриптора хранится в 48 битном системном регистре GDTR. И с момента старта системы не меняется и в свопе не принимает участия. А вот значения дескрипторов могут меняться. Если в селекторе бит TI равен нулю, тогда процессор просто идет в GDT ищет по индексу нужный дескриптор с помощью которого осуществляет доступ к этому сегменту. Пока все просто было, но если TI равен 1 тогда это означает что использоваться будет LDT. Таблиц этих много, но использоваться в данный момент будет та селектор которой загружен в системный регистр LDTR, который в отличии от GDTR может меняться. Индекс селектора указывает на дескриптор, который указывает уже не на базовый адрес сегмента, а на память в котором хранится локальная таблица дескрипторов, точнее ее нулевой элемент. Ну а дальше все так же как и с GDT. Таким образом во время работы локальные таблицы могут создаваться и уничтожаться по мере необходимости. LDT не могут содержать дескрипторы на другие LDT. Итак мы знаем как процессор добирается до дескриптора, а что содержится в этом дескрипторе посмотрим на картинке: Дескрипторы состоит из 8 байт. Биты с 15-39 и 56-63 содержат линейный базовый адрес описываемым данным дескриптором сегмента. Напомню нашу формулу для нахождения линейного адреса:
линейный адрес = базовый адрес + смещение
[база; база+предел)
(база+предел; вершина]
Кстати интересно почему база и предел так рвано располагаются в дескрипторе. Дело в том что процессоры х86 развивались эволюционно и во времена 286х дескрипторы были по 8 бит всего, при этом старшие 2 байта были зарезервированы, ну а в последующих моделях процессоров с увеличением разрядности дескрипторы тоже выросли, но для сохранения обратной совместимости пришлось оставить структуру как есть. Значение адреса «вершина» зависит от 54го D бита, если он равен 0, тогда вершина равна 0xFFF(64кб-1), если D бит равен 1, тогда вершина равна 0xFFFFFFFF (4Гб-1) С 41-43 бит кодируется тип сегмента. 000 — сегмент данных, только считывание 001 — сегмент данных, считывание и запись 010 — сегмент стека, только считывание 011 — сегмент стека, считывание и запись 100 — сегмент кода, только выполнение 101- сегмент кода, считывание и выполнение 110 — подчиненный сегмент кода, только выполнение 111 — подчиненный сегмент кода, только выполнение и считывание
44 S бит если равен 1 тогда дескриптор описывает реальный сегмент оперативной памяти, иначе значение S бита равно 0.
Самым важным битом является 47-й P бит присутствия. Если бит равен 1 значит, что сегмент или локальная таблица дескрипторов загружена в оперативку, если этот бит равен 0, тогда это означает что данного сегмента в оперативке нет, он находится на жестком диске, случается прерывание, особый случай работы процессора запускается обработчик особого случая, который загружает нужный сегмент с жесткого диска в память, если P бит равен 0, тогда все поля дескриптора теряют смысл, и становятся свободными для сохранения в них служебной информации. После завершения работы обработчика, P бит устанавливается в значение 1, и производится повторное обращение к дескриптору, сегмент которого находится уже в памяти.
На этом заканчивается преобразование логического адреса в линейный, и я думаю на этом стоит прерваться. В следующий раз я расскажу вторую часть преобразования из линейного в физический. А так же думаю стоит немного поговорить о передачи аргументов функции, и о размещении переменных в памяти, чтобы была какая-то связь с реальностью, потому размещение переменных в памяти это уже непосредственно, то с чем вам приходится сталкиваться в работе, а не просто какие-то теоретические измышления для системного программиста. Но без понимания, как устроена память невозможно понять как эти самые переменные хранятся в памяти. В общем надеюсь было интересно и до новых встреч.