Как реализовать утилиту сна в RISC-V?

Я хочу реализовать 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 секунду.


person maksadbek    schedule 01.08.2020    source источник


Ответы (1)


Изменить: быстрый Google qemu timebase riscv mtime обнаружил чат групп Google, в котором говорится, что RDTIME - это наносекунды, так как загрузка и mtime - это эмулированные часы с частотой 10 МГц.

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

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

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

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

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

2

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

3

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

person TheThirdOne    schedule 04.08.2020