2012-07-12 151 views
6

是否有任何数据库不需要操作系统来执行操作?如果是,请提供详细信息,如大小或链接的详细信息。嵌入式系统无需操作系统的数据库

编程语言为C.

嵌入式系统编程需要。

+0

您是否会通过编辑原始文章详细说明您的意思是不需要操作系统?我假设你的意思是你所寻找的数据库会知道如何执行自己的磁盘访问。我对么? – octopusgrabbus 2012-07-12 13:59:03

+1

为什么你不想用二进制文件制作自己的基于文件的数据库系统?我的意思是,你想要一个支持SQL语法的数据库?以及什么样的嵌入式设备?一个简单的AVR/PIC/ARM左右?它应该有多大/小的占地面积? – DipSwitch 2012-07-12 14:03:23

+1

“为什么不呢?”因为在受教育的情况下,与具有该领域经验的多个开发人员一起工作的成熟数据库引擎相比,第一次尝试可能会很差。这也可能浪费时间。 – 2012-07-12 14:10:03

回答

3

那么,这取决于你如何定义'操作系统'。

  • 如果将其定义为具有在x86硬件上运行的GUI的东西;当然;大多数数据库在其他系统上运行得很好。
  • 如果您将其定义为实现POSIX规范或以其他方式允许线程或进程运行并提供安全措施的东西,那么您将会失去一些需要多线程操作的东西,但是您仍然可以正常运行;有很多选择。
  • 如果您将其定义为根本没有任何文件操作的东西,并且没有实现很多C标准库,那么您几乎不走运。

您的基于ARM的设备几乎可以肯定有一个随工具链一起提供的C标准库。 Newlib是深度嵌入式系统的热门选择;它是默认包含在例如免费的CodeSourcery和YARTGO工具链中的。但是,在这之前你需要实现一些系统调用。你可以做,例如,printf()并且文本出现在控制台上吗? malloc()怎么样?如果这些功能和其他功能不起作用,我建议您实施它们。基本的系统调用是Newlib预计有:

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); 

大多数的这些都可以存根,但是你需要,例如,_write()用于printf()的(和其他写操作),_read()用于读取操作,并_sbrk()为的malloc和其他内存管理功能。例如,请参阅http://wiki.osdev.org/Porting_Newlib以获得最低限度的实施。您对这些函数的定义将决定数据库的工作方式;如果_write()向UART发送一个字符,那么你的数据库将不会非常有用。

随着标准库的工作,sqlite和其他数据库应该工作。他们会从sqlite的合并做这样的事情在shell.c:

#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> 

您需要的一些执行情况。这不需要操作系统。有了C库,它可以工作,但没有一个,你自己。