Bene, dipende da come si definisce "sistema operativo".
- Se lo si definisce come qualcosa con una GUI che gira su hardware x86; sicuro; la maggior parte dei database funzionerà correttamente su altri sistemi.
- Se lo si definisce come qualcosa che implementa le specifiche POSIX o in altro modo consente l'esecuzione di thread o processi e fornisce una misura di sicurezza, beh, ne perdi alcuni che richiedono operazioni con multithreading, ma starai comunque bene; ci sono molte opzioni.
- Se lo si definisce come qualcosa che non ha alcuna operazione di file e non implementa gran parte della libreria standard C, si è praticamente sfortunati.
Il dispositivo basato su ARM dispone quasi certamente di una libreria standard C fornita con la toolchain. Newlib è una scelta popolare per i sistemi profondamente integrati; è incluso per impostazione predefinita in, ad esempio, il toolkit CodeSourcery e YARTGO gratuiti. Tuttavia, è necessario implementare alcune syscalls prima che funzioni. Puoi fare, ad esempio, printf()
e il testo appare su una console? Che ne pensi di malloc()
? Se quelle e altre funzioni non funzionano, ti suggerisco di implementarle. Le chiamate di sistema di base che si aspetta newlib sono:
int _system (const char *);
int _rename (const char *, const char *);
int _isatty (int);
clock_t _times (struct tms *);
int _gettimeofday (struct timeval *, struct timezone *);
void _raise (void);
int _unlink (void);
int _link (void);
int _stat (const char *, struct stat *);
int _fstat (int, struct stat *);
caddr_t _sbrk (int);
int _getpid (int);
int _kill (int, int);
void _exit (int);
int _close (int);
int _open (const char *, int, ...);
int _write (int, char *, int);
int _lseek (int, int, int);
int _read (int, char *, int);
La maggior parte di questi possono essere stub, ma è necessario, per esempio, _write()
per printf() (e altre operazioni di scrittura), _read()
per le operazioni di lettura e _sbrk()
per malloc e altre funzioni di gestione della memoria. Vedere, ad esempio, http://wiki.osdev.org/Porting_Newlib per un'implementazione minima. Le tue definizioni di queste funzioni determineranno il funzionamento del database; se _write() invia un carattere alla UART, il tuo database non sarà molto utile.
Con la libreria standard funzionante, sqlite e altri database dovrebbero funzionare. Faranno cose come questa nel shell.c dalla fusione SQLite:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"
#include <ctype.h>
#include <stdarg.h>
#include <signal.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
Hai bisogno di qualche implementazione di quelli. Questo non richiede un sistema operativo. Con una libreria C, funzionerà, ma senza uno, sei da solo.
Vuoi approfondire cosa intendi non richiedere il sistema operativo modificando il tuo post originale? Suppongo che intendi che il database che cerchi saprebbe come eseguire il proprio accesso al disco. Ho ragione? – octopusgrabbus
Perché non vuoi creare il tuo sistema di database basato su file con file binari? Voglio dire, vuoi un database che supporti la sintassi SQL? E che tipo di dispositivo incorporato? Un semplice AVR/PIC/ARM o così? Quanto dovrebbe essere grande/piccolo? – DipSwitch
"Perché no?" Perché mentre è educativo, un primo tentativo rischia di essere povero rispetto ai motori db maturi su cui lavorano molti sviluppatori con esperienza in quell'area. Potrebbe anche perdere tempo. –