OSDev

для всех
Текущее время: 28 мар 2024, 18:20

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Создание стандартной библиотеки
СообщениеДобавлено: 20 авг 2019, 10:39 

Зарегистрирован: 26 янв 2019, 14:00
Сообщения: 34
Добрый день! Думаю написать собственную библиотеку для начала, а не портировать тот же newlib. И тут же встал вопрос, а собственно что обычно помещают в стандартную библиотеку? Помещают ли туда работу с графикой?
Сейчас при компиляции пользовательских программ я использую следующее в линкере. Таким образом организовал вызов системных функций.
Код:
OUTPUT_FORMAT(elf32-i386)
ENTRY(start)
STARTUP(crtbegin.o)
INPUT(syscall.o)
phys = 0x02000000;

А как быть с библиотекой/ами? Указывать их при сборке? Появилась догадка что стандартная библиотека именно при компиляции, а другие уже динамически. Делал ли кто так? И разумно ли это? В таком случае как быть с другими библиотеками, как их загружать в память? В отдельное пространство? А как организовать видимость?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 20 авг 2019, 14:54 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
Всё зависит от того, о каком стандарте идёт речь. По сути, стандартизированы только библиотеки, касающиеся самого языка и базовых взаимодействий с ОС. Эти функции описаны в соответствующих разделах стандартов C (раздел 7) и C++ (разделы 20-33).
Если говорить о библиотеках самой ОС, то никаких формальных стандартов в этой области нет, разработчики ОС сами решают, что туда должно войти.
Графика НЕ входит в стандартные языковые библиотеки. Она входит в библиотеки ОС.

Sebt писал(а):
А как быть с библиотекой/ами? Указывать их при сборке?

Линкер должен иметь информацию обо всех используемых библиотеках без исключения. Многие компиляторы имеют внутренний список библиотек, подключаемых по умолчанию, так что не возникает необходимости в их явном указании.

Sebt писал(а):
Появилась догадка что стандартная библиотека именно при компиляции, а другие уже динамически.

Эта фраза совершенно непонятна. "Стандартная" библиотека и "динамическая" — это ортогональные понятия.

Sebt писал(а):
как быть с другими библиотеками, как их загружать в память? В отдельное пространство? А как организовать видимость?

Динамические библиотеки в микропроцессорах семейства x86 должны настраиваться на конкретные адреса, по которым они будут располагаться, через так называемые "таблицы релокаций". Следовательно, возможны два подхода. Либо каждый процесс имеет собственную копию библиотеки в своём адресном пространстве, либо резервируется область адресного пространства исключительно для динамических библиотек таким образом, что одна библиотека располагается по одинаковым адресам в разных процессах. Во втором случае физические страницы библиотеки можно "расшарить" между процессами. Оба подхода имеют свои недостатки. В первом случае расходуется лишняя память на копии библиотек, во втором случае расходуется адресное пространство процесса на библиотеки, которые ему могут не понадобиться.

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 авг 2019, 07:45 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Sebt писал(а):
Добрый день! Думаю написать собственную библиотеку для начала


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23 авг 2019, 07:26 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Встроенные функции
SizeOf(x)
Write(value:Integer);
Write(value:Real);
Write(value:String);
WriteLn – работает также как и write, но с добавлением CR+LF (ASCII 0x0D 0x0A)
Read(out value:Integer)
Read(out value:Real)
Read(out value:String) - Читает строку до TermitateChar=[' ,;='#9#10#13];
ReadLn(out value:String) - до конца строки LF(ASCII 0x0A)
GetMem(Size:Integer);
FreeMem(p:Pointer);
Inc(p:Pointer);
Dec(p:Pointer);
Встроенные массивы
Mem[]
Системные переменные
//
HeapOrg: Pointer = nil; { Начальная граница кучи}
HeapPtr: Pointer = nil; { Указатель на заголовок кучи }
HeapEnd: Pointer = nil; { Конечная граница кучи }
// Случайные числа
RandSeed: Longint = 0; { Опорное значение для следующего случайного числа}

4.2 Библиотека
Память
Арифметика
Строки
Командная строка
Файлы.


Операции с памятью
function GetMem(Size:Integer):pointer;
procedure FreeMem(ptr:Pointer);
function HeapSize:Integer;
function ReadByte(Addr:Pointer):Byte; - не атомарная операция
procedure WriteByte(Addr:Pointer; value:Byte); - не атомарная операция
procedure Move(Source:Pointer; Dest:Pointer; Count: Integer);
procedure CleareMem(Addr:Pointer; Count:Integer);
Функции над целыми числами
function Abs(const value:Integer):Integer;
function Random(Modul:Integer):Integer;
procedure Randomize;
procedure Inc(value:Integer; addition:Integer)
procedure Dec(value:Integer; addition:Integer)
Функции над реальными числами
Арифметические

function sqr(x:Real): Real;
function sqrt(x:Real): Real;
function frac(x:Real): Real;
function Abs(const value:Real):Real;
Округление
function Round(X: Real): Integer;
function Trunc(X: Real): Integer;
function Ceil(X: Real): Integer;
Тригонометрия
function Pi: Real;
function sin(x:Real): Real;
function cos(x:Real): Real;
function tan(x:Real): Real;
function arcsin(x:Real): Real;
function arccos(x:Real): Real;
function arctan(x:Real): Real;
function arctan2(y, x:Real): Real;
Методы степенней и логарифмов
function log(x:Real): Real;
function logN(Base, x:Real): Real;
function ln(x:Real): Real;
function exp(x:Real): Real;
function power(const Base, Exponent: Real): Real;
Дополнительные методы
function IsZero(x:Real): boolean;
function IsNaN(x:Real): boolean;
function IsInfininte(x:Real): boolean;
Функции для работы со строками
procedure AssignStr(var s1, s2:String);
function CompareStr(const s1, s2:String):Integer;
procedure StrCreate(var Str:String; Len:Integer);
procedure StrDestroy(var Str:String);
function StringPadingSize(Size:Integer):Integer;
procedure SetLength(var Str:String; Len:Integer);
function Find(Substr: string; S: string): Integer;
function Length(S:string): Integer;
procedure Delete(var S: string; Index, Count:Integer);
procedure Insert(Source: string; var S: string; Index: Integer);
function Copy(S:String; Index, Count: Integer): string;
function Concatenate(s1, s2: string): string;
function IntToStr(Value: Integer): string;
function StrToInt(S: string): Integer;
function IsNumber(s:String):Boolean;
function ToString(s:AnsiZ):string;
function ToAnsiZ(s:string):AnsiZ;
function IsDidgit(ch:Char):Boolean;
Стык с файловой системой
Методы файлов

function OpenFile(const FileName:String; Mode:Integer):Handle;
function CreateFile(const FileName:String):Handle;
procedure CloseFile(hFile:Handle);
function SeekFile(hFile:Handle; Offset, Origin:Integer):Integer;
function FlushFile(hFile:Handle):Boolean;
function TruncateFile(hFile:Handle):Boolean;
function SetEOF(hFile:Handle):Boolean;
function DeleteFile(const FileName:String):Boolean;
function RenameFile(const OldName, NewName:String):Boolean;
function RemoveFile(const DirName:String):Boolean;
function IsEOF(hFile:Handle):Boolean;
function PosFile(hFile:Handle):Integer;
function SizeFile(hFile:Handle):Integer;
function SetSizeFile(hFile:Handle; NewSize:Integer):boolean;
function IsExistsFile(const FileName:String):Boolean;
function ReadFile(hFile:Handle;var Buffer:Pointer; Count:Integer):Integer;
function WriteFile(hFile:Handle;const Buffer:Pointer; Count:Integer):Integer;
методы папок
function FindFirst(const Path:String; var SearchRec:TSearchRec):Integer;
function FindNext(var SearchRec:TSearchRec):Integer;
procedure FindClose(var SearchRec:TSearchRec);
Стандартный ввод/вывод
function IsTermitateChar(Ch:Char):boolean;
Стык с операционной системой
Вспомогательные методы

function BoolToBoolean({eax:Bool}):Boolean; assemble;
Методы командной строки
function ParamStr(Index: Integer): string;
function ParamCount: Integer;
Методы переменных окружения
function GetEnvironmentStrings: AnsiZ; stdcall;
function FreeEnvironmentStrings(EnvBlock: AnsiZ): BOOL; stdcall;
function GetEnvironmentVariable(lpName: AnsiZ; lpBuffer: AnsiZ; nSize: DWORD): DWORD; stdcall;
function SetEnvironmentVariable(lpName, lpValue: AnsiZ): BOOL; stdcall;
Методы времени и даты
function GetTickCount:Integer;
function WinSleepEx(Milliseconds:DWord; Alertable:boolean):DWord;
Методы памяти
function VirtualQuery(lpAddress: Pointer;
var lpBuffer: TMemoryBasicInformation; dwLength: DWORD): DWORD; stdcall;
Методы задач
function WinSwitchToThread:boolean;
Методы файловой системы
function FindFirst(const Path:String; var SearchRec:TSearchRec):Integer;
function FindNext(var SearchRec:TSearchRec):Integer;
procedure FindClose(var SearchRec:TSearchRec);
Методы синхронизации
procedure MutexInit(const Mutex:PMutex;const Value:TMutex);
function MutexTryDoLock(const Mutex:PMutex):Boolean;
procedure MutexDoLock(const Mutex:PMutex);
procedure MutexDoUnLock(const Mutex:PMutex);
procedure SpinMutexDoLock(const Mutex:PMutex);
Атомарные функции
procedure AtomicAdd32(const Addr:PDword; const Value:DWord);
procedure AtomicSub32(const Addr:PDword; const Value:DWord);
function AtomicCompareExchange32(const Addr:PDword;const CmpValue:DWord; const NewValue:Dword):Boolean;
Критическая секция
procedure CiSBegin(var CriticalSection:PCriticalSection); far;
procedure CiSBeginImp(var CriticalSection:PCriticalSection); far;
procedure CiSEnd(const CriticalSection:PCriticalSection); far;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB