Системная страница
#include <sys/syspage.h>
struct syspage_entry {
uint16_t size;
uint16_t total_size;
uint16_t type;
uint16_t num_cpu;
syspage_entry_info system_private;
syspage_entry_info asinfo;
syspage_entry_info meminfo;
syspage_entry_info hwinfo;
syspage_entry_info cpuinfo;
syspage_entry_info cacheattr;
syspage_entry_info qtime;
syspage_entry_info callout;
syspage_entry_info callin;
syspage_entry_info typed_strings;
syspage_entry_info strings;
syspage_entry_info intrinfo;
syspage_entry_info smp;
syspage_entry_info pminfo;
syspage_entry_info mdriver;
union {
struct x86_syspage_entry x86;
struct ppc_syspage_entry ppc;
struct mips_syspage_entry mips;
struct arm_syspage_entry arm;
struct e2k_syspage_entry e2k;
struct sparc_syspage_entry sparc;
struct aarch64_syspage_entry aarch64;
} un;
};
Структура содержит информацию о системной странице и включает следующие поля:
- size
- Размер экземпляра системной страницы. Библиотека автоматически задает это поле.
- total_size
- Сумма размеров экземпляра системной страницы и подструктур, на которые он ссылается (фактически — размер всей базы данных системной страницы). Библиотека автоматически задает и увеличивает это поле для других библиотечных вызовов по мере необходимости.
- type
- В этом поле указывается семейство процессоров, которое определяет, какой элемент объединения un следует использовать. Поле может иметь одно из следующих значений:
- SYSPAGE_X86
- SYSPAGE_PPC
- SYSPAGE_MIPS
- SYSPAGE_SPARE
- SYSPAGE_ARM
- SYSPAGE_SPARC
- 32-х разрядные архитектуры.
- SYSPAGE_X86_64
- SYSPAGE_E2K
- SYSPAGE_AARCH64
- 64-х разрядные архитектуры.
- SYSPAGE_64BIT = 0x100
- Специальный флаг, характеризующий принадлежность процессорной архитектуры к классу 64-х разрядных.
Библиотека задает его автоматически. - num_cpu
- В поле указывается количество процессоров (процессорных ядер) в системе. По умолчанию библиотека задает его равным
1
, а функция init_smp() изменяет его при обнаружении других процессоров. - system_private
- Область system_private содержит информацию, которая необходима операционной системе на этапе загрузки, и заполняется функцией init_system_private() библиотеки запуска. Поле определяется структурой struct system_private_entry и включает следующие основные поля:
- user_cpupageptr
- Адрес в пользовательском пространстве (только чтение) для указателя cpupage
- user_syspageptr
- Адрес в пользовательском пространстве (только чтение) для указателя syspage
- kern_cpupageptr
- Адрес в пространстве ядра (чтение/запись) для указателя cpupage
- kern_syspageptr
- Адрес в пространстве ядра (чтение/запись) для указателя syspage
- pagesize
- Размер страницы памяти, которую выделяет ОС (как правило, 16 в физическом режиме и 4096 — в виртуальном).
- asinfo
- Поле характеризуется массивом структур, каждая из которых описывает атрибуты конкретной области адресного пространства системы. Подробнее см. в описании struct asinfo_entry.
Деревья адресных пространств
Раздел asinfo содержит деревья адресных пространств, которые определяют местоположение различных компонентов системы (ОЗУ, ПЗУ, флеш-памяти и др.). Как правило, иерархия адресных пространств имеет следующий вид:
/memory/класс_памяти/....
/io/класс_памяти/....
/memory/io/класс_памяти/....
Компоненты memory и io определяют тип адресного пространства — памяти или ввода/вывода (последняя форма применяется в системах, где отсутствуют инструкции in*() / out() и все устройства отображены в память). Поле класс_памяти содержит значения ram, rom, flash и др. На более низких уровнях вводится дополнительная классификация, с помощью которой менеджер процессов реализует поддержку типизированной памяти. - meminfo
- Устаревшее поле, необходимо ориентироваться на asinfo.
- hwinfo
- Раздел hwinfo характеризуется сведениями об аппаратной платформе (тип шины, устройства, линии запроса прерываний и др.). Эта область заполняется функцией init_system_private() системной библиотеки libstartup и является одним из самых сложных компонентов системной страницы. Раздел hwinfo представляет собой не одну структуру или массив определенного типа, а последовательность структур, которые отмечены символьными тегами и в совокупности описывают компоненты аппаратной платформы встраиваемой системы. Все типы и константы определены в заголовочном файле
<hw/sysinfo.h>
. Подробнее см. в разделе HW-теги и сведения об аппаратной платформе и описании типа struct hwinfo_entry. - cpuinfo
- Область cpuinfo содержит информацию о каждой микросхеме процессора (тип, скорость, функции, производительность и размер кеша ЦП). Количество элементов в структуре struct cpuinfo_entry равно значению num_cpu структуры struct syspage_entry (например, в двухпроцессорной системе существуют две записи struct cpuinfo_entry).
Эта таблица автоматически заполняется библиотечной функцией init_cpuinfo().
Подробнее см. в разделе Информация о процессорах и описании типа struct cpuinfo_entry. - cacheattr
- Области cacheattr содержит информацию о конфигурации внутрисхемной и внесхемной кеш-памяти, а также callout control(), который используется для управления кеш-памятью. Запись cacheattr формируется функциями init_cpuinfo() и init_cacheattr().
Следует иметь в виду, что функция init_cpuinfo() работает с кеш-памятью самого процессора, а функция init_cacheattr() — с кеш-памятью платы.
Суммарное количество байт, описываемых записью cacheattr, равно line_size × num_lines.
Подробнее см. в разделе Информация о процессорах и описании типа struct cacheattr_entry. - qtime
- Область qtime содержит отсчетное время системы и другую информацию, связанную с хронометражем. Соответствующие структуры данных заполняются библиотечной функцией init_qtime().
Если время в системных часах смещается, следует задавать корректную частоту часов в коде запуска. Можно использовать в параметр -f модуля startup-*, который переопределяет эту настройку в коде.
Подробнее см. в описании типа struct qtime_entry. - callout
- В области callout определяются различные callout-ы, которые "подключаются" к ядру и принимают управление при возникновении определенного события. Эти callout-ы выполняются примерно в той же среде, что и обработчики прерываний — с ограниченным стеком и без возможности вызывать функции ядра. Для стандартных аппаратных платформ (таких как отладочные платы MIPS и PowerPC, x86-совместимые платы) нет необходимости разрабатывать модуль startup-* — штатные модули обладают всеми требуемыми функциями.
Подробнее см. Сведения о callout-ах, Написание собственных callout-ов ядра и описание типа struct callout_entry. - callin
- Для внутреннего применения.
- typed_strings
- Область typed_strings состоит из нескольких записей, каждая из которых содержит число и строку. Число занимает 4 байта, а строка завершается нулевым символом в соответствии со стандартом C. Число равно одной из констант, которые указаны в системном заголовочном файле
<confname.h>
(дополнительную информацию см. в описании C-функции confstr()).
Как правило, пул типизированных строковых литералов заполняется библиотечными функциями init_*(), а не разработчиком. Тем не менее, для добавления типизированной строки можно пользоваться библиотечной функцией add_typed_string(). - strings
- Этот элемент является пулом литералов, которые используются в нетипизированных строках. Пользователи обычно получают доступ к этим строкам, указывая индекс в поле strings (например, поле name структуры cpuinfo).
Как правило, пул типизированных строковых литералов заполняется библиотечными функциями init_*(), а не разработчиком. Тем не менее, для добавления типизированной строки можно использовать библиотечную функцию add_string(). - intrinfo
- Область intrinfo используется для хранения информации о системе обработки прерываний, а также содержит callout-ы, которые управляют аппаратным контроллером прерываний.
Подробнее см. Информация о векторах прерываний и описание типа struct intrinfo_entry. - smp
- Область smp не зависит от процессора и характеризуется типом struct smp_entry.
- pminfo
- Область pminfo используется для взаимодействия между менеджером питания и callout-ом запуска / управления питанием. Ее элементы задаются менеджером питания и их можно модифицировать в его структуре struct pminfo_entry.
- mdriver
- Область mdriver используется для взаимодействия с минидрайвером.
Подробнее см. Быстрая активация устройств и описание типа struct mdriver_entry. - un
- В объединении un хранится информация системной страницы, которая относится к конкретной процессорной архитектуре. Цель этого объединения — обеспечивать доступ к информации о различных семействах процессоров в зависимости от поля type системной страницы.
ЗОСРВ «Нейтрино»
_syspage_ptr, struct aarch64_syspage_entry, struct asinfo_entry, struct arm_syspage_entry, struct cacheattr_entry, struct callout_entry, struct cpuinfo_entry, struct e2k_syspage_entry, struct hwi_prefix, struct hwinfo_entry, struct intrinfo_entry, struct mdriver_entry, struct mips_syspage_entry, struct pminfo_entry, struct ppc_syspage_entry, struct qtime_entry, struct smp_entry, struct sparc_syspage_entry, struct system_private_entry, struct x86_syspage_entry, SYSPAGE_ENTRY(), SYSPAGE_CPU_ENTRY()
Руководство по разработке модуля startup
Предыдущий раздел: Описание API системной библиотеки