Serena是一种基于现代设计原理的实验操作系统,支持普遍的先发制人并发和多个用户。内核是面向对象的,设计为跨平台和未来的证明。它在安装68030或更高的CPU的Amiga系统上运行。
除了基于传统线程的OSS之外,它还设置了一个方面,它纯粹是围绕着派遣队列的构建,与苹果的Grand Central Dispatch有点相似。不支持在用户空间或内核空间中创建线程。相反,内核实现了一个虚拟处理器概念,它可以动态地管理虚拟处理器池。根据调度队列的需求自动调整池的大小,并根据需要将虚拟处理器分配给流程。所有内核和用户空间并发都是通过创建调度队列和提交工作项来派遣队列来实现的。从用户的角度来看,工作项仅仅是关闭(具有关联状态的函数)。
另一个有趣的方面是中断处理。想要对中断反应的代码可以在中断控制器中注册计数信号量,以便其要处理的中断。然后,中断控制器每次中断时都会发出信号信号。使用计数信号量确保对中断感兴趣的代码不会错过中断的发生。将中断转换为信号上的信号的优点是,中断处理代码在明确的上下文中执行,与任何其他类型的代码运行的上下文相同。它还使中断处理代码更加灵活性,因为它不必立即对中断做出反应。中断发生的信息永远不会丢失,无论中断处理程序代码是否在中断时都忙于其他事情。
内核通常是重新进入的。这意味着即使在内核内执行CPU时,虚拟处理器仍会继续安排,并且上下文进行了预先切换。此外,在内核内还提供了计数信号量,条件变量和锁定API的全面称赞。这些对象的API非常类似于您在传统操作系统的用户空间实现中发现的内容。
Serena实现了类似于POSIX的分层过程结构。一个过程可能会产生许多儿童过程,并且它可能会将命令行和环境变量传递给其子女。一个流程通过I/O频道访问I/O资源,与POSIX中的文件描述类似。
但是,POSIX样式过程模型与Serena模型之间存在两个显着的区别:首先,而不是使用fork(),然后是exec()产生一个新的过程,而是在Serena中使用一个名为Process_spawn()的单个函数。这使产卵的过程更快,易于误差。
其次,默认情况下,子进程不会继承其父母的文件描述符。唯一的例外是代表终端输入和输出流的文件描述符0、1和2。与POSIX模型相比,该模型容易发生的错误要小得多,POSIX模型必须谨慎地关闭文件描述符,而文件描述符不想在子过程产生孩子之前将其传递到子过程。在Unix的早期,当应用程序几乎自我包含,并且没有支持动态库时,这样做很容易。今天情况恰恰相反,因为应用程序更加复杂,并且取决于许多第三方库。
目前,可执行文件格式是Atari ST Gemdos文件格式,该格式相对于AOUT可执行格式是一个接近的。最终将用能够支持动态库的文件格式替换此文件格式。但是,目前已经足够了,可以完成工作。
内核实现Serenafs,这是一个具有权限和用户和组信息的分层文件系统。文件系统可以安装在另一个文件系统中的目录的顶部,以扩展文件名称空间。所有这些工作类似于它在POSIX系统中的工作方式。想要产生子进程的过程可以指定儿童进程应限制在全局文件系统名称空间的子树中。
启动文件系统当前基于RAM。 ROM包含一个磁盘映像,该磁盘图像是使用磁盘模拟工具创建的,并用作RAM磁盘的模板。此ROM磁盘图像在启动时被复制到RAM。
用户空间支持LIBC,LIBSYSTEM,LIBCLAP和LIBM的开始。 Libsystem是一个实现内核接口的用户空间端的库。 libclap是一个库,可实现命令行接口程序的参数解析。
Serena OS带有一个实现正式定义的外壳语言的外壳。您可以在此处找到Shell文档。
目前实施以下内核服务:
此时可用以下用户空间服务:
此时可用以下用户空间程序:
目前,各种模块的完整性和正确性水平都有很大不同。随着时间的流逝,事情通常是计划改善的:)
目前支持以下硬件:
为开发和运行操作系统设置项目有点涉及。下面的说明是针对Windows的,但它们应该在Linux和MacOS上工作几乎相同。
您需要的第一件事是Amiga计算机仿真器。我正在使用winuae,您可以从https://www.winuae.net/download下载它
下载wituae安装程序并运行它。这将使模拟器在启动驱动器上的“程序文件”目录中。
下载并安装构建操作系统所需的VBCC编译器和汇编程序。您可以在http://www.compilers.de/vbcc.html上找到项目主页,并在http://sun.hasenbraten.de/vbcc上找到工具的下载页面。
我用于开发的版本,我知道在Windows 11上正常工作的版本为0.9h。请确保添加一个名称为VBCC环境变量,该变量指向磁盘上的VBCC文件夹,然后将vbccbin文件夹添加到PATH环境变量。
请注意,您需要安装Microsoft Visual Studio和命令行工具,因为需要Microsoft C编译器来构建Windows上的构建工具。
最后,为Windows安装GNU Make Make,并确保它在PATH环境变量中。做到这一点的直接方法是在外壳窗口中执行以下winget命令: winget install GnuWin32.Make 。
您只需要在尝试构建操作系统之前和之前执行此步骤。此步骤的目的是构建建立内核和用户空间库所需的几个工具。您可以在此处找到这些工具的文档。
首先在Windows终端打开开发人员命令提示符,然后在Serena/Tools文件夹中CD打开CD。 make和点击返回。这将构建所有必需的工具,并将其放置在Serena/build/tools文件夹中。即使您对操作系统项目进行全面清洁,这些工具也将保留在此位置。
在Visual Studio代码中打开Serena Project文件夹,然后从Run Build Task...菜单中选择Build All 。这将构建内核,libsystem,libc,libm和shell,并在Serena/product/Kernel/ folder中生成一个Serena.rom文件。该ROM文件包含内核,用户空间库和外壳。
首先,如果还没有,则需要在Winuae中创建至少68030 CPU(即Amiga 3000或4000)的Amiga配置。做到这一点的最简单方法是转到Quickstart并选择A4000作为模型。然后转到硬件/ROM页面,然后更新“主ROM文件”文本字段,以指向磁盘上Serena/build/product/ folder内的Serena.rom文件。最后,通过转到硬件/RAM页面并将“慢”条目设置为1MB,最终将您的虚拟Amiga至少1MB快速RAM。保存此配置,以便下次您要运行操作系统时不必重新创建它。
加载配置,然后点击开始按钮,或者只需双击“配置”页面中的配置以运行OS。模拟器应打开显示引导消息的屏幕,然后打开一个shell提示。有关Shell支持的命令列表,请参见Shell页面。
根据MIT许可分发。有关更多信息,请参见LICENSE.txt 。
Dietmar Planitzer- @linkedin
项目链接:https://github.com/dplanitzer/serena