2. WrmOS: конфигурирование

← 1. WrmOS: система сборки

3. WrmOS: загрузчик →

Содержание
2.1 Описание
2.2 Переменные среды сборки
2.3 Параметры конфигурации проекта
2.4 Параметры конфигурации платформы
2.5 Конфигурация корневого приложения Alpha

2.1 Описание [наверх]


Все конфигурационные файлы обычно находятся в директории cfg/. Она содержит конфигурационный файл проекта, который описывает параметры целевой системы, параметры сборки, путь к тулчейну, параметры ядра, список целевых приложений, файл конфигурации корневого приложения и т.д. Для удобства использования все конфигурационные файлы сгруппированы в 3 директории:

cfg/plt/ Конфигурационные файлы платформы. Они описывают параметры целевой платформы — CPU, память, частоту системной шины, таймер,  UART и MMU.
cfg/prj/ Конфигурационные файлы проекта. Они описывают параметры сборки, список приложений, путь к тулчейну. В этом файле подключается файл конфигурации платформы из директории cfg/plt/ и определяется файл конфигурации корневого приложения из cfg/alph/.
cfg/alph/ Конфигурационные файлы корневого приложения. Они обрабатываются корневым приложением Alpha во время выполнения. Они описывают приложения для запуска и их параметры.

Некоторые обязательные параметры определены в базовом конфигурационном файле cfg/base.cfg.

Конфигурация выглядит следующим образом:

make-param-P --> cfg/prj/project-name.prj --> build-system
                               ↑  ↑  ↑          ↓
   cfg/plt/platform-name.plt --+  |  |          +--> environment variables
   cfg/alph/alpha-config.alph ----+  |          +--> generate configuration h-file
   cfg/base.cfg ---------------------+          +--> build libraries
                                                +--> build kernel
                                                +--> build applications
                                                +--> build RAMFS with alpha config and ELFs
                                                +--> build bootloader with RAMFS image

2.2 Переменные среды сборки [наверх]


Во время сборки в сборочных скриптах (Makefiles) и в конфигурационных файлах доступны следующие переменные:

wrmdir директория с исходниками WrmOS
blddir сборочная директория, определённая в параметре сборки B=<build-dir-name>

2.3 Параметры конфигурации проекта [наверх]


Файл конфигурации проекта находится в директории cfg/prj/ и должен содержать следующие параметры:

Параметр Описание Пример
plt_file Путь к конфигурационному файлу целевой платформы. plt_file = $(wrmdir)/cfg/plt/x86-qemu-q35.plt
gccprefix Префикс для тулчейна GCC. gccprefix = i686-linux-
usr_lib_dbg Отладочные флаги для библиотек, ядра, приложений и загрузчика. Может быть 0 или 1. Позволяет использовать отладочную конфигурацию с assert'ами, дополнительной отладочной выдачей и т.д. (для значения 1) или использовать релизную конфигурацию (для занчения 0). usr_lib_dbg = 1
usr_krn_dbg usr_krn_dbg = 1
usr_app_dbg usr_app_dbg = 1
usr_ldr_dbg usr_ldr_dbg = 1
usr_krn_log Флаг включения логирования в ядре. Может быть 0 или 1. Флаг включает внутреннее логирование в ядре, это позволяет видеть активность и собятия ядра. usr_krn_log = 1
usr_ramfs

Список файлов для файловой системы (RAMFS). Эти файлы будут собраны и помещены в RAMFS. Каждый элемент списка имеет следующий формат:
<ramfs-file-name>:<host-file-path>
Перед двоеточием — имя файла в RAMFS, оно используется корневым приложением Alpha во время выполнения.
После двоеточия — путь к файлу в текущей файловой системе.
В базовом конфигурационном файле cfg/base.cfg к списку файлов добавляются ещё 3 обязательных файла — kernel.elf, sigma0.elf и roottask.elf.

usr_ramfs = config.alph:$(wrmdir)/cfg/alph/hello.alph
usr_ramfs += hello.elf:$(blddir)/app/hello/hello.elf

После определения всех параметров должен быть подключён базовый конфигурационный файл cfg/base.cfg:

include $(wrmdir)/cfg/base.cfg

2.4 Параметры конфигурации платформы [наверх]


Файл конфигурации платформы находится в директории cfg/plt/ и должен содержать следующие параметры:

параметр Описание Пример
Параметры системы
arch Архитектура целевого процессора. Определяет архитектуро-зависимые компоненты библиотек, ядра и приложений. arch = x86
arch_ver Версия архитектуры целевого процессора. Определяет зависимые от версии архитектуры компоненты библиотек, ядра и приложений. arch_ver = armv7-a
cpu Модель целевого процессора. Определяет процессоро-зависимые компоненты библиотек, ядра и приложений. cpu = q35
plat Имя целевой платформы. Определяет платформо-зависимые компоненты библиотек, ядра и приложений. plt = qemu
brd Имя целевой платы. Определяет плато-зависимые компоненты библиотек, ядра и приложений. brd = qemu_q35
max_cpus Максимальное возможно количество ядер процессора для данной платформы. max_cpus = 2
sys_clock_hz Частота системы в Герцах. sys_clock_hz = 1193182
ram_start Стартовый адрес RAM памяти. ram_start = 0x100000
# skip 1 MB for low-memory, needs for x86
ram_sz Размер RAM памяти в байтах. ram_sz = 0x800000
page_sz Размер страницы памяти в байтах. page_sz = 0x1000
Параметры ядра
krn_vaddr Стартовый адрес виртуального адресного пространства ядра. krn_vaddr = 0xf0100000
# skip 1 MB for low-memory, needs for x86
krn_tick_usec Тик ядра в микросекундах. Периодический таймер ядра будет генерировать прерывание каждые krn_tick_usec микросекунд. krn_tick_usec = 10000
krn_uart_paddr Физический адрес UART для ядра. Для архитектуры x86 этот параметр определяет адрес MMIO устройства (выравненная по размеру страницы часть параметра) и старовый номер IO порта (младшие 12 бит). krn_uart_paddr = (0xb8000 + 0x3f8)
# video_mem + ioport_COM1_addr
krn_uart_sz Размер UART для ядра в байтах. Для архитектуры x86 этот параметр определяет размер MMIO устройства в байтах (выравненная по границе 0x10 байт часть параметра) и размер IO-port региона (младшие 4 бита). krn_uart_sz = (0x1000 + 0x8)
# video_sz  + ioport_COM1_sz
krn_uart_bitrate Битовая скорость UART ядра. krn_uart_bitrate = 115200
krn_uart_irq Номер прерывания UART ядра. krn_uart_irq = 4
krn_intc_paddr Физический адрес контроллера прерываний. Для архитектуры x86 этот параметр не используется и должен иметь значение 0x1, чтобы не активировать маппинг для контроллера прерываний. krn_intc_paddr = 0x1
# lowest bit 1 — don't need kmap
krn_intc_sz Размер контроллера прерываний в байтах. Для архитектуры x86 этот параметр не используется и должен иметь значение 0. krn_intc_sz = 0x0
krn_timer_paddr Физический адрес таймера ядра. Для архитектуры x86 этот параметр не используется и должен иметь значение 0x1, чтобы не активировать маппинг для таймера ядра. krn_timer_paddr = 0x1
# lowest bit 1 — don't need kmap
krn_timer_sz Размер таймера ядра в байтах. Для архитектуры x86 этот параметр не используется и должен иметь значение 0. krn_timer_sz = 0x0
krn_timer_irq Номер прерывания таймеря ядра. krn_timer_irq = 0
Параметры загрузчика
ldr_uart_paddr Физический адрес UART для загрузчика. Для архитектуры x86 этот параметр определяет адрес MMIO устройства (выравненная по размеру страницы часть параметра) и старовый номер IO порта (младшие 12 бит). ldr_uart_paddr = (0xb8000 + 0x3f8)
# video_mem + ioport_COM1_addr
ldr_uart_bitrate Битовая скорость UART загрузчика. krn_uart_bitrate = 115200
Базовые устройства платформы
plt_uart Имя UART для описываемой платформы. Этот параметр определяет драйвер UART для ядра и загрузчика. plt_uart = x86_8250
plt_intc Имя контроллера прерываний для описываемой платформы. Этот параметр определяет драйвер ядра для контроллера прерываний. plt_intc = x86_8259
plt_timer Имя таймера для описываемой платформы. Этот параметр определяет драйвер ядра для таймера. plt_timer = x86_8253
plt_mmu Имя MMU для описываемой платформы. Этот параметр определяет драйвер ядра для MMU. plt_mmu = x86_mmu

2.5 Конфигурация корневого приложения Alpha [наверх]


Конфигурация времени выполнения корневого приложения Alpha имеет следующий вид:

# config for roottask
# mmio devices
DEVICES
        #name     paddr        size        irq
        uart      0x12345678   0x100       12

# named memory regions
MEMORY
        #name      sz      access  cached  contig
        uart_buf   0x1000  rw      0       1

# applications
APPLICATIONS
    {
        name:             hello
        short_name:       hell
        file_path:        ramfs:/hello.elf
        stack_size:       0x1000
        heap_size:        0x0
        aspaces_max:      1
        threads_max:      3
        prio_max:         100
        fpu:              off
        malloc_strategy:  on_startup
        devices:
        memory:
        args:             arg1=123, arg2=345
    }

Конфигурация времени выполнения корневого приложения Alpha содержит 3 секции:

  • таблица устройств
  • таблица именованной памяти
  • таблица приложений

Формат файла

Формат конфигурационного файла имеет следующие правила:

  • каждая строка, начинающиеся с символа '#' является комментарием и игнорируется;
  • каждая секция начинается с её имени — DEVICES, MEMORY или APPLICATIONS.

Таблица устройств

Таблица устройств имеет вид:

DEVICES
        #name     paddr        size        irq
        uart      0x12345678   0x100       12

Таблица устройств описывает используемые системные устройства. Таблица начинается с ключевого слова DEVICES. Каждая строка таблицы соответствует одному устройству. Таблица состоит из 4-ёх столбцов:

Столбец Имя поля Описание
1 name Имя MMIO устройства. Это имя будет использовано пользовательским приложением для доступа к этому устройству.
2 paddr Физический адрес MMIO устройства.
3 size Размер MMIO устройства в байтах.
4 irq Номер прерывания MMIO устройства. Значение '-1' означает, что прерывание для данного устройства не используется.

Таблица именованой памяти

Таблица именованной памяти имеет вид:

MEMORY
        #name      sz      access  cached  contig
        uart_buf   0x1000  rw      0       1

Таблица именованной памяти описывает именованные регионы памяти. Именованная память необходима, чтобы позволить пользовательским приложениям использовать память с требуемыми свойствами — размер, права доступа, кэшируемая или нет, непрерывная или нет. Таблица начинается с ключевого слова MEMORY. Каждая строка таблицы соответствует одному региону памяти. Таблица состоит из 5 столбцов:

Столбец Имя поля Описание
1 name Имя региона памяти. Это имя будет использоваться пользовательским приложением для доступа к этой памяти.
2 size Размер региона памяти в байтах.
3 access Права доступа к региону памяти. Допустимое значение может быть комбинацией символов — 'r', 'w' и 'x' (read, write и executable).
4 cached Флаг кэшируемости региона памяти. 0 — некэшируемая память, 1 — кэшируемая.
5 contiguous

Флаг физической непрерывности региона памяти. 0 — не непрерывная память, 1 — физически непрерывная память.

Таблица приложений

Таблица приложений имеет вид:

APPLICATIONS
    {
        name:             hello
        short_name:       hell
        file_path:        ramfs:/hello.elf
        stack_size:       0x1000
        heap_size:        0x0
        aspaces_max:      1
        threads_max:      3
        prio_max:         100
        fpu:              off
        malloc_strategy:  on_startup
        devices:
        memory:
        args:             arg1=123, arg2=345
    }

Таблица приложений описывает пользовательские приложения и их параметры. Она используется корневым приложением Alpha для запуска приложений во время старта системы. Описание каждого приложения начинается со строки с единственным символом'{' и заканчивается строкой с единственным символом '}'. Между этими строками находятся параметры приложения. Каждый параметр находится на отдельной строке. Параметры начинаются с имени параметра вида "parameter-name:", вслед за которым идёт значение параметра. Имеются следующие параметры:

Имя Обязательный Описание
name обязательный Имя приложения.
short_name обязательный Краткое имя приложения — 4 символа. Краткое имя используется в качестве префикса для вывода приложения.
file_path обязательный Путь к исполняемому файлу в файловой системе RAMFS. Путь имеет вид "ramfs:/filename.elf".
stack_size обязательный Размер стэка для главного (первого) трэда в приложении.
heap_size опциональный Размер памяти, которую корневое приложение передаст запускаемому приложению при его старте. Приложение может получить память посредством Memory Pool WrmOS API. По умолчанию значение параметра 0.
aspaces_max обязательный Максимальное количество адресных пространств, разрешённых для данного приложения. Значение должно быть >=1.
threads_max обязательный Максимальное количество трэдов, разрешённых для данного приложения. Значение должно быть >=1.
prio_max обязательный Максимальное значение приоритета для трэдов данного приложения из диапазона: 1 (наименьший) .. 255 (наибольший).
fpu опциональный Флаг включения FPU. 0 — приложение не использует FPU. 1 — приложение использует FPU. По умолчанию значение параметра 0.
malloc_strategy опциональный Стратегия аллоцировния памяти.
on_startup — аллоцировать всю память (data, code, bss) для приложения во время его запуска, это позволяет быть уверенным, что памяти достаточно;
on_pagefault — аллоцировать память (data, code, bss) для приложения постранично во время пэйджфолта, это позволяет не аллоцировать память, пока она действительно не потребуется.
Стратегия on_startup требует некоторого времени на аллоцирование памяти во время старта приложения, но убирает необходимость тратить на это время во время выполнения приложения.
devices опциональный Разделённый запятыми список имён устройств доступных для данного приложения. Имена должны соответствовать устройствам в Таблице Устройств (Device Table).
memory опциональный Разделённый запятыми список регионов именованной памяти доступных для данного приложения. Имена должны соответствовать регионам памяти в Таблице Именованной Памяти (Named Memory Table).
args опциональный Разделённые пробелами строки. Ини будут доступны пользовательскому приложению в качестве списка входящих аргументов функции main(argc, argv[]).

← 1. WrmOS: система сборки

3. WrmOS: загрузчик →