Підсистема управління файлами визначає логічну структуру файлової системи на фізичних носіях інформації (дискетах FD, жорстких дисках HD, флеш-носіях) та надає повний набір системних викликів ядра для роботи з файлами, записами та посиланнями.
Фізичні та низькорівневі структури даних файлової системи залежать від реалізації ядра, проте для змінних носіїв (таких як дискети чи картки пам'яті) деталі фізичної структури чітко регламентуються специфікацією для забезпечення сумісності між різними пристроями та системами.
Файлова система BTRON побудована на основі Реально-Віртуальної об'єктної моделі (Real/Virtual Object Model) і має наступні фундаментальні особливості:
Файли можуть використовуватися кількома користувачами у різний час або одночасно у мережевому середовищі. З цієї причини підсистема файлового менеджера надає деталізований контроль прав доступу та високий рівень захисту даних.
Файл (Реальний об'єкт) є контейнером для збереження даних або самими збереженими даними. Один файл складається із послідовності впорядкованих записів змінної довжини.
Посилання (Віртуальний об'єкт) є вказівником для доступу до файлу. Посилання об'єднує дані, що вказують на цільовий файл, та атрибути візуального відображення посилання.
Посилання зберігається у вигляді окремого запису всередині будь-якого файлу. На один і той самий файл може вказувати довільна кількість посилань, завдяки чому формується довільна мережева структура зв'язків між файлами.
У контексті Реально-Віртуальної об'єктної моделі файл точно відповідає Реальному об'єкту, а посилання — Віртуальному об'єкту. Віртуальний об'єкт слугує графічним представленням посилання на екрані користувача.
Оскільки доступ до файлів здійснюється безпосередньо через посилання, ім'я файлу не має абсолютного значення у системі і слугує лише текстовим ключем для пошуку. Файлу можна призначити будь-яке ім'я довжиною до 20 символів TRON Code, причому у системі дозволене існування кількох файлів із однаковими іменами.

Файлова система (Том) являє собою єдину фізичну одиницю управління файлами, яка створюється на конкретному носії інформації та має фізично обмежений розмір:
Кожна файлова система обов'язково містить один Кореневий файл (Root File). Переходячи за посиланнями, що містяться у кореневому файлі, можна дістатися до будь-якого файлу даного тома. У Реально-Віртуальній моделі кореневий файл відповідає Пристроєвому об'єкту (Device VObject).
Зв'язки між файлами за допомогою посилань зазвичай визначаються в межах однієї файлової системи. Проте для посилання на файли, що розташовані на інших томах, використовується спеціальний механізм Опосередкованих посилань (Indirect Links). При використанні опосередкованих посилань цілісність зв'язку при змінах на іншому томі не гарантується, тому наявність цільового файлу потребує додаткової перевірки.
При формуванні файлової системи їй призначаються Назва файлової системи та Назва фізичного пристрою.
При старті операційної системи файлові системи не підключені за замовчуванням. Для початку роботи з носієм необхідно виконати операцію підключення тома (Mount).
Підключення здійснюється шляхом вказівки логічного імені пристрою та імені підключення (Mount Name). Назва підключення є ідентифікатором тома довжиною до 8 символів і використовується як абсолютний шлях до кореневого файлу тома.


У системі BTRON3 виділяють 2 основні типи файлів (коли вживається термін «файл», за замовчуванням мається на увазі Ззвичайний файл):
Фізичні пристрої (дискети FD, жорсткі диски HD, принтери, роз'єми послідовного зв'язку) не репрезентуються як звичайні файли в каталозі, а керуються як незалежні системні пристрої за допомогою Менеджера пристроїв (Device Manager) та унікальних системних імен.
Ззвичайний файл складається із послідовності впорядкованих записів змінної довжини — Потоку записів (Record Stream). Кожен окремий запис містить 4 обов'язкові елементи:
Типи записів (Record Types 0 – 31):
Зберігає посилання на інший файл (структура LINK розміром 52 байти). Вміст цього запису обробляється безпосередньо файловим менеджером ядра, а прямі прикладні модифікації обмежені.
Записи користувацьких та прикладних даних. Файловий менеджер ядра розглядає вміст цих записів як довільний потік байтів без аналізу їхнього внутрішнього формату.
Розмір тіла запису вказує на кількість байтів у тілі запису. Для Записів посилань (Тип 0) розмір буфера введення/виведення відповідає розміру структури LINK (52 байти), проте цей розмір не зараховується до загального обсягу користувацьких даних файлу (f_size).
Записи у файлі нумеруються послідовними цілими числами починаючи з 0 (Перший запис має номер 0). Номер запису відповідає його порядковому місцю у файлі і динамічно змінюється при вставці або видаленні записів.
Після останнього запису файлу віртуально існує Кінцевий запис (End Record). Якщо файл містить N записів, Кінцевий запис має номер N.
Для кожного відкритого файлу ядро підтримує покажчик Поточного запису (Current Record Pointer), на який спрямовуються операції читання та запису. Покажчик можна переміщувати за номером запису чи за допомогою пошуку запису відповідного типу.

Файл посилання створюється для опосередкованого адресування файлів на сторонніх томах. Він не містить прикладних даних користувача, а зберігає лише системні метадані посилання:
f_id)
f_atype)
f_name)
rf_ctime)
fs_name)
fs_locat)
Система доступу регламентує права процесів на читання, запис та виконання файлів. Авторизація здійснюється шляхом порівняння параметрів користувача процесу з матрицею прав доступу, збереженою у метаданих файлу.
Контекст користувача процесу містить наступні поля:
Метадані кожного файлу містять наступні налаштування доступу:
R -- Дозвіл на читання даних файлу (Read)
W -- Дозвіл на запис та зміну файлу (Write)
E -- Дозвіл на виконання файлу або пошук посилань у ньому (Execute/Search)
Прикладний процес взаємодіє з файлом шляхом його відкриття системним викликом opn_fil(), який повертає дескриптор відкритого файлу. Операції читання/запису даних виконуються відносно Поточного запису (Current Record Pointer).
Метадані файлу зчитуються викликом fil_sts() у структуру F_STATE та включають атрибути доступу, розміри, часові мітки та кількість посилань.
#define L_FSNM 20 /* Довжина назви файлової системи (тома) */ #define L_DLNM 20 /* Довжина назви фізичного пристрою */ #define L_DEVNM 8 /* Довжина назви логічного пристрою */ #define L_CONNM 8 /* Довжина назви підключення (Mount Name) */ #define L_USRNM (12+2) /* Ім'я користувача (12) + Приховане ім'я (2) */ #define L_FNM 20 /* Довжина імені файлу */ #define L_PATHNM 256 /* Максимальна довжина шляху файлу */
#define N_GRP 4 /* Максимальна кількість груп користувача */
#define TC_FDLM 0xff21 /* '/' Роздільник елементів шляху */ #define TC_FSEP 0xff22 /* ':' Роздільник списку шляхів */ #define TC_FOWN 0xff23 /* '≡' Поточний робочий файл */
#define F_NORM 0x0000 /* Звичайне розпізнавання шляху */ #define F_BASED 0x0001 /* Відносно базового файлу lnk */ #define F_DIRECT 0x0002 /* Пряме отримання посилання на реальний файл */
#define F_READ 0x0004 /* Відкриття лише для читання (Read-only) */ #define F_WRITE 0x0002 /* Відкриття лише для запису (Write-only) */ #define F_UPDATE 0x0006 /* Відкриття для читання та запису (Update) */ #define F_EXCL 0x0100 /* Монопольний режим для всього файлу */ #define F_WEXCL 0x0200 /* Монопольний режим лише для запису */
#define F_FLOAT 0x0000 /* Створення плаваючого посилання */ #define F_FIX 0x0001 /* Створення фіксованого посилання */ #define F_FILEID 0x0002 /* Створення з вказаним ID файлу */
#define F_FWD 0x0000 /* Пошук вперед від початку */ #define F_NFWD 0x0001 /* Пошук вперед від наступного запису */ #define F_BWD 0x0002 /* Пошук назад від кінця */ #define F_NBWD 0x0003 /* Пошук назад від попереднього запису */ #define F_TOPEND 0x0004 /* Пошук від початку до кінця */ #define F_ENDTOP 0x0005 /* Пошук від кінця до початку */ #define F_SFILE 0x4000 /* Збіг ідентифікатора файлу */ #define F_SNAME 0x2000 /* Збіг імені файлу */ #define F_SATR1 0x1000 /* Збіг атрибута 1 */ #define F_SATR2 0x0800 /* Збіг атрибута 2 */ #define F_SATR3 0x0400 /* Збіг атрибута 3 */ #define F_SATR4 0x0200 /* Збіг атрибута 4 */ #define F_SATR5 0x0100 /* Збіг атрибута 5 */
#define F_UNLOCK 0x0000 /* Розблокування запису */ #define F_LOCK 0x0001 /* Блокування запису */ #define F_TSLOCK 0x0002 /* Тестове блокування */ #define F_CKLOCK 0x0003 /* Перевірка стану блокування */
#define F_READ 0x0004 /* Дозвіл читання (R) */ #define F_WRITE 0x0002 /* Дозвіл запису (W) */ #define F_EXCUTE 0x0001 /* Дозвіл виконання (E) */ #define F_COMMON 0x0100 /* Відображення у спільну пам'ять */ #define F_SYSTEM 0x0300 /* Відображення у системну пам'ять */
#define F_READ 0x0004 /* Перевірка права читання (R) */ #define F_WRITE 0x0002 /* Перевірка права запису (W) */ #define F_EXCUTE 0x0001 /* Перевірка права виконання (E) */ #define F_EXIST 0x0000 /* Перевірка існування файлу */ #define F_PASWD 0x0008 /* Перевірка наявності пароля */
#define F_SETRONLY 0x0001 /* Установити атрибут захисту від запису */ #define F_RSTRONLY 0x0002 /* Скинути атрибут захисту від запису */ #define F_SETPERM 0x0003 /* Установити атрибут захисту від видалення */ #define F_RSTPERM 0x0004 /* Скинути атрибут захисту від видалення */ #define F_SETA1 0x0005 /* Установити прикладний атрибут 1 */ #define F_RSTA1 0x0006 /* Скинути прикладний атрибут 1 */ #define F_SETA2 0x0007 /* Установити прикладний атрибут 2 */ #define F_RSTA2 0x0008 /* Скинути прикладний атрибут 2 */
#define FS_SYNC 0x0000 /* Синхронний режим приєднання */ #define FS_ASYN 0x0002 /* Асинхронний режим приєднання */ #define FS_RONLY 0x0001 /* Приєднання лише для читання */
#define F_GETDEV (-1) /* Отримати назву пристрою */ #define F_GETNAM (-2) /* Отримати назву підключення */
#define F_SYNC 0 /* Посилання повністю синхронізоване */ #define F_DNAME 1 /* Відмінність в імені файлу */ #define F_DDATE 2 /* Відмінність у даті створення */ #define F_DBOTH 3 /* Відмінність в імені та даті */
typedef struct {
TC fs_name[L_FSNM]; /* Назва файлової системи (тома) */
UH f_id; /* Ідентифікатор файлу ID */
UH atr1; /* Прикладний атрибут 1 */
UH atr2; /* Прикладний атрибут 2 */
UH atr3; /* Прикладний атрибут 3 */
UH atr4; /* Прикладний атрибут 4 */
UH atr5; /* Прикладний атрибут 5 */
} LINK;
typedef struct {
UH f_ownacc; /* Матриця доступу власника RWE */
UH f_grpacc; /* Рівень доступу групи */
UH f_pubacc; /* Загальний рівень доступу */
H f_grpno; /* Номер групи власника (1..4) */
} A_MODE;
typedef struct {
UH f_ownacc; /* Матриця доступу власника RWE */
UH f_grpacc; /* Рівень доступу групи */
UH f_pubacc; /* Загальний рівень доступу */
H f_grpno; /* Номер групи власника (1..4) */
UH f_gacc[N_GRP]; /* Рівні доступу для кожної з 4 груп */
} DA_MODE;
typedef struct {
STIME f_ltime; /* Термін зберігання файлу */
STIME f_atime; /* Час останнього доступу */
STIME f_mtime; /* Час останньої модифікації */
} F_TIME;
typedef struct {
UH f_type; /* Тип файлу та права власника RWE */
UH f_atype; /* Прикладний тип додатка */
TC f_owner[L_USRNM]; /* Ім'я власника файлу */
TC f_group[L_USRNM]; /* Назва групи власника */
UH f_grpacc; /* Рівень доступу групи */
UH f_pubacc; /* Загальний рівень доступу */
H f_nlink; /* Кількість посилань на файл */
H f_index; /* Рівень індексації */
W f_size; /* Загальний розмір файлу у байтах */
W f_nblk; /* Кількість використовуваних блоків */
W f_nrec; /* Загальна кількість записів */
STIME f_ltime; /* Термін зберігання файлу */
STIME f_atime; /* Час останнього доступу */
STIME f_mtime; /* Час останньої модифікації */
STIME f_ctime; /* Час створення файлу */
} F_STATE;
#define F_FILE 0x1000 /* Звичайний файл */ #define F_APLATR1 0x0040 /* Прикладний атрибут 1 */ #define F_APLATR2 0x0080 /* Прикладний атрибут 2 */ #define F_RONLY 0x0010 /* Атрибут захисту від запису */ #define F_PERM 0x0020 /* Атрибут захисту від видалення */ #define F_OWNACC 0x0007 /* Маска прав власника (RWE) */ #define F_OWNACR 0x0004 /* Права читання власника (R) */ #define F_OWNACW 0x0002 /* Права запису власника (W) */ #define F_OWNACE 0x0001 /* Права виконання власника (E) */
|
WERR get_lnk(TC *path, LINK *lnk, W mode)
TC *path Шлях до об'єкта у файловій системі (NULL — поточний робочий файл) LINK *lnk Буфер для збереження отриманого посилання (Вихід) W mode Режим отримання посилання: (F_NORM || F_BASED) | [F_DIRECT]
= 0 Успішне виконання (Отримано посилання на звичайний файл) = 1 Успішне виконання (Отримано посилання на файл посилання) = 2 Успішне виконання (Отримано пряме посилання на цільовий файл при F_DIRECT) < 0 Помилка (Код помилки)
Зчитує системне посилання LINK на файл, вказаний текстовим шляхом path. Якщо path дорівнює NULL, повертає посилання на поточний робочий файл процесу. При режимі F_DIRECT повертає пряме посилання на цільовий файл.
ER_ACCES : Відсутні права виконання/пошуку (E) для елементів шляху. ER_ADR : Неприпустима адреса вказівника path або lnk. ER_FNAME : Некоректний, порожній або занадто довгий шлях path. ER_IO : Помилка введення/виведення фізичного пристрою. ER_NOFS : Файлова система вказаного шляху не підключена. ER_NOEXS : Файл за вказаним шляхом відсутній. ER_NOSPC : Недостатньо пам'яті ядра. ER_PAR : Некоректний режим mode.
|
ERR chg_wrk(LINK *lnk)
LINK *lnk Вказівник на новий робочий файл (NULL — скинути робочий файл)
= 0 Успішне виконання < 0 Помилка (Код помилки)
Встановлює вказаний файл lnk як новий поточний робочий файл процесу. Для успішного виконання процес повинен мати права виконання/пошуку (E) на цей файл.
ER_ACCES : Відсутні права виконання/пошуку (E) на файл lnk. ER_ADR : Неприпустима адреса вказівника lnk. ER_IO : Помилка введення/виведення пристрою. ER_NOEXS : Вказаний файл lnk відсутній. ER_NOFS : Файлова система файлу lnk не підключена. ER_NOSPC : Недостатньо оперативної пам'яті ядра.
|
WERR cre_fil(LINK *lnk, TC *name, A_MODE *mode, UH atype, W opt)
LINK *lnk Буфер для збереження посилання на створений файл (Вихід) TC *name Ім'я файлу (до 20 символів TRON Code) A_MODE *mode Матриця прав доступу (NULL — стандартний режим) UH atype Прикладний тип додатка W opt Режим створення: F_FLOAT || F_FIX || F_FILEID
> 0 Успішне виконання (Дескриптор відкритого файлу fd) < 0 Помилка (Код помилки)
Створює новий звичайний файл на томі вказаного об'єкта lnk, встановлює атрибути доступу mode та відкриває файл для оновлення (Update). Повертає дескриптор відкритого файлу fd.
ER_ACCES : Відсутні права запису (W) у батьківському файлі (при F_FIX). ER_ADR : Неприпустима адреса вказівника lnk, name або mode. ER_BUSY : Батьківський файл заблокований у монопольному режимі. ER_EXS : Файл з вказаним ID вже існує (при F_FILEID). ER_FNAME : Неприпустиме або порожнє ім'я name. ER_IO : Помилка введення/виведення пристрою. ER_LIMIT : Перевищено ліміт відкритих файлів у системі. ER_NODSK : Недостатньо вільного місця на диску/томі. ER_NOEXS : Батьківський файл відсутній (при F_FIX). ER_NOFS : Файлова система тома не підключена. ER_NOSPC : Недостатньо пам'яті ядра. ER_PAR : Некоректний параметр opt або mode. ER_RONLY : Том або файл перебуває у режимі лише для читання.
|
WERR opn_fil(LINK *lnk, W o_mode, TC *pwd)
LINK *lnk Вказівник на відкривний файл W o_mode Режим відкриття: (F_READ || F_WRITE || F_UPDATE) | [F_EXCL || F_WEXCL] TC *pwd Пароль доступу (NULL — без пароля)
> 0 Успішне виконання (Дескриптор відкритого файлу fd) < 0 Помилка (Код помилки)
Відкриває файл lnk у вказаному режимі o_mode (читання, запис або оновлення) та повертає системний дескриптор відкритого файлу fd. Покажчик поточного запису встановлюється на перший запис файлу.
ER_ACCES : Відсутні права доступу для вказаного режиму o_mode. ER_ADR : Неприпустима адреса вказівника lnk або pwd. ER_BUSY : Файл заблокований іншим процесом у монопольному режимі. ER_IO : Помилка введення/виведення пристрою. ER_LIMIT : Перевищено ліміт відкритих файлів у системі. ER_NOEXS : Вказаний файл lnk відсутній. ER_NOFS : Файлова система тома не підключена. ER_NOSPC : Недостатньо пам'яті ядра. ER_PAR : Некоректні параметри o_mode. ER_PWD : Вказаний пароль pwd не відповідає паролю файлу. ER_RONLY : Том або файл перебуває у режимі лише для читання.
|
ERR cls_fil(W fd)
W fd Дескриптор відкритого файлу
= 0 Успішне виконання < 0 Помилка (Код помилки)
Закриває відкритий файл fd та вивільняє пов'язані з ним системні ресурси. При завершенні процесу всі його відкриті файли закриваються автоматично.
ER_FD : Вказаний дескриптор файлу fd відсутній або закритий. ER_IO : Помилка введення/виведення пристрою.
|
WERR del_fil(LINK *org, LINK *lnk, W force)
LINK *org Батьківський файл (NULL — без батьківського файлу) LINK *lnk Видаляється файл W force Прапорець примусового видалення
>= 0 Успішне виконання (Кількість посилань із лічильником 0) < 0 Помилка (Код помилки)
Вилучає запис посилання на файл lnk із батьківського файлу org та зменшує лічильник посилань. Якщо лічильник посилань досягає 0, файл фізично видаляється з носія.
ER_ACCES : Відсутні права запису (W) у батьківському файлі org. ER_ADR : Неприпустима адреса вказівника org або lnk. ER_BUSY : Файл відкритий або використовується як робочий файл іншим процесом. ER_IO : Помилка введення/виведення пристрою. ER_NOEXS : Файл org або lnk відсутній. ER_NOFS : Файлова система тома не підключена. ER_PERM : Файл має атрибут захисту від видалення (Delete Protect).