Koraos是从头开始编写和设计的操作系统。它是由发烧友开发人员作为爱好开发的。
该存储库包含Kora系统内核的代码。如果您想构建整个系统,请查看Koraos存储库。
我一直在尝试构建自己的内核。经过多次返工,休息和重新思考,我完全通过对设计的细致护理重新开始了一个。我的目标一直是构建计划,以实现他们应该做的事情,而不仅仅是通过强烈脱钩的架构,轻快而快速。
该软件仍然是一个年轻的小狗,但我希望很快能建立一个可靠的系统。它将提供现代系统的所有基础功能,并将在几个架构上移植(目标:X86,X86_64,ARM)。
互操作性:当我试图理解事物的制造方式时,以及为什么,我有时会遇到严格的POSIX或UNIX规格。我试图尽可能合规 - 在NT和Unix World上 - 但我授权自己采取不同的选择。
构建内核并不像构建常规应用程序,可能需要一些额外的工作。
存储库(与Kora的其他一样)包含接近标准的Makefile 。可以使用configure脚本,但仅是从另一个目录构建的,并且不是强制性的。此脚本仅用于搜索和持续构建选项。
这里有主要命令的列表:
make # Build the kernel for the host architecture
make check # Build and run unit-tests
make coverage # Run tests and coppute coverage
make install # Build and update the kernel (not yet)
make install-headers # Copy and erase kernelheaders to $(prefix)/include
# For cross-compile using 'i386-kora-gcc' compiler
make target=i386-pc-kora CROSS=i386-kora- CC=gcc
# Simpler using configure
/path/to/sources/configure --target=i386
make # No need to set target or cross.请记住,对于内核而言,它几乎总是交叉兼容。最常见的陷阱是试图在x86_64主机上构建i386内核。
默认情况下,它使用独立环境,但主机标头可能会引起一些问题。
在情况或错误上,它更喜欢使用“跨编译器”。
注意:请确保将所有包装安装到Binutils,GCC,Make and Git ,也是某些体系结构的组装程序(例如
i386和amd64的NASM 。
这里也是Makefile接受的一些变量以进行扩展配置:
VERBOSE=y :打印汇编命令QUIET=y :不要打印详细汇编步骤CFLAGS :向C编译器添加额外的标志NODEPS=y :不包括 *.d依赖项文件(默认为清洁或'obj'目录尚不存在)NOCOV=y :删除单位测试的覆盖范围选项kname=? :更改内核交付文件的名称构建后,如果您在这里变得肮脏,请考虑qemu和gdb进行调试和调查。
scripts/toolchain.sh (需要时间,没有日志)koraos/make/build_toolchain.sh (花费更多的时间)。 描述内核功能并不容易,因为大多数组件都是必需的,并且所有内核提供了大致相同的,但是所有这些功能的质量和行为都不同。
Koraos'kernel使用虚拟内存,并具有基本页面分配。它使用页面的正确回收,但没有交换可用。在英特尔体系结构上,制作了适当的CPU功能识别,但使用较差。内核已准备就绪(线程安全),但仍需要使用一些工作。
内核是多进程,多线程,但还不是多用户。可以创建任务是在内核上或用户空间中。可以从干净的板岩(窗口)或分叉(UNIX方式)创建新任务。
内核提供了多种类型的文件和设备:块设备,char设备,管道,目录(或音量),常规文件,视频流(表面,相机或屏幕),网络设备和套接字。 (请注意,文件类型与UNIX不同)。
所有这些文件和设备都可以通过具有良好缓存设施的进化VFS(虚拟文件系统)访问。
网络堆栈支持协议:以太网,ARP,IPv4,ICMP,DHCP,UDP,UDP,UDP, TCP,DNS和NTP 。内核提供了一个基本的DHCP客户端,该客户端允许自动IP配置。
不完整的部分
由于该系统尚未完全功能,因此我的大多数测试都是使用内核线程完成的,但是在这里进行了一些工作系统调用 - 尚未最终确定:
/* --------
Tasks, Process & Sessions
--------- */
long sys_stop ( unsigned tid , int status );
long sys_sleep ( long timeout );
/* --------
Input & Output
--------- */
long sys_read ( int fd , char * buf , int len );
long sys_write ( int fd , const char * buf , int len );
long sys_open ( int fd , const char * path , int flags );
long sys_close ( int fd );
/* --------
File system
--------- */
int sys_pipe ( int * fds );
int sys_window ( int width , int height , unsigned features , unsigned evmask );
/* --------
Network
--------- */
int sys_socket ( int protocol , const char * address , int port );
/* --------
Memory
--------- */
void * sys_mmap ( void * address , size_t length , int fd , off_t off , unsigned flags );
long sys_munmap ( void * address , size_t length );
long sys_mprotect ( void * address , size_t length , unsigned flags );
/* --------
Signals
--------- */
/* --------
System
--------- */
long sys_ginfo ( unsigned info , void * buf , int len );
long sys_sinfo ( unsigned info , const void * buf , int len );
long sys_log ( const char * msg );目标位不是当前文件
kernel/types.h :参考基本类型和声明不透明结构。kernel/utils.h :提供基本的运行时,例如分配,字符串和时间。kernel/core.h :提供对核心结构kSYS和kCPU访问。kernel/syscalls.h例程列表为sys_* 。kernel/io.h和DMA的接口。kernel/{...}.h :提供内核核心模块的API(任务,内存,VFS ...)。kernel/net/{...}.h :网络协议的API(LO,ETH,IP4)。kernel/bus/{...}.h提供商(PCI或USB)的API。 一旦我可以运行基本程序登录,桌面,克里什,文件夹和lua,我就计划了0.1版,并且至少具有一个完整的可写文件系统(例如VFAT或EXT2)。