API ядра

Введение

В данном документе представлен набор интерфейсных частей классов, используя которые, приложения пользователя могут взаимодействовать с ядром 3OS. Эти классы не являются отражением внутренней структуры и физической реализации ядра, а являются формальными "точками входа" в ядро. Реализация методов этих классов зависит от версии ядра и сопровождается группой занимающейся разработкой ядра (KG - kernel group). Пользователь не должен делать никаких предположений о реализации этих классов. Кроме описанных в данном документе классов, KG может добавлять/удалять в Kernel API вспомогательные, технические классы. Пользоваться такими классами не рекомендуется т. к. их функциональность зависит от текущей версии ядра, и в другой версии может не поддерживаться.

Объекты этих классов следует рассматривать как ссылки на соответствующие объекты ядра. Но это не означает, что в ядре реализован класс обладающий такой же функциональностью. Например, описанный ниже класс Mutex инкапсулирует логику объекта синхронизации mutex. В коде ядра, действительно, может быть реализован некий класс KernelMutex, а может и не быть. Во втором случае ядро может имитировать логику mutex, используя другие механизмы синхронизации.

Права доступа

Любой объект в 3OS имеет владельца и ассоциирован с какой либо группой пользователей. Операции, производимые над объектом, регламентируются правами доступа. Права доступа устанавливает владелец объекта. Пользователь может установить одни права для себя, другие для группы, в которую он входит, третьи для всех остальных.

В 3OS существуют такие права доступа:

class SecurityAttribute{
public: 
  bool Visible(void)const; 
  bool Visible(bool value); 
  bool Read(void)const; 
  bool Read(bool value); 
  bool Write(void)const; 
  bool Write(bool value); 
  bool Access(void)const; 
  bool Access(bool value); 
};

Класс SecurityAttribute описывает набор прав доступа:

Конструктор этого класса не приводится т. к. пользователь не должен создавать экземпляры этого класса.

class Security{ 
public: 
  SecurityAttribute Owner; 
  SecurityAttribute Group; 
  SecurityAttribute Other; 
};

Класс Security определяет права доступа к объекту. Конструктор этого класса не приводится, т. к. пользователь не должен создавать экземпляры этого класса.

Объекты синхронизации

SyncObject

class SyncObject{ 
public: 
  Security sa;
  virtual SyncObject* Clone(void)=0; 
  virtual void Close(void)=0; 
  virtual int Wait(int time_out=WAIT_INFINITE); 
  const char *GetName(void); 
}; 

Класс SyncObject - базовый класс для всех объектов синхронизации:

Mutex

class Mutex : public SyncObject{ 
public: 
  Mutex(const char *name=0); 
  void Release(void); 
}; 

Класс Mutex реализует логику объекта синхронизации mutex:

Права доступа для Mutex:

Event

class Event : public SyncObject{ 
public: 
  Event(const char *name=0); 
  void Signal(bool to_all=false); 
  void Busy(void);
};

Класс Event реализует логику триггера:

Права доступа для Event:

Потоки управления

Потоки управления выполняются в соответствии с их приоритетом. В 3OS основные приоритеты потоков представлены константами:

Шкала приоритетов потоков не является сплошной. KG могут вводиться дополнительные приоритеты.

Поток запускается как функция, имеющая такой прототип:

typedef void (*ThreadProc)(Thread*, void*); 
class Thread : public SyncObject{ 
public: 
  Thread(void); 
  Thread(int thread_id); 
  void Resume(void); 
  void Suspend(void); 
  int Priority(void)const; 
  void Priority(int prio); 
  void Terminate(void); 
  void Run(ThreadProc thread_proc, void *param); 
  int GetId(void)const; 
  int State(void)const; 
};

Класс Thread реализует управление потоком:

Права доступа для Thread:

Сообщения

class Message{ 
public: 
  bool Send(int thread_id, const void *data, int data_size, bool wait=true); 
  void Reply(int thread_id); 
  bool Receive(int thread_id, void *buf, int buf_size, int &real_size, int &thread_sender, int time_out);    
};

Класс Message инкапсулирует логику передачи/получения сообщений:

Права доступа для Message: