Как реализовать утилиту сна в RIS C -V? - PullRequest
1 голос
/ 01 августа 2020

Я хочу реализовать утилиту sleep, которая получает количество секунд в качестве ввода и приостанавливает заданные секунды в образовательной xv6 операционной системе, которая работает на risc-v процессорах.

В ОС уже есть системный вызов, который получает количество тиков и пауз: https://github.com/mit-pdos/xv6-riscv/blob/riscv/kernel/sysproc.c#L56

Таймеры инициализируются с использованием вектора таймера: https://github.com/mit-pdos/xv6-riscv/blob/riscv/kernel/kernelvec.S#L93 Вектор таймера инициализируется с помощью CLINT_MTIMECMP функция, которая сообщает контроллеру таймера, когда следует разбудить следующее прерывание.

Я не понимаю, как узнать время между тактами и сколько тактов сделано за 1 секунду.

1 Ответ

2 голосов
/ 04 августа 2020
• 1000 Я не выполнял поиск, чтобы найти нужную информацию, но я думаю, что у меня есть некоторая контекстная информация, которая поможет вам ее найти. Я бы порекомендовал поискать в документации / коде QEMU (возможно, из поиска Github), как работают mtime и mtimecmp.

В разделе 10.1 (Счетчик - Базовый счетчик и таймеры) спецификации 1 поясняется, что псевдо-инструкция RDTIME должна иметь некоторую фиксированную частоту тиков, которая может быть определена на основе реализации 2 . Эта скорость тиков также будет использоваться для mtimecmp и mtime, как определено в привилегированной спецификации 3 .

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

Из старой вики для QEMU-riscv должно быть ясно, что SiFive CLINT определяет функции, необходимые для работы xv6, но я сомневаюсь, что он указывает, как узнать тикрейт. Spike также поддерживает интерфейс CLINT, поэтому может быть поучительным поиск кода в spike, который его обрабатывает.

1 Я использовал версию 20191213 непривилегированной спецификации в качестве ссылки

2

Псевдоинструкция RDTIME считывает младшие биты XLEN времени CSR, который считает реальное время настенных часов, прошедшее с произвольного времени начала в прошлом. . RDTIMEH - это команда только для RV32I, которая считывает биты 63–32 того же счетчика реального времени. Базовый 64-битный счетчик на практике никогда не должен переполняться. Среда выполнения должна обеспечивать средства определения периода счетчика реального времени (секунды / тик). Период должен быть постоянным. Часы реального времени всех хартов в одном пользовательском приложении должны быть синхронизированы с точностью до одного такта часов реального времени. Среда должна обеспечивать средства для определения точности часов.

3

3.1.10 Регистры машинного таймера (mtime и mtimecmp) Платформы предоставляют счетчик реального времени, представленный как отображенный в память регистр чтения-записи машинного режима, mtime. mtime должен работать с постоянной частотой, а платформа должна обеспечивать механизм для определения временной шкалы mtime.

...