Специфікація BTRON3 (Український переклад) | Специфікація ОС Sakamura BTRON / BTRON3
Повернутися до змісту цього розділу
Попередня сторінка: 1.5 Управління оперативною пам'яттю (Повернутися)
Наступна сторінка: 1.7 Менеджер подій вводу (Перейти)

1.6 Файлова система та менеджер файлів (File Management)

1.6.1 Огляд підсистеми управління файлами (Overview)

Загальний огляд

Підсистема управління файлами визначає логічну структуру файлової системи на фізичних носіях інформації (дискетах FD, жорстких дисках HD, флеш-носіях) та надає повний набір системних викликів ядра для роботи з файлами, записами та посиланнями.

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

Файлова система BTRON побудована на основі Реально-Віртуальної об'єктної моделі (Real/Virtual Object Model) і має наступні фундаментальні особливості:

Файли можуть використовуватися кількома користувачами у різний час або одночасно у мережевому середовищі. З цієї причини підсистема файлового менеджера надає деталізований контроль прав доступу та високий рівень захисту даних.

Файли (Реальні об'єкти) та Посилання (Віртуальні об'єкти)

Файл (Реальний об'єкт) є контейнером для збереження даних або самими збереженими даними. Один файл складається із послідовності впорядкованих записів змінної довжини.

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

Посилання зберігається у вигляді окремого запису всередині будь-якого файлу. На один і той самий файл може вказувати довільна кількість посилань, завдяки чому формується довільна мережева структура зв'язків між файлами.

У контексті Реально-Віртуальної об'єктної моделі файл точно відповідає Реальному об'єкту, а посилання — Віртуальному об'єкту. Віртуальний об'єкт слугує графічним представленням посилання на екрані користувача.

Оскільки доступ до файлів здійснюється безпосередньо через посилання, ім'я файлу не має абсолютного значення у системі і слугує лише текстовим ключем для пошуку. Файлу можна призначити будь-яке ім'я довжиною до 20 символів TRON Code, причому у системі дозволене існування кількох файлів із однаковими іменами.

Файли та посилання
Мал. 6: Файли (Реальні об'єкти) та Посилання (Віртуальні об'єкти)

1.6.2 Архітектура та структура файлової системи (Volume Architecture)

Файлова система (Том / Volume)

Файлова система (Том) являє собою єдину фізичну одиницю управління файлами, яка створюється на конкретному носії інформації та має фізично обмежений розмір:

Кожна файлова система обов'язково містить один Кореневий файл (Root File). Переходячи за посиланнями, що містяться у кореневому файлі, можна дістатися до будь-якого файлу даного тома. У Реально-Віртуальній моделі кореневий файл відповідає Пристроєвому об'єкту (Device VObject).

Зв'язки між файлами за допомогою посилань зазвичай визначаються в межах однієї файлової системи. Проте для посилання на файли, що розташовані на інших томах, використовується спеціальний механізм Опосередкованих посилань (Indirect Links). При використанні опосередкованих посилань цілісність зв'язку при змінах на іншому томі не гарантується, тому наявність цільового файлу потребує додаткової перевірки.

При формуванні файлової системи їй призначаються Назва файлової системи та Назва фізичного пристрою.

Монтування та підключення тома (Volume Mount/Connect)

При старті операційної системи файлові системи не підключені за замовчуванням. Для початку роботи з носієм необхідно виконати операцію підключення тома (Mount).

Підключення здійснюється шляхом вказівки логічного імені пристрою та імені підключення (Mount Name). Назва підключення є ідентифікатором тома довжиною до 8 символів і використовується як абсолютний шлях до кореневого файлу тома.

Структура файлової системи
Мал. 7: Архітектура файлової системи (Volume Architecture)
Підключення тома
Мал. 8: Монтування та підключення тома (Volume Mount/Connect)

1.6.3 Внутрішня структура файлів та записів (File & Record Structure)

Типи файлів

У системі BTRON3 виділяють 2 основні типи файлів (коли вживається термін «файл», за замовчуванням мається на увазі Ззвичайний файл):

1. Ззвичайний файл (Regular File) :
Контейнер для збереження довільних прикладних та системних даних.
2. Файл посилання (Link File) :
Спеціальний файл, що слугує для опосередкованого адресування файлу на іншому томі/файловій системі. Таке посилання називається Опосередкованим посиланням (Indirect Link).

Фізичні пристрої (дискети FD, жорсткі диски HD, принтери, роз'єми послідовного зв'язку) не репрезентуються як звичайні файли в каталозі, а керуються як незалежні системні пристрої за допомогою Менеджера пристроїв (Device Manager) та унікальних системних імен.

Структура звичайного файлу

Ззвичайний файл складається із послідовності впорядкованих записів змінної довжини — Потоку записів (Record Stream). Кожен окремий запис містить 4 обов'язкові елементи:

Типи записів (Record Types 0 – 31):

Тип 0: Запис посилання (Link Record / Віртуальний об'єкт) :

Зберігає посилання на інший файл (структура LINK розміром 52 байти). Вміст цього запису обробляється безпосередньо файловим менеджером ядра, а прямі прикладні модифікації обмежені.

Типи 1 – 31: Записи даних (Data Records) :

Записи користувацьких та прикладних даних. Файловий менеджер ядра розглядає вміст цих записів як довільний потік байтів без аналізу їхнього внутрішнього формату.

Розмір тіла запису вказує на кількість байтів у тілі запису. Для Записів посилань (Тип 0) розмір буфера введення/виведення відповідає розміру структури LINK (52 байти), проте цей розмір не зараховується до загального обсягу користувацьких даних файлу (f_size).

Номери записів та Поточний запис (Current Record Pointer)

Записи у файлі нумеруються послідовними цілими числами починаючи з 0 (Перший запис має номер 0). Номер запису відповідає його порядковому місцю у файлі і динамічно змінюється при вставці або видаленні записів.

Після останнього запису файлу віртуально існує Кінцевий запис (End Record). Якщо файл містить N записів, Кінцевий запис має номер N.

Для кожного відкритого файлу ядро підтримує покажчик Поточного запису (Current Record Pointer), на який спрямовуються операції читання та запису. Покажчик можна переміщувати за номером запису чи за допомогою пошуку запису відповідного типу.

Номери записів та поточний запис
Мал. 11: Номери записів та Поточний запис

Структура файлу посилання (Link File Architecture)

Файл посилання створюється для опосередкованого адресування файлів на сторонніх томах. Він не містить прикладних даних користувача, а зберігає лише системні метадані посилання:

1.6.4 Права доступу та захист файлів (Access Control & Security)

Система захисту файлів

Система доступу регламентує права процесів на читання, запис та виконання файлів. Авторизація здійснюється шляхом порівняння параметрів користувача процесу з матрицею прав доступу, збереженою у метаданих файлу.

Інформація про користувача (User Context)

Контекст користувача процесу містить наступні поля:

Права доступу до файлу (File Access Permissions)

Метадані кожного файлу містять наступні налаштування доступу:

    R -- Дозвіл на читання даних файлу (Read)
    W -- Дозвіл на запис та зміну файлу (Write)
    E -- Дозвіл на виконання файлу або пошук посилань у ньому (Execute/Search)

1.6.5 Операції над файлами та покажчики (File Operations)

Прикладний процес взаємодіє з файлом шляхом його відкриття системним викликом opn_fil(), який повертає дескриптор відкритого файлу. Операції читання/запису даних виконуються відносно Поточного запису (Current Record Pointer).

1.6.6 Метадані та атрибути файлів (File Metadata)

Метадані файлу зчитуються викликом fil_sts() у структуру F_STATE та включають атрибути доступу, розміри, часові мітки та кількість посилань.

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

□ Довжина назв та шляхів у байтах/символах

#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      /* '≡' Поточний робочий файл */

□ Режими get_lnk()

#define F_NORM      0x0000      /* Звичайне розпізнавання шляху */
#define F_BASED     0x0001      /* Відносно базового файлу lnk */
#define F_DIRECT    0x0002      /* Пряме отримання посилання на реальний файл */

□ Режими opn_fil()

#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      /* Монопольний режим лише для запису */

□ Режими cre_fil() / cre_lnk()

#define F_FLOAT     0x0000      /* Створення плаваючого посилання */
#define F_FIX       0x0001      /* Створення фіксованого посилання */
#define F_FILEID    0x0002      /* Створення з вказаним ID файлу */

□ Режими пошуку fnd_rec() / fnd_lnk()

#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 */

□ Режими блокування loc_rec()

#define F_UNLOCK    0x0000      /* Розблокування запису */
#define F_LOCK      0x0001      /* Блокування запису */
#define F_TSLOCK    0x0002      /* Тестове блокування */
#define F_CKLOCK    0x0003      /* Перевірка стану блокування */

□ Режими відображення map_rec()

#define F_READ      0x0004      /* Дозвіл читання (R) */
#define F_WRITE     0x0002      /* Дозвіл запису (W) */
#define F_EXCUTE    0x0001      /* Дозвіл виконання (E) */
#define F_COMMON    0x0100      /* Відображення у спільну пам'ять */
#define F_SYSTEM    0x0300      /* Відображення у системну пам'ять */

□ Режими перевірки chk_fil()

#define F_READ      0x0004      /* Перевірка права читання (R) */
#define F_WRITE     0x0002      /* Перевірка права запису (W) */
#define F_EXCUTE    0x0001      /* Перевірка права виконання (E) */
#define F_EXIST     0x0000      /* Перевірка існування файлу */
#define F_PASWD     0x0008      /* Перевірка наявності пароля */

□ Режими зміни атрибутів chg_fat()

#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 */

□ Режими att_fls()

#define FS_SYNC     0x0000      /* Синхронний режим приєднання */
#define FS_ASYN     0x0002      /* Асинхронний режим приєднання */
#define FS_RONLY    0x0001      /* Приєднання лише для читання */

□ Режими lst_fls()

#define F_GETDEV    (-1)        /* Отримати назву пристрою */
#define F_GETNAM    (-2)        /* Отримати назву підключення */

□ Результати syn_lnk()

#define F_SYNC      0       /* Посилання повністю синхронізоване */
#define F_DNAME     1       /* Відмінність в імені файлу */
#define F_DDATE     2       /* Відмінність у даті створення */
#define F_DBOTH     3       /* Відмінність в імені та даті */

□ Структура посилання LINK

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;

□ Матриця прав доступу A_MODE

typedef struct {
    UH  f_ownacc;       /* Матриця доступу власника RWE */
    UH  f_grpacc;       /* Рівень доступу групи */
    UH  f_pubacc;       /* Загальний рівень доступу */
    H   f_grpno;        /* Номер групи власника (1..4) */
} A_MODE;

□ Стандартна матриця доступу DA_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;

□ Часові мітки файлу F_TIME

typedef struct {
    STIME   f_ltime;        /* Термін зберігання файлу */
    STIME   f_atime;        /* Час останнього доступу */
    STIME   f_mtime;        /* Час останньої модифікації */
} F_TIME;

□ Структура метаданих файлу F_STATE

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;

□ Прапори f_type

#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) */

1.6.8 Системні виклики файлової системи (File System Calls)

get_lnk
 
Отримання посилання на файл (Get File Link)

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

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.
chg_wrk
 
Зміна поточного робочого файлу (Change Working File)

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

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   : Недостатньо оперативної пам'яті ядра.
cre_fil
 
Створення звичайного файлу (Create Regular File)

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

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   : Том або файл перебуває у режимі лише для читання.
opn_fil
 
Відкриття файлу (Open File)

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

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   : Том або файл перебуває у режимі лише для читання.
cls_fil
 
Закриття файлу (Close File)

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

ERR     cls_fil(W fd)

【Параметри】

W   fd  Дескриптор відкритого файлу

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

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

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

Закриває відкритий файл fd та вивільняє пов'язані з ним системні ресурси. При завершенні процесу всі його відкриті файли закриваються автоматично.

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

ER_FD      : Вказаний дескриптор файлу fd відсутній або закритий.
ER_IO      : Помилка введення/виведення пристрою.
del_fil
 
Видалення файлу (Delete File)

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

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).

Повернутися до змісту цього розділу
Попередня сторінка: 1.5 Управління оперативною пам'яттю (Повернутися)
Наступна сторінка: 1.7 Менеджер подій вводу (Перейти)