OSDev http://osdev.su/ |
|
Создание стандартной библиотеки http://osdev.su/viewtopic.php?f=5&t=3844 |
Страница 1 из 1 |
Автор: | Sebt [ 20 авг 2019, 10:39 ] |
Заголовок сообщения: | Создание стандартной библиотеки |
Добрый день! Думаю написать собственную библиотеку для начала, а не портировать тот же newlib. И тут же встал вопрос, а собственно что обычно помещают в стандартную библиотеку? Помещают ли туда работу с графикой? Сейчас при компиляции пользовательских программ я использую следующее в линкере. Таким образом организовал вызов системных функций. Код: OUTPUT_FORMAT(elf32-i386) ENTRY(start) STARTUP(crtbegin.o) INPUT(syscall.o) phys = 0x02000000; А как быть с библиотекой/ами? Указывать их при сборке? Появилась догадка что стандартная библиотека именно при компиляции, а другие уже динамически. Делал ли кто так? И разумно ли это? В таком случае как быть с другими библиотеками, как их загружать в память? В отдельное пространство? А как организовать видимость? |
Автор: | Yoda [ 20 авг 2019, 14:54 ] |
Заголовок сообщения: | Re: Создание стандартной библиотеки |
Всё зависит от того, о каком стандарте идёт речь. По сути, стандартизированы только библиотеки, касающиеся самого языка и базовых взаимодействий с ОС. Эти функции описаны в соответствующих разделах стандартов C (раздел 7) и C++ (разделы 20-33). Если говорить о библиотеках самой ОС, то никаких формальных стандартов в этой области нет, разработчики ОС сами решают, что туда должно войти. Графика НЕ входит в стандартные языковые библиотеки. Она входит в библиотеки ОС. Sebt писал(а): А как быть с библиотекой/ами? Указывать их при сборке? Линкер должен иметь информацию обо всех используемых библиотеках без исключения. Многие компиляторы имеют внутренний список библиотек, подключаемых по умолчанию, так что не возникает необходимости в их явном указании. Sebt писал(а): Появилась догадка что стандартная библиотека именно при компиляции, а другие уже динамически. Эта фраза совершенно непонятна. "Стандартная" библиотека и "динамическая" — это ортогональные понятия. Sebt писал(а): как быть с другими библиотеками, как их загружать в память? В отдельное пространство? А как организовать видимость? Динамические библиотеки в микропроцессорах семейства x86 должны настраиваться на конкретные адреса, по которым они будут располагаться, через так называемые "таблицы релокаций". Следовательно, возможны два подхода. Либо каждый процесс имеет собственную копию библиотеки в своём адресном пространстве, либо резервируется область адресного пространства исключительно для динамических библиотек таким образом, что одна библиотека располагается по одинаковым адресам в разных процессах. Во втором случае физические страницы библиотеки можно "расшарить" между процессами. Оба подхода имеют свои недостатки. В первом случае расходуется лишняя память на копии библиотек, во втором случае расходуется адресное пространство процесса на библиотеки, которые ему могут не понадобиться. |
Автор: | SII [ 21 авг 2019, 07:45 ] |
Заголовок сообщения: | Re: Создание стандартной библиотеки |
Sebt писал(а): Добрый день! Думаю написать собственную библиотеку для начала Для начала надо решить, а для чего оно вообще надо, где будет использоваться и т.п. В моём приборе (где моя недоось крутится) вся библиотека полностью моя, но там от неё почти ничего и не требуется. По большому счёту, основные операции с плавающей запятой и пара простых функций вроде пересылки блоков памяти. |
Автор: | pavia [ 23 авг 2019, 07:26 ] |
Заголовок сообщения: | Re: Создание стандартной библиотеки |
Встроенные функции 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; |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |