Оперативна пам'ять системи поділяється на 3 основні домени адресної пам'яті. Ядро BTRON надає функції виділення, звільнення та захисту блоків пам'яті у кожному з цих доменів:
Область пам'яті, доступна виключно одному конкретному процесу. Інші прикладні процеси не мають права доступу до локальної пам'яті процесу.
Усі блоки локальної пам'яті автоматично звільняються ядром при завершенні процесу.
Загальносистемна область пам'яті, доступна для зчитування та запису з усіх процесів операційної системи.
Виділені блоки спільної пам'яті існують незалежно від роботи процесу, що їх виділив, проте при виділенні можна вказати прапорець DELEXIT для їхнього автоматичного видалення при завершенні процесу-создателя.
Область пам'яті ядра, доступна виключно для системних модулів ОС, ядра та драйверів пристроїв. Прикладним програмам доступ до системної пам'яті суворо заборонено.
Системні блоки пам'яті існують незалежно від процесів.
На базовому рівні ядро операційної системи виділяє пам'ять великими фіксованими блоками (наприклад, сторінками по 4 КБ). Подальше дрібне розбиття блоків на динамічні об'єкти довільного розміру здійснюється функціями C-бібліотеки кучі (Heap Management API) або безпосередньо прикладною програмою. Прикладні додатки зазвичай використовують стандартні C-функції виділення кучі, а низькорівневі системні виклики ядра застосовуються лише при особливих вимогах до пам'яті.
Виділений блок пам'яті займає неперервний діапазон віртуальних адрес, а вказівник на його початкову адресу повертається викликаючому процесу. Адреса виділеного блоку не змінюється протягом усього часу його існування. За допомогою системного виклику chg_mbk() додатки можуть керувати правами читання, запису та виконання коду в блоці пам'яті.
На архітектурах CPU із блоком управління пам'яттю (MMU) спільна та системна пам'ять зазвичай розташовуються у від'ємній області віртуального адресного простору, а локальна пам'ять процесів — у додатній. На системних платформах без MMU доступ регламентується програмно.
Операції виділення пам'яті не включають внутрішнього міжпроцесного виключення для вмісту буфера. При одночасному доступі кількох процесів до спільної пам'яті додатки повинні самостійно використовувати семафори ядра.
#define M_LOCAL 0x00000000 /* Виділення у локальному домені процесу */ #define M_COMMON 0x00000001 /* Виділення у домені спільної пам'яті (Shared Memory) */ #define M_SYSTEM 0x00000003 /* Виділення у домені системної пам'яті ядра (Kernel Memory) */ #define M_RESIDENT 0x00004000 /* Постійна фіксована пам'ять (не вивантажувати в swap) */ #define DELEXIT 0x00008000 /* Автоматичне звільнення блоку при завершенні процесу */
#define M_READ 0x00010000 /* Дозвіл на читання даних з блоку пам'яті */ #define M_WRITE 0x00020000 /* Дозвіл на запис даних у блок пам'яті */ #define M_EXEC 0x00040000 /* Дозвіл на виконання коду з блоку пам'яті (NX-protection) */
typedef struct m_state {
W blksz; /* Розмір базового блоку сторінки у байтах (наприклад, 4096) */
W total; /* Загальна кількість блоків у системному домені */
W free; /* Кількість вільних блоків у даний момент */
} M_STATE;
|
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.
|
ERR rel_mbk(VP adr)
VP adr Початкова віртуальна адреса виділеного раніше блоку пам'яті
= 0 Успішне виконання (E_OK) < 0 Помилка (Код помилки)
Звільняє виділений раніше викликом get_mbk() блок оперативної пам'яті за його початковою адресою adr та повертає його у пул вільних блоків ядра.
ER_ADR : Неприпустима адреса вказівника adr у пам'яті або блок не належить процесу.
|
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.
|
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.
Функції C-бібліотеки забезпечують виділення та звільнення динамічних буферів довільного розміру у байтах. Для кожного домену пам'яті надаються окремі сімейства функцій:
|
VP malloc(W size) VP calloc(W nelem, W elsize) VP realloc(VP ptr, W size) VOID free(VP ptr)
Виділяють, змінюють розмір та звільняють динамічні буфери даних у кучі локальної пам'яті процесу. При завершенні процесу вся виділена локальна пам'ять автоматично звільняється ядром.
|
VP Smalloc(W size) VP Scalloc(W nelem, W elsize) VP Srealloc(VP ptr, W size) VOID Sfree(VP ptr)
Виділяють та звільняють буфери даних у загальносистемній кучі спільної пам'яті (Shared Memory), доступній для обміну даними між кількома процесами.
|
VP Kmalloc(W size) VP Kcalloc(W nelem, W elsize) VP Krealloc(VP ptr, W size) VOID Kfree(VP ptr)
Виділяють та звільняють буфери даних у постійній кучі системної пам'яті ядра (Kernel Memory), яка не підлягає ротації у swap-файл.
|
VP Vmalloc(W size) VP Vcalloc(W nelem, W elsize) VP Vrealloc(VP ptr, W size) VOID Vfree(VP ptr)
Виділяють та звільняють буфери у кучі тимчасової системної пам'яті ядра.