Специфікація BTRON3 (Український переклад) | Розділ 5: Ядро операційної системи (Kernel)
Повернутися до змісту цього розділу
Попередня сторінка: 1.4 Глобальні імена (Повернутися)
Наступна сторінка: 1.6 Файлова система та менеджер файлів (Перейти)

1.5 Управління оперативною пам'яттю (Memory Management)

1.5.1 Огляд підсистеми управління пам'яттю (Overview)

Оперативна пам'ять системи поділяється на 3 основні домени адресної пам'яті. Ядро BTRON надає функції виділення, звільнення та захисту блоків пам'яті у кожному з цих доменів:

1. Локальна пам'ять процесу (Local Memory Domain) :

Область пам'яті, доступна виключно одному конкретному процесу. Інші прикладні процеси не мають права доступу до локальної пам'яті процесу.
Усі блоки локальної пам'яті автоматично звільняються ядром при завершенні процесу.

2. Спільна пам'ять (Shared Memory Domain) :

Загальносистемна область пам'яті, доступна для зчитування та запису з усіх процесів операційної системи.
Виділені блоки спільної пам'яті існують незалежно від роботи процесу, що їх виділив, проте при виділенні можна вказати прапорець DELEXIT для їхнього автоматичного видалення при завершенні процесу-создателя.

3. Системна пам'ять (System Memory Domain) :

Область пам'яті ядра, доступна виключно для системних модулів ОС, ядра та драйверів пристроїв. Прикладним програмам доступ до системної пам'яті суворо заборонено.
Системні блоки пам'яті існують незалежно від процесів.

На базовому рівні ядро операційної системи виділяє пам'ять великими фіксованими блоками (наприклад, сторінками по 4 КБ). Подальше дрібне розбиття блоків на динамічні об'єкти довільного розміру здійснюється функціями C-бібліотеки кучі (Heap Management API) або безпосередньо прикладною програмою. Прикладні додатки зазвичай використовують стандартні C-функції виділення кучі, а низькорівневі системні виклики ядра застосовуються лише при особливих вимогах до пам'яті.

Виділений блок пам'яті займає неперервний діапазон віртуальних адрес, а вказівник на його початкову адресу повертається викликаючому процесу. Адреса виділеного блоку не змінюється протягом усього часу його існування. За допомогою системного виклику chg_mbk() додатки можуть керувати правами читання, запису та виконання коду в блоці пам'яті.

На архітектурах CPU із блоком управління пам'яттю (MMU) спільна та системна пам'ять зазвичай розташовуються у від'ємній області віртуального адресного простору, а локальна пам'ять процесів — у додатній. На системних платформах без MMU доступ регламентується програмно.

Операції виділення пам'яті не включають внутрішнього міжпроцесного виключення для вмісту буфера. При одночасному доступі кількох процесів до спільної пам'яті додатки повинні самостійно використовувати семафори ядра.

1.5.2 Визначення типів даних та констант (Data Types & Constants)

□ Атрибути виділення та доменів пам'яті

#define M_LOCAL         0x00000000      /* Виділення у локальному домені процесу */
#define M_COMMON        0x00000001      /* Виділення у домені спільної пам'яті (Shared Memory) */
#define M_SYSTEM        0x00000003      /* Виділення у домені системної пам'яті ядра (Kernel Memory) */
#define M_RESIDENT      0x00004000      /* Постійна фіксована пам'ять (не вивантажувати в swap) */
#define DELEXIT         0x00008000      /* Автоматичне звільнення блоку при завершенні процесу */

□ Атрибути прав доступу та захисту пам'яті (Memory Protection Flags)

#define M_READ          0x00010000      /* Дозвіл на читання даних з блоку пам'яті */
#define M_WRITE         0x00020000      /* Дозвіл на запис даних у блок пам'яті */
#define M_EXEC          0x00040000      /* Дозвіл на виконання коду з блоку пам'яті (NX-protection) */

□ Структура стану оперативної пам'яті (M_STATE)

typedef struct m_state {
    W       blksz;          /* Розмір базового блоку сторінки у байтах (наприклад, 4096) */
    W       total;          /* Загальна кількість блоків у системному домені */
    W       free;           /* Кількість вільних блоків у даний момент */
} M_STATE;

1.5.3 Низькорівневі системні виклики ядра (Low-Level System Calls)

get_mbk
Get Memory Block
Виділення блоку віртуальної пам'яті (Get Memory Block)

【Синтаксис / Прототип】

ERR get_mbk(VP *adr, W nblk, UW atr)

【Параметри】

VP  *adr    Змінна у віртуальній пам'яті для збереження початкової адреси виділеного блоку
W   nblk    Кількість виділюваних блоків (nblk > 0)
UW  atr     Атрибути пам'яті: [M_LOCAL|M_COMMON|M_SYSTEM] | [M_READ|M_WRITE|M_EXEC] | [M_RESIDENT] | [DELEXIT]

【Значення, що повертається】

= 0      Успішне виконання (початкову адресу записано у *adr)
< 0      Помилка (Код помилки)

【Детальний опис】

Виділяє неперервний блок віртуальної оперативної пам'яті розміром nblk блоків із вказаними атрибутами домену, прав доступу та резидентності atr.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника adr у віртуальній пам'яті.
ER_NOSPC   : Недостатньо вільного обсягу оперативної пам'яті у системі.
ER_PAR     : Неприпустиме значення кількості блоків nblk або атрибутів atr.
rel_mbk
Release Memory Block
Звільнення блоку пам'яті (Release Memory Block)

【Синтаксис / Прототип】

ERR rel_mbk(VP adr)

【Параметри】

VP  adr     Початкова віртуальна адреса виділеного раніше блоку пам'яті

【Значення, що повертається】

= 0      Успішне виконання (E_OK)
< 0      Помилка (Код помилки)

【Детальний опис】

Звільняє виділений раніше викликом get_mbk() блок оперативної пам'яті за його початковою адресою adr та повертає його у пул вільних блоків ядра.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника adr у пам'яті або блок не належить процесу.
chg_mbk
Change Memory Block Protection
Зміна прав доступу та захисту блоку пам'яті (Change Protection)

【Синтаксис / Прототип】

ERR chg_mbk(VP adr, UW atr)

【Параметри】

VP  adr     Початкова адреса виділеного блоку пам'яті
UW  atr     Нові маски прав доступу (M_READ | M_WRITE | M_EXEC | M_RESIDENT)

【Значення, що повертається】

= 0      Успішна зміна атрибутів доступу (E_OK)
< 0      Помилка (Код помилки)

【Детальний опис】

Змінює атрибути захисту MMU та рівні прав читання/запису/виконання коду для виділеного блоку пам'яті adr.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника adr у віртуальній пам'яті.
ER_PAR     : Некоректна маска атрибутів доступу atr.
mbk_sts
Memory Block Status
Отримання стану та статистики пам'яті (Memory Block Status)

【Синтаксис / Прототип】

ERR mbk_sts(M_STATE *pk_mstate, UW atr)

【Параметри】

M_STATE *pk_mstate Буфер для збереження статистики стану пам'яті
UW       atr       Домен пам'яті для запиту (M_LOCAL, M_COMMON або M_SYSTEM)

【Значення, що повертається】

= 0      Успішне виконання (E_OK)
< 0      Помилка (Код помилки)

【Детальний опис】

Зчитує поточний стан, розмір базової сторінки та кількість вільних/загальних блоків пам'яті у вказаному домені atr та записує їх у структуру pk_mstate.

【Коди помилок】

ER_ADR     : Неприпустима адреса вказівника pk_mstate у віртуальній пам'яті.
ER_PAR     : Неприпустиме значення домену пам'яті atr.

1.5.4 Функції бібліотеки C (C Library Heap API)

Функції C-бібліотеки забезпечують виділення та звільнення динамічних буферів довільного розміру у байтах. Для кожного домену пам'яті надаються окремі сімейства функцій:

malloc / calloc / realloc / free
Local Process Memory Heap API
Управління тимчасовою кучею локальної пам'яті процесу

【Синтаксис / Прототип】

VP  malloc(W size)
VP  calloc(W nelem, W elsize)
VP  realloc(VP ptr, W size)
VOID free(VP ptr)

【Детальний опис】

Виділяють, змінюють розмір та звільняють динамічні буфери даних у кучі локальної пам'яті процесу. При завершенні процесу вся виділена локальна пам'ять автоматично звільняється ядром.

Smalloc / Scalloc / Srealloc / Sfree
Shared Memory Heap API
Управління кучею спільної пам'яті (Shared Memory Heap API)

【Синтаксис / Прототип】

VP  Smalloc(W size)
VP  Scalloc(W nelem, W elsize)
VP  Srealloc(VP ptr, W size)
VOID Sfree(VP ptr)

【Детальний опис】

Виділяють та звільняють буфери даних у загальносистемній кучі спільної пам'яті (Shared Memory), доступній для обміну даними між кількома процесами.

Kmalloc / Kcalloc / Krealloc / Kfree
Kernel Resident Heap API
Управління кучею постійної системної пам'яті ядра (Kernel Resident Heap API)

【Синтаксис / Прототип】

VP  Kmalloc(W size)
VP  Kcalloc(W nelem, W elsize)
VP  Krealloc(VP ptr, W size)
VOID Kfree(VP ptr)

【Детальний опис】

Виділяють та звільняють буфери даних у постійній кучі системної пам'яті ядра (Kernel Memory), яка не підлягає ротації у swap-файл.

Vmalloc / Vcalloc / Vrealloc / Vfree
Kernel Temporary Heap API
Управління кучею тимчасової системної пам'яті ядра (Kernel Temporary Heap API)

【Синтаксис / Прототип】

VP  Vmalloc(W size)
VP  Vcalloc(W nelem, W elsize)
VP  Vrealloc(VP ptr, W size)
VOID Vfree(VP ptr)

【Детальний опис】

Виділяють та звільняють буфери у кучі тимчасової системної пам'яті ядра.


Повернутися до змісту цього розділу
Попередня сторінка: 1.4 Глобальні імена (Повернутися)
Наступна сторінка: 1.6 Файлова система та менеджер файлів (Перейти)