March 4

Процессор

Микропроцессор от обычного фактически ничем не отличается. Это синонимы.

Контроллер - готовая схема.

Микроконтроллер - программируемая схема. Больше чем процессор. Там есть таймеры, память + озу + интерфейсы. Это полноценный пк.

CISC - полный набор команд, RISC - простой набор команд.

SISD (Single Instruction, Single Data) - одна инструкиця, одно данное. (mov)

SIMD (Single Instruction, Multiple Data) - одна инструкция, много данных (addps из sse*)

MIMD (Multiple Instruction, Multiple Data) - объеденияет несколько SISD. Несколько команд над несколькими данными.

ALU – arithmetic logic unit

FPU (Floating Point Unit)

IPC (Instruction Per Clock) - мера производительности процессора. Производная герцовки, архитектуры и исполняемого кода.

Предложено вместо герц оперировать понятием энергоэффективности. Performance = Frequency * IPC. -> увеличить быстродействие можно или увеличивая или герцовку или количество инструкций, выполянемых за такт.

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

Цикл работы процессора.

Читается команда, основываясь на регистре ip. Читает, убавляет ip и т.д.

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

Загрузка операндов (опционално)

ALU совершает рассчёт

Данные записываются в память.

Конвеер - то, в чём харнятся инструкции для выполнения. Есть два подхода к увеличению производительности. Первый - уменьшить конвеер, увеличить кол-во ALU и устроить ILP (Instruction-Level Parallelism). Имеет минусы как и всё распаралеривание - для увеличения скорости необходимо, чтобы был поток команд, который можно распаралелить.

Числа хранятся бинарном представлении. Для отрицательных чисел идёт ведущая единица.

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

Существуют разные порядки байтов. Big-endian (используется в tcp/ip) и little-endian. Биты в байте всегда представляются единым образом, а байты в числе по-разному. На некоторых архитекутарх идёт от старшего к младшему (big-endian, хранит старший байт первым), на некоторых наоборот. В x64 используется little-endian.

Также существует middle- и bi- endian'ы (но не в x86_64). Bi - Системно или аппаратно выбирается используемый порядок байтов. Middle - байты каждого слова размещаются в памяти компьютера в прямом порядке (little), а слова, составляющие число в обратном (big)

Существует фон Неймановская и гарвардская системы разделения памяти. Фон Нейман передавал всё по 1 шине для простоты, гарвард по двум для проивзоидетнльности. Отдельно инструкции, отдельно данные. В случае с l1-кешемиспользуется гарвардская архитектура, но в остальном преобладает фон-Неймановская.

l1 кеш - сотни килобайт

  • L1i Кеш инструкций
  • L1d Кеш данных

l2 кеш - мегабайты

l3 кеш - десятки мегабайт

общий для всех ядре

victim cache

vivt-cache - кеширует данные на основе виртуальных адресов. С ним встречаются двсе смешнявки - омонимы и синонимы.

Virtually indexe

d, virtually tagged (VIVT) — виртуально индексируемые и виртуально тегируемые. И для тегирования, и для индекса используется виртуальный адрес. Благодаря этому проверки наличия данных в кэше проходят быстрее, не требуя обращения к MMU.

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

Virtually indexed, physically tagged (VIPT) — виртуально индексируемые и физически тегируемые. Для индекса используется виртуальный адрес, а для тега — физический. Преимуществом перед первым типом является меньшая задержка, поскольку можно искать кэш-линию одновременно с трансляцией адресов в TLB, однако сравнение тега задерживается до получения физического адреса. П

Инклюзивный кеш - больший кеш всегда включает в себя данные из младшего кеша.

Эксклюзивный кеш - данные в кешах всегда различны.

Что лучше? Инклюзивный кеш позволяет не искать данные несколько раз. Эксклюзивный кеш позволяет хранить больше данных. Инклюзивный раскрывается в многопотоке.

Обычно l1 и l2 ни эксклюзивные, ни инклюзивный. А l3 включающий с дочерним -

write-back - кеш записывается в озу, только когда он выбрасывается из кеша. Другая политика - write through - записывается сразу и в кеш и в память

Служебные данные

Смещение - это где в хеш строке хранится нужная часть.

Тег - адрес памяти + pid + в некоторых архитектурах номер vm

Индекс строки

  • Кеш прямого отображения
    Определённая ячейка озу памяти всегда будет храниться в определённой ячейке процессора. Грубо говоря берётся остаток от деления адреса памяти озу и по этому индексу записывается в проц.
    Плюс подхода - скорость доступа.
    Минус - неоптимальное использование памяти. Часто могут происходить коллизии.
  • Наборно-ассоциативный кеш
    Каналы - память разделяется на ассоциативные секции, в которых лежат сегменты прямого отображения. Снижает вероятность коллизий, а скорость остаётся примерно такой же.
  • Полностью ассоциативный кеш. Но он долго ищет.

Алгоритмы

LRU (Least Recently Used), - дольше всего не было обращений

mfu - замещаются последние использованные (

lfu - используемые реже всего

Нужны счётчики того или иного.

Кеш линии - все данные в кешах хранятся линиями (чтобы соотношение занятое место адресом/полезная инфа было больше делается обычно по 64 бит.

tdl - кеш для трансляции адресов из виртуальной памяти. huge pages даёт заметный выигрышь, т.к. их быстрее искать + она занимают меньше места в tdl. Перезапись идёт на основе самой старой использованной записи.

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

TLB первого уровня в Haswell делится на ITLB (instructions) и на DTLB (data).

LB второго уровня (STLB) — только для данных, задержка — 22 такта, размер сета — 8 записей, размер — 1024 записи для 2 МБ и 4 КБ сегментов одновременно.
При смене контекста TLB приходится сбрасывать из-за возможного совпадения виртуальных адресов.

MMU - Memory Management Unit - штука, которая транслирует адреса, в случае tdl miss.

Хранятся помимо виртуальных адресов ещё и pid процесвсов. Потому что сама виртуальная память может совпадать. ASID. Для виртуальных машин присутствует VSID.

slat - В современных процессорах что-то вроде tdl для виртуалок, рассчитан на huge pages

Pages sharing - способ оптимизации памяти при испозьзовании виртуальных машин. Разным виртуальнымм машином часто требуются одинаковые по содержанию страницы. Система виртуализации, используя хеш вычисляет, что такая страница уже существует и не создаёт множество дубликатов страниц. Выдаётся одна страница, а при необходимости записи создаётся дубликат. Фактически не работает с huge pages (они слишком болььшие, чтобы совпадать). Единственный минус - требует много время на "объединение" страниц. Т.е. доп нагрузка на ЦП.

Определяется как считывает байты - Little Endian

Как использовать - выбирать типы данных.

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

Компиляторы часто совершают расширение численного типа. Если мы делаем short a + short b, то формула получается (int)short a + (int)short a.

Самое интересное - инвалидация кеша.

Проблема в многоядерных системах. Нужно понимать насколько актуальны данные в кеше. Являются ли они когерентными.

Когерентность кеша - гарантия согласованности данных между кешами и ядрами.

Есть несколько состояний. По умолчанию присваивается статус

shared - данные актуальны.

invalid - данные неактуальны. Обращения к ним равноценны кеш промаху

modified - самые свежие данные. В этом ядре данные можно менять без заёбов. А вот когда другим данным понадобится информация, котоаря modified - одни процесс сбросит данные в озу (llc), а ядро, котором нужны эти данные возьмёт. После этого состояние станет shared.

Это основные данные. Есть ещё оптимизации.

exlusive - аналог shared, только если таких данных нет в других ядрах. Т.е. единственный экземпляр.

Owned и forwarded - вместо того, чтобы другие ядра постоянно обращались к ОЗУ за актуальными данными, ядро делится напрямую кеш-строками, помеченными как Owned и forwarded. В случае изменения данных все дургие будут помечаны как invalid

В защищённом режиме сам процессор и L1-кэш работают с виртуальным адресом, а L2, L3 и RAM — с физическим.

Внутри ядра:

Извлечение из памяти -> Декодирование -> Выполнение -> Запись.ф

Извлечение из памяти && Декодирование - фронтенд.

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

Кеш микроопераций. Это кеш уже декодированных операций. Увеличиваются всё

Передаётся в бекенд.

какая свободная. Очереди поступают.

Определяются зависимости. Что после чего выполняется. Нужна очерёдность.

Поступает в буфер переупорядочивания.

Определяет какая alu (ALU – arithmetic logic unit) может рассчитать эту операцию и определять что может выполнить что. Вычислительные блоки.

С этими данными попадает в планировщик.

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

Для обмена данными существует интерфейс (шина). Соеденяет все кеши, контроллеры памяти, дисплеи ввода вывода и т.д. Несколько ядер могут выполнять работу надо одним и тем же используя l3. А при большом количестве ядре они передаются адресно (128 ядре слишком быстро забьют l3, поэтому нужно передавать от ядра к ядру напрямую).

SMID инструкции - обобщение инструкций рабтты над векторами. avx*, sse и т.д

Существует абстракция - поток (подпроцессы правильнее сказать). Система может посылать потоки - минимальные исполнимые процессором инструкции. Не путать с процессом - высоким уровнем абстракции - то, что мы видим в системе с pid'ом. Конвеер - процесс. Поток выполнения - рассчёт на процессоре. Процесс - путь подачи.

Архитектуры:

Остаётся совместимость. В процессорах есть всё от 8битных регистров общего назначения al/ah до 64битных rax.

al ah -> ax -> eax -> rax

x86_32

Регистры

Пользовательские - можно харнить любую информацию.

AX – Accumulator - используется для операций * /. В него много чего возвращается от сисколов.
BX – Base register (регистр базы)
CX – Counter - счётчик цикла по умолчанию.
DX – Data
AL/AH/BL/Bh/CL/CH/DL/DH – Младшая/старшая половина 16-битных регистров описанных выше

SI (Source index)/DI (Destination index). Предназначены для хранения текущего смещения адреса источника/приёмника данных соотвественно. Необходимо в операциях копирования данных. Может храниться смещение адреса строки. Совместно с регистром SI используется регистр DS, тогда полный адрес выглядит как DS:SI. (база + смещение = нужный)
BP – Base pointer (указатель базы). При заходе в функцию сохраняется, чтобы относительно него обращаться к переменным.
SP – Stack pointer. Вершина стека.
CS – Code segment - указатель на сегмент исполняемого кода. Процессор использует этот регистр, когда обращается к следующей инструкции.
DS – Data segment - указатель на базовый адрес сегмента с данными программы.
ES - дополнительный Data segment
FS, GS – Тоже дополнительные Data segment'ы, только обычно используются системой при многопоточности.
SS – Stack segment - указатель на начало стека.
IP – Instruction pointer - смещение, указывающее на следующую исполняемую инструкцию. Полный адрес лежит в CS:ЕIP.


GDTR – Global descriptor table register адреса хранения GDT. [L/S]IDT загружает/сохраняет.
IDTR – Interruption descriptor table register указатель на адрес таблицы прерываний. [L/S]IDT загружает/сохраняет таблицу.
TR – Task register для переключения между процессами. Указатель на TSS (Task State Segment),
LDTR – Local descriptor table register - адреса хранения LDT
DR – Debug register - для хранения брейкопинтов и подобного. Их несколько нас самом деле. DR1, DR2, DR3, DR6, DR7. (при переходе на x64 DR4, DR5 переименовали в DR6, DR7)
TR – Test register - не задокументированная хуйня, которую процессор используется для самотестирования. tr3-tr7. Не трогай
CR – Control register - контроль работы процессора. r0-r7. Например можно включить/отключить защищённый режим.

F – Flags - побитовая маска для хранения промежуточных значений операций (например переход через десяток и т.п.). Есть всякие PUSHF для сохранения состояния.
Значащих битов много, тут всё описано.

Ресурсы:

Общее

https://studfile.net/preview/4114123/ (по итогу бОльшая часть статиь написана, основываясь на этом)

https://osdev.org/Main_Page - раздел CPU

https://av-assembler.ru/asm/afd/asm-cpu-registers.htm

https://studfile.net/preview/7346091/page:6/

https://studfile.net/preview/4114123/page:2/#3 - самый общий гайд.

https://www.youtube.com/watch?v=aNVMpiyeY_U - внутри ядра

https://tproger.ru/articles/low-level-memory -читать

https://www.youtube.com/watch?v=7n_8cOBpQrg - больше всего инфы

https://habr.com/ru/articles/211150/

https://translated.turbopages.org/proxy_u/en-ru.ru.af182693-65e52d26-a79bf850-74722d776562/https/en.wikipedia.org/wiki/Direct-mapped_cache -

https://translated.turbopages.org/proxy_u/en-ru.ru.5c4849a2-65e53d98-921b88a6-74722d776562/https/en.wikipedia.org/wiki/Direct-mapped_cache - типы внутренней организации кешей

https://av-assembler.ru/asm/afd/registry-ukazateli.php - регистры

https://habr.com/ru/articles/128991/ - для маленьких и глупых