3OS

Концепция ядра 3ОС

(версия от 10.01.2004)

Из предпосылок

Спецификация

Микроядро функционально разбито на несколько модулей, являющихся в свете ООП классами. Таким образом, становится возможным изменение функциональности ядра на этапе сборки, например:

Модульность ядра обеспечивается его объектной ориентированностью и представляется следующими структурами ядра:

Минимальная единица исполнения в однопроцессорном мультизадачном ядре 3OS - поток кода, имеющий (определенной привилегированности):

Для нескольких потоков возможны:

Поток кода любой привилегированности, за исключением привилегий уровня 0, обращается к средствам ядра (процедурам, функциям и свойствам в терминологии ООП) исключительно через шлюзы в IDT и GDT, или при помощи механизма SYSENTER/SYSEXIT (CPU >= P6). Соответственно, обращение любого потока (за исключением потока с привилегией уровня 0) к методам (процедурам и функциям) других потоков возможно только при использовании механизма очереди внутрисистемных сообщений ядра.

Потоки кода по уровню доступа разделены на:

Приоритет в зависимости о степени загруженности задачи динамически изменяется модулем (механизмом) ядра, обеспечивающим работу очередей.

По типу исполнения потоки разделены на 3 категории:

Структурно три типа потоков предусматривают наличие 3 очередей исполнения с промежуточной сортировкой потоков в очереди по загрузке (ранжирование по максимально удельному количеству тактов процессора).

Модуль (механизм) управления потоками в этом случае предусматривает:

Время обхода очереди активных потоков фиксированно в заданном, при первичном старте, интервале времени. Драйвера в данной концепции представлены потоками типа 3 (потоки ожидающие внутрисистемные сообщения).

Очередь внутрисистемных сообщений оперирует с потоками кода посредством узконаправленной передачи сообщения адресату. Доставка сообщения является наиболее привилегированным потоком кода с доступом уровня 0 и со статическим приоритетом исполнения, порождаемого ядром после стабилизации последнего в операционной системе.

Управление памятью

Особенности: Как следствие, из ОО ядра вся доступная физическая память, за исключением областей памяти подключаемых устройств (напрмер - LFB Video) является кучей ядра (Kernel_HEAP). Именно в куче ("хипе") ядра производится выделение памяти под объекты ядра. В ядре 3OS могут быть применена в зависимости от позиционирования ОС одна из следующих моделей памяти:

Странично-сегментная модель памяти с разграничением доступа в сегменты

В этом случае в физическом адресном пространстве, представленном совокупностью страниц размером 4Кб, располагаются сегменты, локализующие адресные пространства (данные, код, стек) работающих в системе потоков.

До тех пор, пока существует возможность размещения потоков внутри физического адресного пространства без изменения его конфигурации посредством каталогов страниц и регистра CR3, оно проводится добавлением сегментов в GDT, в противном случае производится выгрузка (swapping) малоиспользуемых страниц и реконфигурирование адресного пространства ОС с последующим добавлением потока в свободное пространство.

Ферма удаленных объектов (remote object farm - ROF) подстыковываются в заранее созданные для них фреймы в адресном пространстве потоков, использующих методы ROF, при помощи механизма страничной адресации. Код таких библиотек должен быть позиционно независимым, то есть:

Код 3OS-ROF можно будет создавать при помощи инструментов для разработки приложений в среде 3OS. Подобный механизм работы ОС окупается повышением быстродействия при работе с малым числом потоков.

Таблица глобальных дескрипторов (GDT)

В сегменты выделены следующие области памяти:

Наименование объекта "Имя" селектора
Нулевой дескриптор. = NULL_DESCRIPTOR
Код 32-битной части загрузчика и ядра = KernelCodeDescriptor
Стек загрузчиков и ядра = LoaderStackDescriptor
Плоский сегмент памяти 4Gb = FlatDataDescriptor
Сегмент данных ядра Kernel_HEAP = KernelDataDescriptor
Шлюз в сервис ядра = ServiceGATE

Таблица 1.1. Распределение сегментов и имена селекторов GDT

Изначально (при старте 16-битной части загрузчика) таблица глобальных дескрипторов GDT размещается в статическом сегменте данных _DGROUP 16-битной части загрузчика. Затем, в соответствии с ООП-схемой, 32-битная часть загрузчика:

Селектор KernelHeapDescriptor инициализируется константным базовым адресом сегмента неинициализированных данных _BSS и размещается при старте 32-битной части загрузчика в DS и ES. Кроме того, для предоставления ядру плоского адресного пространства данных максимальной длины используется селектор FlatDataDescriptor, помещаемый в FS.

Класс TGDT предоставляет разработчику доступ к содержимому при помощи следующих методов:

Примечание: Поскольку смещение данных, располагающихся в _BSS и _DGROUP, устанавливаются компилятором от IMAGE BASE, т.е. с адреса 0x0000A000 то KernelHeapDescriptor является одновременно и селектором сегмента данных для 32-битной части загрузчика и ядра.