ЛР10. Рефактор методички
- Исправлена ошибка в изображении с уровнями абстракций в системе RISCV. Изображение векторизовано. - Изменено взаимодействие с регистром mie, чтобы соответствовать привилегированной спецификации. - Удалено дублирование текста из дополнительных материалов по CSR. - Обновлена программа с обработчиком перехватов: теперь регистр mie выставляется в последнюю очередь.
Before Width: | Height: | Size: 837 KiB After Width: | Height: | Size: 425 KiB |
4
.pic/Labs/lab_10_irq/fig_01.drawio.svg
Normal file
After Width: | Height: | Size: 238 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 1015 KiB After Width: | Height: | Size: 542 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 567 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 589 KiB |
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
Данная лабораторная работа посвящена изучению систем прерывания в компьютерах и их использованию для обработки программных и аппаратных событий. В процессе работы вы познакомитесь с основными понятиями и принципами работы систем прерывания, а также со средствами программной обработки прерываний.
|
Данная лабораторная работа посвящена изучению систем прерывания в компьютерах и их использованию для обработки программных и аппаратных событий. В процессе работы вы познакомитесь с основными понятиями и принципами работы систем прерывания, а также со средствами программной обработки прерываний.
|
||||||
|
|
||||||
|
## Материал для подготовки к лабораторной работе
|
||||||
|
|
||||||
|
- Изучить [теорию по регистрам контроля и статуса](../../Other/CSR.md).
|
||||||
|
|
||||||
## Цель
|
## Цель
|
||||||
|
|
||||||
1. Разработать модуль контроллера прерываний.
|
1. Разработать модуль контроллера прерываний.
|
||||||
@@ -35,13 +39,15 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
На протяжении многих лет, концепция понятия "прерывание" постоянно расширялась. Семейство процессоров 80x86 внесло ещё большую путаницу введя инструкцию `int` (программное прерывание). Многие производители используют такие термины как: **исключение** (_exception_), **ошибка** (_fault_), **отказ** (_abort_), **ловушка** (_trap_) и **прерывание** (_interrupt_), чтобы описать явление, которому посвящена данная лабораторная работа. К несчастью, не существует какого-то чёткого соглашения насчёт этих названий. Разные авторы по-разному приспосабливают эти термины для своего повествования[[3, стр. 995](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/CH17.PDF)]. Для того, чтобы постараться избежать путаницы, в данной лабораторной работе мы будем использовать три термина, которые введены в спецификации архитектуры RISC-V[[4, стр. 10](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)], однако имейте в виду, что за пределами этой методички и спецификации RISC-V в эти термины могут вкладывать другие смыслы.
|
На протяжении многих лет, концепция понятия "прерывание" постоянно расширялась. Семейство процессоров 80x86 внесло ещё большую путаницу введя инструкцию `int` (программное прерывание). Многие производители используют такие термины как: **исключение** (_exception_), **ошибка** (_fault_), **отказ** (_abort_), **ловушка** (_trap_) и **прерывание** (_interrupt_), чтобы описать явление, которому посвящена данная лабораторная работа. К несчастью, не существует какого-то чёткого соглашения насчёт этих названий. Разные авторы по-разному приспосабливают эти термины для своего повествования[[3, стр. 995](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/CH17.PDF)].
|
||||||
|
|
||||||
|
Для того, чтобы постараться избежать путаницы, в данной лабораторной работе мы будем использовать три термина, которые введены в спецификации архитектуры RISC-V[[4, стр. 10](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)], однако имейте в виду, что за пределами данного практикума и спецификации RISC-V в эти термины могут вкладывать другие смыслы.
|
||||||
|
|
||||||
Сперва озвучим выдержку из спецификации, а потом дадим этим терминам обывательские определения.
|
Сперва озвучим выдержку из спецификации, а потом дадим этим терминам обывательские определения.
|
||||||
|
|
||||||
1. Под **исключением** будут подразумеваться нетипичные условия, произошедшие во время исполнения программы, связанные с инструкцией в текущем харте (_hart_, сокращение от **har**dware **t**hread — аппаратном потоке).
|
1. Под **исключением** будут подразумеваться нетипичные условия, произошедшие во время исполнения программы, связанные с инструкцией в текущем харте (_hart_, сокращение от **har**dware **t**hread — аппаратном потоке).
|
||||||
2. Под **прерыванием** будут подразумеваться внешние асинхронные события, которые могут стать причиной непредвиденной передачи управления внутри текущего харта.
|
2. Под **прерыванием** будут подразумеваться внешние асинхронные события, которые могут стать причиной непредвиденной передачи управления внутри текущего харта.
|
||||||
3. Под **перехватом** (вариант глагольного использования слова _trap_, которое обычно переводят как "ловушка") будет подразумеваться передача управления **обработчику перехватов** (_trap handler_), вызванная либо прерыванием, либо исключением.
|
3. Под **перехватом** (вариант глагольного использования слова _trap_, которое обычно переводят как "ловушка", что по мнению автора совершенно не раскрывает сути этого понятия) будет подразумеваться передача управления **обработчику перехватов** (_trap handler_), вызванная либо прерыванием, либо исключением.
|
||||||
|
|
||||||
Иными словами, **прерываниями** мы будем называть исключительно аппаратные (внешние, асинхронные) события, которые могут привести к **перехвату** (передаче управления обработчику). Под **исключениями** мы будем подразумевать исключительно программные (являющиеся следствием какой-то инструкции, синхронные) события, которые могут привести к **перехвату**.
|
Иными словами, **прерываниями** мы будем называть исключительно аппаратные (внешние, асинхронные) события, которые могут привести к **перехвату** (передаче управления обработчику). Под **исключениями** мы будем подразумевать исключительно программные (являющиеся следствием какой-то инструкции, синхронные) события, которые могут привести к **перехвату**.
|
||||||
|
|
||||||
@@ -49,18 +55,20 @@
|
|||||||
|
|
||||||
Прерывания и исключения — это события (причины). Перехват — это действие (следствие).
|
Прерывания и исключения — это события (причины). Перехват — это действие (следствие).
|
||||||
|
|
||||||
|
Та часть разрабатываемой процессорной системы, которая будет отвечать за обработку прерываний и исключений, будет называться традиционным именем "**Система прерываний**".
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Современные процессоры, предусматривающие запуск операционной системы, обладают несколькими уровнями привилегий выполнения инструкций. Это значит, что существует специальный регистр, определяющий режим, в котором в данный момент находится вычислительная машина. Наличие определенного значения в этом регистре устанавливает определенные ограничения для выполняемой в данный момент программы. В архитектуре RISC-V выделяется 4 режима работы, в порядке убывания возможностей и увеличения ограничений:
|
Современные процессоры, предусматривающие запуск операционной системы, обладают несколькими уровнями привилегий выполнения инструкций. Это значит, что существует специальный регистр, определяющий режим, в котором в данный момент находится вычислительная машина. Наличие определенного значения в этом регистре устанавливает соответствующие ограничения для выполняемой в данный момент программы. В архитектуре RISC-V выделяется 4 режима работы, в порядке убывания возможностей и увеличения ограничений:
|
||||||
|
|
||||||
1. **машинный** (machine mode), в котором можно всё;
|
1. **машинный** (machine mode), в котором можно всё;
|
||||||
2. **гипервизора** (hypervisor mode), который поддерживает виртуализацию машин, то есть эмуляцию нескольких машин (потенциально с несколькими операционными системами), работающих на одной физической машине;
|
2. **гипервизора** (hypervisor mode), который поддерживает виртуализацию машин, то есть эмуляцию нескольких машин (потенциально с несколькими операционными системами), работающих на одной физической машине;
|
||||||
3. **привилегированный** (supervisor mode), для операционных систем, с возможностью управления ресурсами;
|
3. **привилегированный** (supervisor mode), для операционных систем, с возможностью управления ресурсами;
|
||||||
4. **пользовательский** (user mode), для прикладных программ, использующих только те ресурсы, которые определила операционная система.
|
4. **пользовательский** (user mode), для прикладных программ, использующих только те ресурсы, которые определила операционная система.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
_Рисунок 1. Распределение привилегий по уровням абстракций программного обеспечения._
|
_Рисунок 1. Распределение привилегий по уровням абстракций программного обеспечения [[5, стр.448](https://doi.org/10.1007/978-981-16-9113-3_33)]._
|
||||||
|
|
||||||
Переключение между этими режимами происходит с помощью исключения, называемого **системный вызов**, и который происходит при выполнении специальной инструкции. Для RISC-V такой инструкцией является **ecall**. Это похоже на вызов подпрограммы, но при системном вызове изменяется режим работы и управление передается операционной системе, которая, по коду в инструкции вызова определяет, что от нее хотят. Например, операционная система может предоставить данные с диска, так как запускаемая программа не имеет никакого представления о том, на какой машине ее запустили, или что используется какая-то конкретная файловая система.
|
Переключение между этими режимами происходит с помощью исключения, называемого **системный вызов**, и который происходит при выполнении специальной инструкции. Для RISC-V такой инструкцией является **ecall**. Это похоже на вызов подпрограммы, но при системном вызове изменяется режим работы и управление передается операционной системе, которая, по коду в инструкции вызова определяет, что от нее хотят. Например, операционная система может предоставить данные с диска, так как запускаемая программа не имеет никакого представления о том, на какой машине ее запустили, или что используется какая-то конкретная файловая система.
|
||||||
|
|
||||||
@@ -72,92 +80,61 @@ _Рисунок 1. Распределение привилегий по уров
|
|||||||
|
|
||||||
В самом простом случае система прерывания позволяет обрабатывать только одно прерывание за раз (именно такую систему мы и будет делать в рамках данной лабораторной работы). Существуют реализации позволяющие во время обработки прерывания «отвлекаться» на другие события. В таких системах используется система приоритетов, чтобы прерывание с более низким приоритетом не прерывало более приоритетное.
|
В самом простом случае система прерывания позволяет обрабатывать только одно прерывание за раз (именно такую систему мы и будет делать в рамках данной лабораторной работы). Существуют реализации позволяющие во время обработки прерывания «отвлекаться» на другие события. В таких системах используется система приоритетов, чтобы прерывание с более низким приоритетом не прерывало более приоритетное.
|
||||||
|
|
||||||
### Регистры Статуса и Управления (Control and Status Registers)
|
### Регистры Контроля и Статуса
|
||||||
|
|
||||||
Для поддержания работы операционной системы, виртуализации, системы прерывания и тому подобное, в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **Control and Status Registers** (**CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения работы прерываний и многое другое.
|
В процессе создания декодера инструкций в [ЛР№5](../05.%20Main%20decoder/) вы уже реализовывали инструкции для работы с [регистрами контроля и статуса](../../Other/CSR.md). Теперь необходимо спроектировать блок управления этими регистрами.
|
||||||
|
|
||||||
Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[5, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается в каком режиме, что можно делать с этим регистром. После идет название, а в правом столбике описание.
|
Для реализации простейшей системы прерывания на процессоре с архитектурой RISC-V достаточно реализовать 5 регистров контроля и статуса, работающих в машинном (самом привилегированном) режиме.
|
||||||
|
|
||||||
В этой таблице можно увидеть регистры для сохранения адреса возврата из прерывания, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
_Таблица 1. Регистры контроля и состояния машинного (наивысшего) уровня привилегий._
|
|
||||||
|
|
||||||
Для работы с CS-регистрами используются специальные инструкции **SYSTEM** (1110011) I-типа, хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Основной дешифратор".
|
|
||||||
|
|
||||||
| opcode | func3 | Тип | Инструкция | Описание | Операция |
|
|
||||||
|--------|-------|-----|---------------------|---------------------------|-----------------------------|
|
|
||||||
|1110011 | 000 | I | mret | Возврат из прерывания | PC = mepc |
|
|
||||||
|1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = rs1 |
|
|
||||||
|1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| rs1 |
|
|
||||||
|1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~rs1 |
|
|
||||||
|1110011 | 101 | I | csrrwi rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = imm |
|
|
||||||
|1110011 | 110 | I | csrrsi rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| imm |
|
|
||||||
|1110011 | 111 | I | csrrci rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~imm |
|
|
||||||
|
|
||||||
_Таблица 2. Список инструкций для работы с регистрами контроля и статуса._
|
|
||||||
|
|
||||||
Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CS-регистрами.
|
|
||||||
|
|
||||||
| Псевдоинструкция | Инструкция RISC-V | Описание | Операция |
|
|
||||||
|------------------|--------------------|-------------|-----------|
|
|
||||||
| csrr rd, csr | csrrs rd, csr, x0 | Чтение CSR | rd = csr |
|
|
||||||
| csrw csr, rs1 | csrrw x0, csr, rs1 | Запись CSR | csr = rs1 |
|
|
||||||
|
|
||||||
_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._
|
|
||||||
|
|
||||||
Операция логического ИЛИ нулевого регистра с содержимым CS-регистра не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`.
|
|
||||||
|
|
||||||
Для реализации простейшей системы прерывания на процессоре с архитектурой RISC-V достаточно реализовать 5 CS-регистров, работающих в машинном, самом привилегированном режиме.
|
|
||||||
|
|
||||||
| Адрес | Уровень привилегий | Название | Описание |
|
| Адрес | Уровень привилегий | Название | Описание |
|
||||||
|--------|--------------------|----------|----------------------------------------------------|
|
|--------|--------------------|----------|----------------------------------------------------|
|
||||||
| **Machine Trap Setup** |
|
| **Machine Trap Setup** |
|
||||||
|0x304 | MRW | mie | Регистр маски прерываний. |
|
|0x304 | MRW | mie | Регистр маски перехватов. |
|
||||||
|0x305 | MRW | mtvec | Базовый адрес обработчика перехвата. |
|
|0x305 | MRW | mtvec | Базовый адрес обработчика перехвата. |
|
||||||
|0x340 | MRW | mscratch | Адрес верхушки стека обработчика перехвата. |
|
|0x340 | MRW | mscratch | Адрес верхушки стека обработчика перехвата. |
|
||||||
|0x341 | MRW | mepc | Регистр, хранящий адрес перехваченной инструкции. |
|
|0x341 | MRW | mepc | Регистр, хранящий адрес перехваченной инструкции. |
|
||||||
|0x342 | MRW | mcause | Причина перехвата |
|
|0x342 | MRW | mcause | Причина перехвата |
|
||||||
|
|
||||||
_Таблица 4. Список регистров, подлежащих реализации в рамках лабораторной работы._
|
_Таблица 1. Список регистров, подлежащих реализации в рамках лабораторной работы._
|
||||||
|
|
||||||
По адресу `0x304` должен располагаться регистр, позволяющий маскировать прерывания. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1.
|
По адресу `0x304` должен располагаться регистр, позволяющий маскировать перехваты. Например, если на 5-ом входе системы прерывания генерируется прерывание, то процессор отреагирует на него только в том случае, если 5-ый бит регистра `mie` будет равен 1. Младшие 16 бит этого регистра спецификация RISC-V отводит под маскирование специальных системных прерываний, который не будут поддерживаться нашим процессором (подробней об этом будет в описании регистра mcause). Поэтому в нашей процессорной системе мы будем использовать только старшие 16 бит регистра `mie`, которые отведены для нужд конкретной платформы.
|
||||||
|
|
||||||
Регистр `mtvec` состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырем, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания:
|
По адресу `0x305` должен располагаться регистр `mtvec`, который состоит из двух полей: BASE[31:2] и MODE. Поле BASE хранит старшие 30 бит базового адреса обработчика перехвата (поскольку этот адрес должен быть всегда равен четырем, младшие два бита считаются равными нулю). Поле MODE кодирует тип системы прерывания:
|
||||||
|
|
||||||
- `MODE == 2'd0` — система прерывания обзорная;
|
- `MODE == 2'd0` — система прерывания обзорная;
|
||||||
- `MODE == 2'd1` — система прерывания векторная.
|
- `MODE == 2'd1` — система прерывания векторная.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Рисунок 2. Разделение регистра `mtvec` на поля `BASE` и `MODE`
|
_Рисунок 2. Разделение регистра `mtvec` на поля `BASE` и `MODE`_
|
||||||
|
|
||||||
В случае обзорной системы прерывания, любой перехват приводит к загрузке в PC значения базового адреса обработчика перехвата (`PC=BASE`). В векторной системе прерывания исключения обрабатываются таким же способом, как и в обзорной системе, а вот прерывания обрабатываются путем загрузки в PC суммы базового адреса и учетверенного значения причины прерывания (`PC=BASE+4*CAUSE`).
|
В случае обзорной системы прерывания, любой перехват приводит к загрузке в PC значения базового адреса обработчика перехвата (`PC=BASE`). В векторной системе прерывания исключения обрабатываются таким же способом, как и в обзорной системе, а вот прерывания обрабатываются путем загрузки в PC суммы базового адреса и учетверенного значения причины прерывания (`PC=BASE+4*CAUSE`).
|
||||||
|
|
||||||
В рамках данной лабораторной работы мы будем реализовывать обзорную систему прерываний. Кроме того, поскольку у обзорной системы прерываний `MODE==0`, что совпадет с тем, что два младших бита базового адреса обработчика перехвата должны быть равны нулю, при перехвате мы можем присваивать программному счетчику значение `mtvec` без каких-либо преобразований.
|
В рамках данной лабораторной работы мы будем реализовывать обзорную систему прерываний. Кроме того, поскольку у обзорной системы прерываний `MODE==0`, что совпадет с тем, что два младших бита базового адреса обработчика перехвата должны быть равны нулю, при перехвате мы можем присваивать программному счетчику значение `mtvec` без каких-либо преобразований.
|
||||||
|
|
||||||
Так как обработчик перехвата будет использовать те же регистры, что и прерванная программа, то перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на стеке. Стек для перехвата находится не там же, где программный стек, а адрес начала этого стека хранится в регистре `mscratch` и по сути является указателем на верхушку стека. Регистр `mepc` сохраняет адрес инструкции во время которой произошел перехват. Это очень важно понимать, при реализации обработчика исключения — если в нем не перезаписать этот регистр, по возврату из обработчика процессор снова окажется на инструкции, которая вызвала исключение.
|
Так как обработчик перехвата будет использовать те же регистры, что и прерванная программа, перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на специальном стеке — стеке прерываний. Адрес начала этого стека хранится в регистре `mscratch`, расположенного по адресу `0x340` и по сути является указателем на верхушку стека прерываний.
|
||||||
|
|
||||||
То как кодируется причина перехвата в регистре `mcause` описано в спецификации привилегированной архитектуры[[5, стр. 38]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf):
|
Регистр `mepc`, расположенный по адресу `0x341` сохраняет адрес инструкции во время исполнения которой произошел перехват. Это очень важно понимать, при реализации **обработчика исключения** — если в нем не перезаписать этот регистр, по возврату из обработчика **процессор снова окажется на инструкции, которая вызвала исключение**.
|
||||||
|
|
||||||
|
То как кодируется причина перехвата в регистре `mcause`, расположенного по адресу `0x342` описано в спецификации привилегированной архитектуры[[6, стр. 38]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf):
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
_Таблица 5. Кодирование причины перехвата в регистре `mcause`._
|
_Таблица 2. Кодирование причины перехвата в регистре `mcause`._
|
||||||
|
|
||||||
Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain).
|
Нас интересуют части, выделенные красным. В первую очередь то, как кодируется старший бит регистра `mcause`. Он зависит от типа причины перехвата (`1` в случае прерывания, `0` в случае исключения). Оставшиеся 31 бит регистра отводятся под коды различных причин. Поскольку мы создаем учебный процессор, который не будет использован в реальной жизни, он не будет поддерживать большую часть прерываний/исключений (таких как невыровненный доступ к памяти, таймеры и т.п.). В рамках данного курса мы должны поддерживать исключение по нелегальной инструкции (код 0x02) и должны уметь поддерживать прерывания периферийных устройств (под которые зарезервированы коды начиная с 16-го, именно поэтому мы будем использовать только старшие 16 бит регистра `mie`). В рамках данной лабораторной работы процессор будет поддерживать только один источник прерывания, поэтому для кодирования причины прерывания нам потребуется только первый код из диапазона _"Designated for platform use"_. В случае, если вы захотите расширить количество источников прерываний, вы можете выполнить вспомогательную [лабораторную работу №12](../12.%20Daisy%20chain).
|
||||||
|
|
||||||
Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x80000010`.
|
Таким образом: в случае если произошло исключение (в связи с нелегальной инструкцией), значение `mcause` должно быть `0x00000002`. Если произошло прерывание, значение `mcause` должно быть `0x80000010`.
|
||||||
|
|
||||||
При желании, процессор можно будет улучшить, добавив поддержку большего числа периферийных устройств. В этом случае потребуется только расширить контроллер прерываний.
|
При желании, процессор можно будет улучшить, добавив поддержку большего числа периферийных устройств. В этом случае потребуется только расширить контроллер прерываний.
|
||||||
|
|
||||||
Когда процессор включается, программа первым делом должна инициализировать все требуемые CS-регистры, в частности:
|
Когда процессор включается, программа первым делом должна инициализировать регистры контроля и статуса, в частности:
|
||||||
|
|
||||||
- задать маску прерывания `mie`,
|
|
||||||
- задать адрес вектора прерывания `mtvec`,
|
- задать адрес вектора прерывания `mtvec`,
|
||||||
- задать адрес вершины стека прерываний `mscratch`.
|
- задать адрес вершины стека прерываний `mscratch`,
|
||||||
|
- задать маску прерывания `mie`.
|
||||||
|
|
||||||
После чего уже можно переходить к исполнению основного потока инструкций.
|
После чего уже можно переходить к исполнению основного потока инструкций. Обратите внимание, что маску прерываний следует задавать в последнюю очередь, т.к. в противном случае система может начать реагировать на прерывания, не имея в регистре `mtvec` корректного адреса вектора прерываний.
|
||||||
|
|
||||||
### Реализация прерываний в архитектуре RISC-V
|
### Реализация прерываний в архитектуре RISC-V
|
||||||
|
|
||||||
@@ -169,13 +146,13 @@ _Таблица 5. Кодирование причины перехвата в
|
|||||||
- сохраняет адрес перехваченной инструкции, в `mepc`,
|
- сохраняет адрес перехваченной инструкции, в `mepc`,
|
||||||
- переходит к обработчику перехвата, загружая в `PC` адрес, предварительно настроенный в `mtvec`.
|
- переходит к обработчику перехвата, загружая в `PC` адрес, предварительно настроенный в `mtvec`.
|
||||||
|
|
||||||
После перехода по адресу в `mtvec` обработчик считывает регистр `mcause`, чтобы проверить, что вызвало прерывание или исключение, и реагирует соответствующим образом (например, считывая клавиатуру при аппаратном прерывании).
|
После перехода по адресу в `mtvec` обработчик считывает регистр `mcause`, чтобы проверить, что вызвало прерывание или исключение, и реагирует соответствующим образом (например, считывая пришедший с клавиатуры символ при аппаратном прерывании).
|
||||||
|
|
||||||
После выполнения программы-обработчика перехвата, возвращение в программу выполняется командой возврата `mret`, которая помещает в `PC` значение регистра `mepc`. Сохранение `PC` инструкции при прерывании в `mepc` аналогично использованию регистра `ra` для хранения обратного адреса во время инструкции `jal`. Обработчики прерываний должны использовать программные регистры (`x1−x31`) для своей работы, поэтому они используют память, на которую указывает `mscratch`, для хранения и восстановления этих регистров.
|
После выполнения программы-обработчика перехвата, возвращение в программу выполняется командой возврата `mret`, которая помещает в `PC` значение регистра `mepc`. Сохранение `PC` инструкции при прерывании в `mepc` аналогично использованию регистра `ra` для хранения обратного адреса во время инструкции `jal`. Поскольку обработчики перехватов могут использовать для своей работы регистровый файл, для хранения и восстановления значений его регистров им нужен отдельный стек, на который указывает `mscratch`.
|
||||||
|
|
||||||
Контроллер прерываний – это блок процессора, обеспечивающий взаимодействие с устройствами, запрашивающими прерывания, формирование кода причины прерывания для процессора, маскирование прерываний, а также, в других реализациях, может реагировать на прерывания в соответствии с приоритетом и тому подобное.
|
Контроллер прерываний – это блок процессора, обеспечивающий взаимодействие с устройствами, запрашивающими прерывания, формирование кода причины прерывания для процессора, маскирование прерываний. В некоторых реализация, контроллер прерываний может реагировать на прерывания в соответствии с приоритетом.
|
||||||
|
|
||||||
Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания паре проводов: запрос на прерывание (`irq_req_i`) и прерывание обслужено (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x80000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`.
|
Периферийное устройство, которое может генерировать прерывание, подключается к контроллеру прерывания парой проводов: "запрос на прерывание" (`irq_req_i`) и "прерывание обслужено" (`irq_ret_o`). Предположим, к контроллеру прерываний подключили клавиатуру. Когда на ней нажимают клавишу, код этой клавиши попадает в буферный регистр с дополнительным управляющим битом, выставленным в единицу, который подключен к входу запроса на прерывание. Если прерывание не замаскировано (в нашем процессоре это означает, что нулевой бит регистра `mie` выставлен в 1), то контроллер прерывания сгенерирует код причины прерывания (в нашем случае — это константа `0x80000010`). Кроме этого, контроллер прерывания подаст сигнал `irq_o`, чтобы устройство управления процессора узнало, что произошло прерывание и разрешило обновить содержимое регистра причины `mcause`, сохранило адрес прерванной инструкции в `mepc` и загрузило в `PC` вектор прерывания `mtvec`.
|
||||||
|
|
||||||
Когда будет выполняться инструкция `mret`, устройство управления подаст сигнал контроллеру прерывания, чтобы тот, в свою очередь, направил его в виде сигнала «прерывание обслужено» для соответствующего устройства. После этого периферийное устройство обязано снять сигнал запроса прерывания хотя бы на один такт. В нашем примере сигнал «прерывание обслужено» может быть подключен непосредственно к сбросу буферного регистра клавиатуры.
|
Когда будет выполняться инструкция `mret`, устройство управления подаст сигнал контроллеру прерывания, чтобы тот, в свою очередь, направил его в виде сигнала «прерывание обслужено» для соответствующего устройства. После этого периферийное устройство обязано снять сигнал запроса прерывания хотя бы на один такт. В нашем примере сигнал «прерывание обслужено» может быть подключен непосредственно к сбросу буферного регистра клавиатуры.
|
||||||
|
|
||||||
@@ -224,11 +201,11 @@ _Рисунок 5. Структурная схема контроллера пр
|
|||||||
|
|
||||||
Регистры отслеживания обработки прерывания и исключения нужны для того, чтобы мы могли понимать, что в данный момент процессор уже выполняет обработку прерывания / исключения. В такие моменты (если любой из регистров `exc_h`/`irq_h` содержит значение `1`) все последующие запросы на прерывание игнорируются. За это отвечают вентили И и ИЛИ-НЕ в правом верхнем углу схемы.
|
Регистры отслеживания обработки прерывания и исключения нужны для того, чтобы мы могли понимать, что в данный момент процессор уже выполняет обработку прерывания / исключения. В такие моменты (если любой из регистров `exc_h`/`irq_h` содержит значение `1`) все последующие запросы на прерывание игнорируются. За это отвечают вентили И и ИЛИ-НЕ в правом верхнем углу схемы.
|
||||||
|
|
||||||
>Однако возможна ситуация возникновения исключения во время обработки прерывания — в этом случае, оба регистра будут хранить значение `1`. В момент возврата из обработчика, придет сигнал `mret_i`, который в первую очередь сбросит регистр `exc_h` и только если тот равен нулю, сбросит регистр `irq_h`.
|
Однако возможна ситуация возникновения исключения во время обработки прерывания — в этом случае, оба регистра будут хранить значение `1`. В момент возврата из обработчика, придет сигнал `mret_i`, который в первую очередь сбросит регистр `exc_h` и только если тот равен нулю, сбросит регистр `irq_h`.
|
||||||
>
|
|
||||||
>Исключение во время обработки исключения не поддерживается данной микроархитектурой и приведет к неопределенному поведению. Поэтому код обработчика исключений должен быть написан с особым вниманием.
|
|
||||||
|
|
||||||
Логика установки и сброса работает следующим образом:
|
Исключение во время обработки исключения не поддерживается данной микроархитектурой и скорее всего приведет к циклическому вызову обработчика исключения. Поэтому код обработчика исключений должен быть написан с особым вниманием.
|
||||||
|
|
||||||
|
Логика установки и сброса регистров `irq_h` и `exc_h` работает следующим образом:
|
||||||
|
|
||||||
- если сигнал, обозначенный в прямоугольнике как `reset` равен единице, в регистр будет записано значение `0`;
|
- если сигнал, обозначенный в прямоугольнике как `reset` равен единице, в регистр будет записано значение `0`;
|
||||||
- если сигнал, обозначенный в прямоугольнике как `set` равен единице, в регистр будет записано значение `1`;
|
- если сигнал, обозначенный в прямоугольнике как `set` равен единице, в регистр будет записано значение `1`;
|
||||||
@@ -263,23 +240,24 @@ _start:
|
|||||||
|
|
||||||
08: li x3, 0x00000000 # устанавливаем указатель на глобальные данные
|
08: li x3, 0x00000000 # устанавливаем указатель на глобальные данные
|
||||||
|
|
||||||
0C: li x5, 0x00000001 # подготавливаем маску прерывания единственного
|
0С: la x5, trap_handler # псевдоинструкция la аналогично li загружает число,
|
||||||
# (нулевого) входа
|
10: # только в случае la — это число является адресом
|
||||||
10: csrw mie, x5 # загружаем маску в регистр маски
|
|
||||||
|
|
||||||
14: la x5, trap_handler # псевдоинструкция la аналогично li загружает число,
|
|
||||||
18: # только в случае la — это число является адресом
|
|
||||||
# указанного места (адреса обработчика перехвата)
|
# указанного места (адреса обработчика перехвата)
|
||||||
# данная псевдоинструкция будет разбита на две
|
# данная псевдоинструкция будет разбита на две
|
||||||
# инструкции: lui и addi
|
# инструкции: lui и addi
|
||||||
|
|
||||||
1С: csrw mtvec, x5 # устанавливаем вектор прерывания
|
14: csrw mtvec, x5 # устанавливаем вектор прерывания
|
||||||
|
|
||||||
20: li x5, 0x00001FFC # готовим адрес верхушки стека прерывания
|
18: li x5, 0x00001FFC # готовим адрес верхушки стека прерывания
|
||||||
24: # данная псевдоинструкция будет разбита на две
|
1С: # данная псевдоинструкция будет разбита на две
|
||||||
# инструкции: lui и addi
|
# инструкции: lui и addi
|
||||||
|
|
||||||
28: csrw mscratch, x5 # загружаем указатель на верхушку стека прерывания
|
20: csrw mscratch, x5 # загружаем указатель на верхушку стека прерывания
|
||||||
|
|
||||||
|
24: li x5, 0x00010000 # подготавливаем маску прерывания единственного
|
||||||
|
# входа прерываний
|
||||||
|
|
||||||
|
28: csrw mie, x5 # загружаем маску в регистр маски
|
||||||
|
|
||||||
2С: li x5, 1 # начальное значение глобальной переменной
|
2С: li x5, 1 # начальное значение глобальной переменной
|
||||||
30: sw x5, 0(x3) # загружаем переменную в память
|
30: sw x5, 0(x3) # загружаем переменную в память
|
||||||
@@ -417,7 +395,7 @@ endmodule
|
|||||||
1. Тестовое окружение находится [здесь](tb_csr.sv).
|
1. Тестовое окружение находится [здесь](tb_csr.sv).
|
||||||
2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
||||||
3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_csr`).
|
3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_csr`).
|
||||||
4. Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!
|
4. **По завершению симуляции убедитесь, что в логе есть сообщение о завершении теста!**
|
||||||
4. Внимательно ознакомьтесь с описанием функционального поведения сигналов `interrupt_controller`, а также его структурной схемой. В случае возникновения вопросов, проконсультируйтесь с преподавателем.
|
4. Внимательно ознакомьтесь с описанием функционального поведения сигналов `interrupt_controller`, а также его структурной схемой. В случае возникновения вопросов, проконсультируйтесь с преподавателем.
|
||||||
5. Реализуйте модуль `interrupt_controller`. Для этого:
|
5. Реализуйте модуль `interrupt_controller`. Для этого:
|
||||||
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `interrupt_controller.sv`.
|
1. В `Design Sources` проекта с предыдущих лаб, создайте `SystemVerilog`-файл `interrupt_controller.sv`.
|
||||||
@@ -426,7 +404,7 @@ endmodule
|
|||||||
1. Тестовое окружение находится [здесь](tb_irq.sv).
|
1. Тестовое окружение находится [здесь](tb_irq.sv).
|
||||||
2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
2. Для запуска симуляции воспользуйтесь [`этой инструкцией`](../../Vivado%20Basics/Run%20Simulation.md).
|
||||||
3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_irq`).
|
3. Перед запуском симуляции убедитесь, что в качестве top-level модуля выбран корректный (`tb_irq`).
|
||||||
4. Во время симуляции, вы должны прожать "Run All" и убедиться, что в логе есть сообщение о завершении теста!
|
4. **По завершению симуляции убедитесь, что в логе есть сообщение о завершении теста!**
|
||||||
|
|
||||||
## Список использованной литературы
|
## Список использованной литературы
|
||||||
|
|
||||||
@@ -434,4 +412,5 @@ endmodule
|
|||||||
2. [PIC24FJ512GU410 Family Data Sheet](https://ww1.microchip.com/downloads/aemDocuments/documents/MCU16/ProductDocuments/DataSheets/PIC24FJ512GU410-Family-Data-Sheet-DS30010203D.pdf)
|
2. [PIC24FJ512GU410 Family Data Sheet](https://ww1.microchip.com/downloads/aemDocuments/documents/MCU16/ProductDocuments/DataSheets/PIC24FJ512GU410-Family-Data-Sheet-DS30010203D.pdf)
|
||||||
3. [The Art of Assembly Language](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/)
|
3. [The Art of Assembly Language](https://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/)
|
||||||
4. [The RISC-V Instruction Set Manual Volume I: Unprivileged ISA](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)
|
4. [The RISC-V Instruction Set Manual Volume I: Unprivileged ISA](https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf)
|
||||||
5. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf)
|
5. [Pillai, V.P., Megalingam, R.K. (2022). System Partitioning with Virtualization for Federated and Distributed Machine Learning on Critical IoT Edge Systems. In: Saraswat, M., Sharma, H., Balachandran, K., Kim, J.H., Bansal, J.C. (eds) Congress on Intelligent Systems. Lecture Notes on Data Engineering and Communications Technologies, vol 111. Springer, Singapore.](https://doi.org/10.1007/978-981-16-9113-3_33)
|
||||||
|
6. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf)
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
00004137
|
00004137
|
||||||
FFC10113
|
FFC10113
|
||||||
00000193
|
00000193
|
||||||
00100293
|
|
||||||
30429073
|
|
||||||
04400293
|
04400293
|
||||||
00028293
|
00028293
|
||||||
30529073
|
30529073
|
||||||
@@ -10,6 +8,8 @@ FFC10113
|
|||||||
FFC28293
|
FFC28293
|
||||||
34029073
|
34029073
|
||||||
00100293
|
00100293
|
||||||
|
000102B7
|
||||||
|
00100293
|
||||||
0051A023
|
0051A023
|
||||||
00000313
|
00000313
|
||||||
00000393
|
00000393
|
||||||
|
21
Other/CSR.md
@@ -1,20 +1,20 @@
|
|||||||
# О регистрах контроля и статуса
|
# О регистрах контроля и статуса
|
||||||
|
|
||||||
Для поддержания работы операционной системы, виртуализации, системы прерывания и тому подобное, в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **Control and Status Registers** (**CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения работы прерываний и многое другое.
|
Для поддержания работы операционной системы, виртуализации, системы прерывания (но не ограничиваясь ими), в архитектуре RISC-V предусмотрено использование группы регистров, под общим названием **регистры контроля и статуса** (**Control and Status Registers**, **CSR**), обеспечивающих управление элементами процессора и доступ к статусной информации о системе. С помощью этих регистров реализуются привилегированные режимы работы процессора, хранение указателей на различные программные стеки, статус различных подсистем, регистры для обеспечения перехватов и многое другое.
|
||||||
|
|
||||||
Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[5, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается, что можно делать с этим регистром и в каком режиме. После идет название, а в правом столбце описание.
|
Все регистры имеют уникальные 12-битные адреса, а их роли определены в спецификации на архитектуру RISC-V. В _Таблице 1_ приводится фрагмент спецификации привилегированной архитектуры[[1, стр. 10]](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf), иллюстрирующая некоторые из регистров. В левом столбце указан 12-битный адрес. Далее указывается в каком режиме, что можно делать с этим регистром. После идет название, а в правом столбике описание.
|
||||||
|
|
||||||
В этой таблице можно увидеть регистры для сохранения адреса возврата из прерывания, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров).
|
В этой таблице можно увидеть регистры для сохранения адреса возврата из перехвата, адрес вектора прерывания, регистры причины (cause), регистры настройки безопасности и защиты памяти. И это далеко не полный список регистров, предоставляемых стандартом (который помимо прочего, оставляет место в адресном пространстве для ваших собственных регистров).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
_Таблица 1. Регистры контроля и состояния машинного (наивысшего) уровня привилегий._
|
_Таблица 1. Регистры контроля и статуса машинного (наивысшего) уровня привилегий._
|
||||||
|
|
||||||
Для работы с CS-регистрами используются специальные **SYSTEM**-инструкции I-типа (код операции `1110011`), хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Основной дешифратор".
|
Для работы с CS-регистрами используются специальные **SYSTEM**-инструкции I-типа (с опкодом `1110011`), хранящие в 12-битном поле **imm** адрес регистра, к которому будет осуществлен доступ и адреса в регистровом файле откуда будет считан или куда будет записан один из CS-регистров. Вы уже добавляли поддержку этих инструкций во время выполнения [лабораторной работы №5](../05.%20Main%20decoder/) "Декодер инструкций".
|
||||||
|
|
||||||
| opcode | func3 | Тип | Инструкция | Описание | Операция |
|
| opcode | func3 | Тип | Инструкция | Описание | Операция |
|
||||||
|--------|-------|-----|---------------------|---------------------------|-----------------------------|
|
|--------|-------|-----|---------------------|---------------------------|-----------------------------|
|
||||||
|1110011 | 000 | I | mret | Возврат из прерывания | PC = mepc |
|
|1110011 | 000 | I | mret | Возврат из перехвата | PC = mepc |
|
||||||
|1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = rs1 |
|
|1110011 | 001 | I | csrrw rd, csr, rs1 | Чтение и Запись CSR | rd = csr, csr = rs1 |
|
||||||
|1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| rs1 |
|
|1110011 | 010 | I | csrrs rd, csr, rs1 | Чтение и Установка бит CSR| rd = csr, csr = csr \| rs1 |
|
||||||
|1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~rs1 |
|
|1110011 | 011 | I | csrrc rd, csr, rs1 | Чтение и Очистка бит CSR | rd = csr, csr = csr & ~rs1 |
|
||||||
@@ -24,7 +24,7 @@ _Таблица 1. Регистры контроля и состояния ма
|
|||||||
|
|
||||||
_Таблица 2. Список инструкций для работы с регистрами контроля и статуса._
|
_Таблица 2. Список инструкций для работы с регистрами контроля и статуса._
|
||||||
|
|
||||||
Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CS-регистрами.
|
Для удобства программирования на языке ассемблера RISC-V существуют псевдоинструкции для работы с CSR.
|
||||||
|
|
||||||
| Псевдоинструкция | Инструкция RISC-V | Описание | Операция |
|
| Псевдоинструкция | Инструкция RISC-V | Описание | Операция |
|
||||||
|------------------|--------------------|-------------|-----------|
|
|------------------|--------------------|-------------|-----------|
|
||||||
@@ -33,4 +33,9 @@ _Таблица 2. Список инструкций для работы с ре
|
|||||||
|
|
||||||
_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._
|
_Таблица 3. Псевдоинструкции для работы с регистрами контроля и статуса._
|
||||||
|
|
||||||
Операция логического ИЛИ нулевого регистра с содержимым CS-регистра не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`.
|
Операция логического ИЛИ нулевого регистра регистрового файла с содержимым регистра из блока CSR не меняет его содержимого, поэтому при использовании инструкции `csrr` происходит только операция чтения. Подобным образом реализована псевдоинструкция `csrw`.
|
||||||
|
|
||||||
|
|
||||||
|
## Список использованной литературы
|
||||||
|
|
||||||
|
1. [The RISC-V Instruction Set Manual Volume II: Privileged Architecture](https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf)
|