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

Обновлено: 04.07.2024

Основу центрального процессора ПЭВМ составляет микропроцессор (МП) - обрабатывающее устройство, служащее для арифметических и логических преобразований данных, для организации обращения к ОП и ВНУ и для управления ходом вычислительного процесса. В настоящее время существует большое число разновидностей микропроцессоров, различающихся назначением, функциональными возможностями, структурой, исполнением. Наиболее существенными классификационными различиями между ними чаще всего выступают:

Обобщенная структурная схема 32-разрядного микропроцессора x86 (серии Pentium) приведена на рис.15.3.

Условно микропроцессор можно разделить на три части: исполнительный блок ( Execution Unit - EU ), устройство сопряжения с системной магистралью ( Bus Interface Unit - BIU ) и блок управления микропроцессором ( Control Unit - CU ).

В исполнительном блоке находятся: арифметический блок ( кэш данных - DATE CACHE , микросхемы арифметико-логического устройства - АЛУ, регистр флагов), регистры общего назначения (РОН) EAX, EBX, ECX, EDX ; общие регистры ESI , EDI , ESP , EBP .

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

 Обобщенная структурная схема 32-разрядного микропроцессора


Рис. 15.3. Обобщенная структурная схема 32-разрядного микропроцессора

Эти регистры используются для операций с данными, такими как сравнение, математические операции или запись данных в память. Регистр СХ чаще всего применяется как счетчик циклов.

Общие регистры - ESP , EBP , ESI , EDI также 32-битные, младшая половина которых доступна как регистры S P, B P, SI, DI .

Регистр ESP указывает на адрес вершины стека (адрес, куда будет заноситься следующая переменная командой PUSH ).

Регистр ЕВР содержит адрес базы, который может использоваться при работе со стеком.

Регистр ESI - адрес источника, обычно содержит адрес начала блока информации для операций типа "переместить блок", а регистр EDI - адрес приемника (назначения) в этой операции.

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

Сегментные регистры CS, DS, ES, FS, GS, SS имеют длину по 16 бит и используются для формирования физических адресов команд и данных в основной памяти.

CS - сегмент кода исполняемой в данный момент программы.

DS - сегмент данных исполняемой программы, т.е. константы, строковые ссылки и т.д.

SS - сегмент стека исполняемой программы.

ES, FS, GS - дополнительные сегменты, которые в некоторых программах могут не использоваться.

Системные регистры GDTR и LDTR являются регистрами глобальной и локальной дескрипторных таблиц . GDTR имеет длину 48 бит, LDTR - 16 бит (точнее, 16 бит - это только "видимая" часть этого регистра).

Регистр IDTR (таблицы дескрипторов прерываний - DTR ) имеет длину 48 бит, 32 из которых являются базовым адресом таблицы дескрипторов прерываний ( IDT ), а 16 - смещением этого адреса (пределом).

Регистр TR является регистром состояния задачи. "Видимая" его часть имеет длину 16 бит и содержит селектор дескриптора. "Скрытая" часть регистра содержит загружаемые автоматически базовый адрес точки входа, предел и атрибуты задачи.

Структурная схема блока выработки управляющих сигналов микропроцессора приведена на рис.15.4.

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

Регистр EIP является указателем адреса команды ( Instruction Pointer ), которая будет выбираться в конвейер команд в качестве очередной команды (в отечественной литературе такое устройство называется счетчик команд ).

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


Рис. 15.4. Структурная схема блока выработки управляющих сигналов

Конвейер команд МП хранит несколько команд, что позволяет при выполнении линейных программ совместить подготовку очередной команды с выполнением текущей. Команды в конвейер команд поступают с внутренней магистрали микропроцессора и накапливаются в кэше команд. Блок предвыборки и прогнозирования переходов осуществляет трансляцию команд x86 в RISС -команды, прогнозирует последовательность исполнения команд и направляет полученные последовательности команд в соответствующие ветви конвейера команд (U,V,…) . Каждый конвейер команд имеет свой буфер (память магазинного типа FIFO ), из которого команды поступают в соответствующий регистр команд для исполнения.

АЛУ команд используется для вычисления физических адресов необходимых для работы микропроцессора команд и данных.

Управляющие регистры - CR0, CR1, CR2, CR3, - имеют длину по 32 бита. Эти регистры устанавливают режим работы процессора (нормальный, защищенный и т.д.), контролируют постраничное распределение памяти, и т.д. Они доступны только для привилегированных программ. Младшая часть регистра CR0 используется как слово состояния машины.

Отладочные регистры - DR0-DR7 - содержат адреса восьми точек прерывания и устанавливают, что должно произойти при достижении программой соответствующей точки прерывания. Эти регистры используются при отладке программы с помощью таких отладочных средств, как debug.exe (для реального режима) или ntsd.exe (для защищенного режима). Тестовые (контрольные) регистры TRj используются для контроля постраничной системы распределения памяти, реализуемой операционной системой.

Система команд микропроцессора

Один из основных принципов построения ЭВМ был сформулирован американским ученым Дж. фон Нейманом: работой ЭВМ управляет программа, состоящая из отдельных команд. Программа размещается вместе с данными в основной памяти ЭВМ. Каждая команда хранится в отдельной ячейке памяти (или группе смежных ячеек) и имеет свой адрес. Все команды имеют одинаковую структуру. Они состоят из двух частей: кода операции и адресной части. Код операции определяет, какую команду нужно выполнить. Адресная часть определяет, где хранятся операнды, т.е. обрабатываемые данные, и куда необходимо поместить результат операции.

В зависимости от количества используемых в команде операндов различаются одно-, двух-, трех-, четырехадресные и безадресные команды.

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

В двухадресных командах оба операнда перед выполнением операции находятся в памяти, поэтому их адреса указываются в команде. После выполнения команды в один из этих адресов засылается результат, а находившийся там операнд теряется.

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

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

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

Все команды программы выполняются последовательно, команда за командой, в том порядке, как они записаны в памяти ЭВМ (естественный порядок следования команд). Этот порядок характерен для линейных программ , т.е. программ, не содержащих разветвлений.

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

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

Семейство микропроцессоров фирмы Intel, начиная от 8086 и вплоть до Pentium последних моделей, имеет базовую систему команд, в состав которой входят следующие группы:

1.6. ПРИНЦИПЫ ФОН НЕЙМАНА

В 1945 г. к работе над созданием вычислительной машины был привлечен знаменитый математик Джон фон Нейман.

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

Устройства компьютера

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

1. арифметическо-логическое устройство, выполняющее арифметические и логические операции;

2. устройство управления, которое организует процесс выполне­ния программ;

3. запоминающее устройство, или память для хранения про­грамм и данных;

4. внешние устройства для ввода-вывода информации.

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

Вот каковы должны быть связи между устройствами компьютера (одинарные линии показывают управляющие связи, двойные — ин­формационные).

Особенности современных компьютеров. Следует заметить, что схема устройства современных компьютеров несколько отличается от приведенной выше. В частности, арифметическо-логическое устройство и устройство управления, как правило, объединены в единое устройство — центральный процессор. Кроме того, процесс выполнения программ может прерываться для выполнения неотложных действий связанных с поступившими сигналами от внешних устройств компьютера — прерываний. Многие быстродействующие компьютеры осуществляют параллельную обработку данных на нескольких процессорах. Тем не менее, большинство современных компьютеров в основных чер­тах соответствуют принципам, изложенным фон Нейманом.

Принципы работы компьютера

В общих чертах работу компью­тера можно описать так. Вначале с помощью какого-либо внешнего устройства в память компьютера вводится программа. Устройство уп­равления считывает содержимое ячейки памяти, где находится первая инструкция (команда) программы, и организует ее выполнение. Эта ко­манда может задавать выполнение арифметических или логических операций, чтение из памяти данных для выполнения арифметических или логических операций или запись их результатов в память, ввод данных из внешнего устройства в память или вывод данных из памяти на внешнее устройство.

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

Программный принцип работы компьютера

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

Персональный компьютер (ПК) — это компьютер, предназначенный для обслуживания одного рабочего места. По своим характеристикам он может отличаться от больших ЭВМ, но функционально способен выполнять аналогичные операции. По способу эксплуатации различают настольные (desktop), портативные (laptop и notebook) и карманные (palmtop) модели ПК.

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

Устройство компьютера. Любой компьютер (даже самый большой)состоит из четырех частей:

  • устройства ввода информации
  • устройства обработки информации
  • устройства хранения
  • устройства вывода информации.

Схема устройства компьютера впервые была предложена в 1946 году американским ученым Джоном фон Нейманом. Дж. фон Нейман сформулировал основные принципы работы ЭВМ, которые во многом сохранились и в современных компьютерах.

Основу компьютеров образует аппаратура, построенная, в основном, с использованием электронных и электромеханических элементов и устройств.

Принцип действия компьютеров состоит в выполнении программ — заранее заданных, четко определённых последовательностей арифметических, логических и других операций

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

Команда — это описание элементарной операции, которую должен выполнить компьютер.

Этот принцип обеспечивает универсальность использования компьютера.

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

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

Функции процессора:

  • обработка данных по заданной программе путем выполнения арифметических и логических операций;
  • программное управление работой устройств компьютера.

Функции памяти:

  • приём информации из других устройств;
  • запоминание информации;
  • выдача информации по запросу в другие устройства машины.

Принципы фон-Неймана:

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

2. Принцип адресности. Основная память состоит из перенумерованных ячеек; процессору времени доступна любая ячейка.

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

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

Принцип работы компьютера:

· С помощью внешнего устройства в память компьютера вводится программа.

· Устройство управления считывает содержимое ячейки памяти, где находится первая инструкция (команда) программы и организует ее выполнение. Команда может задавать:

  • выполнение логических или арифметических операций;
  • чтение из памяти данных для выполнения арифметических или логических операций;
  • запись результатов в память;
  • ввод данных из внешнего устройства в память;
  • вывод данных из памяти на внешнее устройство.

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

Результаты выполнения программы выводятся на внешнее устройство компьютера.

Компьютер переходит в режим ожидания сигнала от внешнего устройства.

Системное ПО.

Главной частью системного программного обеспечения является операционная система.

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

К системному ПО кроме ОС следует отнести и множество программ обслуживающего, сервисного характера. Например, это программы обслуживания дисков (копирование, форматирование), сжатия файлов на дисках (архиваторы) борьбы с компьютерными вирусами и многое другое.

Прикладное программное обеспечение

Для выполнения на компьютере конкретных работ (создания текстов и рисунков, обработки числовых данных и т. д.) требуется прикладное программное обеспечение.

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

Системы программирования являются для программистов-профессионалов инструментами разработки программ на различных языках программирования (Basic, Pascal, С и др.). В настоящее время появились системы визуального программирования (Visual Basic, Borland Delphi и др.), которые позволяют даже начинающему пользователю компьютера создавать несложные программы.

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

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

В связи со стремительным развитием глобальных и локальных компьютерных сетей все большее значение приобретают различные коммуникационные программы.

Из-за широкого распространения компьютерных вирусов можно отнести к отдельной группе антивирусные программы.

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

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

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

За последнюю неделю дважды объяснял людям как организована работа с памятью в х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, так как они нам не понадобятся. Итак наше небольшое отступление про регистры и стек закончилось переходим обратно к организации памяти.

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

Логический адрес --> Линейный (виртуальный)--> Физический

image


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

Линейный адрес вычисляется по формуле:
линейный адрес=Базовый адрес сегмента(на картинке это начало сегмента) + смещение
Сегмент кода

Базовый адрес сегмента кода берется из регистра CS. Значение смещения для сегмента кода берется из регистра EIP, в котором хранится адрес инструкции, после исполнения которой, значение EIP увеличивается на размер этой команды. Если команда занимает 4 байта, то значение EIP увеличивается на 4 байта и будет указывать уже на следующую инструкцию. Все это делается автоматически без участия программиста.
Сегментов кода может быть несколько в нашей памяти. В нашем случае он один.
Сегмент данных

Данные загружаются в регистры DS, ES, FS, GS
Это значит что сегментов данных может быть до 4х. На нашей картинке он один.
Смещение внутри сегмента данных задается как операнд команды. По дефолту используется сегмент на который указывает регистр DS. Для того чтобы войти в другой сегмент надо это непосредственно указать в команде префикса замены сегмента.
Сегмент стека

Используемый сегмент стека задается значением регистра 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 содержат линейный базовый адрес описываемым данным дескриптором сегмента. Напомню нашу формулу для нахождения линейного адреса:

линейный адрес = базовый адрес + смещение
[база; база+предел)

В зависимости от 55 G-бита(гранулярити), предел может измеряться в байтах при нулевом значении бита и тогда максимальный предел составит 1 мб, или в значении 1, предел измеряется страницами, каждая из которых равна 4кб. и максимальный размер такого сегмента будет 4Гб.
Для сегмента стека предел будет в интервале:
(база+предел; вершина]

Кстати интересно почему база и предел так рвано располагаются в дескрипторе. Дело в том что процессоры х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, и производится повторное обращение к дескриптору, сегмент которого находится уже в памяти.

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

Читайте также: