Содержание 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. Каждый элемент списка имеет следующий формат: |
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[]). |