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

Завантаження і зупинка

ред.

Завантаження інсталяції Linux це складний процес, який містить в собі багато стадій і програмних компонент. Ця книга приділяє увагу до тієї частини процесу завантаження, що стосується ядра, залишаючи решту для описання в інших книжках чи для вивчення додаткової документації. Однак, ця книга дає загальний опис важливих стадій процесу запуску, аби продемонструвати взаємодію ядра:

  1. Ініціалізація обладнання (включаючи їх програмну прошивку)
  2. Виконання завантажувача (boot loader) (якщо такий присутній)
  3. Завантаження образу ядра і запуск ядра
  4. Ініціалізація простору користувача

Ранні стадії процесу запуску Linux у значній мірі залежать від архітектури комп'ютера. Однією із поширених архітектур, на якій як правило використовують Linux є архітектура IBM PC сумісного обладнання; на таких системах, важливу роль відіграє BIOS, який може не мати подібних аналогів на інших системах. В наступному прикладі буде обговорюватися саме архітектура IBM PC сумісного обладнання:

  1. BIOS виконує задачі запуску, які є специфічними для даної апаратної платформи.
  2. Як тільки обладнання було перераховане і те обладнання, яке необхідне для завантаження було ініціалізоване правильно, BIOS завантажує і виконує код завантажуванча із сконфігурованого пристрою для завантаження. Код завантажувача містить код для виконання фази 1 завантажувача Linux; фаза 1 виконує завантаження фази 2, в якій міститься основна частина коду завантажувача. Деякі завантажувачі для досягнення цього можуть мати проміжну фазу (відому як фаза 1.5), оскільки вони розроблені так, що мають можливість інтерпретувати структури файлової системи, аби знайти місце розташування завантажувача фази 2.
  3. Завантажувач (boot loader) завантажує образ ядра, готує параметри завантаження для того, щоб ядро згодом могло їх прочитати, і передає управління операційній системі виконуючи перехід (jumping) у відповідну позицію в пам'яті.

Коли ядро завершує свій процес запуску, воно повинно забезпечити користувацькому простору середовище із витискальною багатозадачністю. Ядро також повинне ініціалізувати пристрої, які необхідні для монтування кореневої файлової системи (на читання), що вказується у завантажувачі за допомогою параметру root=. Коренева файлова система місить образ першого процесу який буде запускатися ядром, цей процес називається процесом init, PID (ідентифікатор процесу) якого дорівнюватиме 1. За замовчуванням ядро шукатиме його у /sbin/init, або за шляхом вказаним у параметрі завантаження init=.

Процес init виконує ініціалізацію користувацького простору. Це як правило потребує виконання різних скриптів запуску і демонів, які налаштовують усі сервіси системи і структури, що дозволяють створити середовище користувача.

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

ред.

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

Syscalls, /proc, /dev, /sys

procfs

ред.

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

/proc містить директорії для кожного виконуваного процесу —включаючи потоки ядра— у директоріях із назвою /proc/PID, де PID це номер процесу. Кожна з директорій містить інформацію про один процес, включаючи команду, яка початково запустила цей процес (/proc/PID/cmdline), імена і змінні його параметрів середовища англ. environment variables (/proc/PID/environ), символьне посилання на його робочий каталог (/proc/PID/cwd), наступне символьне посилання на початковий виконуваний файл —якщо він досі існує— (/proc/PID/exe), декілька директорій із символічними посиланням на кожен відкритий файловий дескриптор (/proc/PID/fd) і інформацію про статус —позицію, флаги, ...— для кожного з них (/proc/PID/fdinfo), інформацію про відображені на пам'ять файли і блоки пам'яті, такі як купа і стек (/proc/PID/maps), бінарний образ, що представляє віртуальну пам'ять процесу (/proc/PID/mem), символьне посилання на root path як його бачить процес (/proc/PID/root), директорію що містить жорсткі посилання на будь-який дочірній процес або потік (/proc/PID/task), базову інформацію про процес, включаючи його стан роботи і використання пам'яті (/proc/PID/status) і багато іншого.

sysfs це псевдо файлова система, яка експортує до користувацького простору інформацію про різноманітні підсистеми ядра, апаратні пристрої, і пов'язані з ними драйвери пристроїв в моделі пристроїв ядра за допомогою віртуальних файлів. Крім того, що вони надають інформацію про різні пристрої і підсистеми ядра, ці експортовані віртуальні файли використовуються для їх конфігурації. Sysfs розроблена для того, щоб експортувати інформацію, яка присутня у дереві пристроїв, для того, щоб не створювати безладу в procfs.

Sysfs має адресу монтування /sys.

Модулі

ред.
lsmod
cat /proc/modules

Пристрої

ред.
ls /dev
cat /proc/devices

До версії ядра 2.6, узагальненої моделі пристроїв в ядрі не існувало. З цієї причини було створено модель пристроїв Linux (англ. Linux Device Model).

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

Драйвер пристрою це комп'ютерна програма, яка керує конкретним пристроєм, що під'єднано до системи, наприклад, принтери, CD-ROM диски та ін. Відповідно до архітектури Linux. Віртуальна пам'ять Linux поділена на два розділи, а саме простір пам'яті користувача (user space) і простір пам'яті ядра (kernel space), з метою захисту даних і функціонування від помилок чи будь-якої небажаного втручання.

 
Загальна архітектура ОС Linux

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

Бібліотека GNU C library (glibc) надає програмний інтерфейс API (Application Programming Interfaces), який дозволяє взаємодіяти за допомогою системних викликів (syscalls). Наприклад, коли ми робимо виклик функції printf() в нашій C програмі, вона в середині себе викликає системний виклик write(). Таким чином, System Call Interface (SCI) є засобом взаємодії між простором користувача і простором ядра. Ядро це основа операційної системи, яка завантажується першою і залишається у основній пам'яті. Вона відповідальна за управління пам'яттю, управління процесами, віртуальну файлову системи і мережеві функції (Network stack).

Драйвери пристроїв можна в загальному вигляді класифікувати по таким групам:

  1. Драйвери символьних пристроїв – ця категорія працює із символьними пристроями, тобто такими пристроями, які передають дані символ за символом. Наприклад, консолі, послідовні порти, сенсори та ін.
  2. Драйвери блокових пристроїв – для пристроїв, які передають великі обсяги даних, що мають розмір кратний блоку (звідси і назва). Наприклад, CD-ROM, USB пристрої та ін.
  3. Мережевий драйвер – пристрої, які дозволяють здійснювати з’єднання із мережею і використовувати сервіси мережевого інтерфейсу через драйвер. Наприклад – Ethernet карти, NIC (Network Interface Card) та ін.

Література

ред.

Символьні пристрої

ред.

В системах UNIX, користувач може доступатися до драйверів пристроїв через спеціальні файли пристроїв. Ці файли згруповані у директорії /dev, і користувач може виконувати системні виклики open, read, write, close, lseek, mmap та ін. Які направляються операційною системою у драйвер пристрою, який пов'язаний із даним фізичним пристроєм. Драйвер пристрою це компонент ядра (який як правило є модулем), що взаємодіє із апаратним пристроєм.

В світі UNIX існує дві категорії файлів пристроїв і таким чином драйверів пристроїв: символьні і блочні. Цей поділ існує через різну швидкість, об'єм і спосіб доступу і організації даних, що передаються із пристрою до системи і навпаки. До першої категорії відносять повільні пристрої, які оперують не великим об'ємом даних, і доступ до даних не потребує виконувати частих операцій seek. Прикладами таких пристроїв є клавіатури, комп'ютерні миші, послідовні порти, звукові карти, джойстики. В загальному випадку, операції із цими пристроями (read, write) виконуються послідовно байт за байтом. До другої категорії відносять пристрої, які працюють з великим об'ємом даних, дані організовані у блоки, і типовою є виконання операції пошуку. Прикладами пристроїв, що підпадають цій категорії є жорсткі диски, cdroms, ram диски, накопичувачі на магнітних стрічках, тощо. Для таких пристроїв операції читання і запису виконуються на рівні блоків даних. Для двох даних типів драйверів пристроїв, ядро Linux пропонує різні APIs. Якщо у випадку із символьними пристроями системні виклики потрапляють безпосередньо до драйверів пристроїв, у випадку з блочними пристроями, драйвери не працюють напряму із системними викликами. У випадку із блочними пристроями, взаємодія між користувацьким простором і драйвером блочного пристрою здійснюється через підсистему управління файлом і підсистемою управління блочними пристроями. Функцією цих підсистем є підготовка необхідних ресурсів (буферів), які необхідні для роботи драйвера, для збереження недавно зчитаних даних у кешованому буфері, а також впорядкуванням операцій читання і запису з міркувань продуктивної роботи.

Література

ред.