Концепция ядра 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. Подобный механизм работы ОС окупается повышением быстродействия при работе с малым числом потоков.
В сегменты выделены следующие области памяти:
Наименование объекта | "Имя" селектора |
Нулевой дескриптор. | = 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-битной части загрузчика и ядра.