构建OSKit

2020-09-22 15:39:13

早在90年代末,犹他大学(University Of Utah)就有一个奇妙的项目,它承诺将操作系统的构建带给普通人,但将现有的PC操作系统,Linux,NetBSD,FreeBSD分解成最好的组件,然后使用COM将它们相互连接起来,让你像乐高一样将最好的部分粘合在一起。

对于在当时还不为人所知的东西来说,创建所谓的“裸机程序”是非常棒的,这些程序没有真正的操作系统,但可以使用像LIBC或ext2文件系统这样的操作功能。这几乎是“MS-DOS”级别的保护模式的感觉,但可以随身携带更多的东西。

#include<;stdio.h>;#include<;oskit/clientos.h>;#include<;oskit/Startup.h>;#include<;oskit/version.h>;int main(){#ifndef nit oskit_clientos_init();#endif#ifdef GPROF start_fs_bmod();start_gprof();#endif oskit_print_version();printf(";Hello,World\n&34;);return 0;}。

I586-linux-GCC-c-o hello.o-DOSKIT-MD-DHAVE_CONFIG_H-DOSKIT_X86-DOSKIT_X86_PC-DINDIRECT_OSENV=1-I。-i../../Examples/x86-i../../Examples/x86/more-i../../Examples/x86/Shared-i--i../../oskit/c-i../../Examples/x86/Shared-i../..。-我../..。-nostdinc-wall-o2-g hello.ci586-linux-ld-ttext 100000-L../../lib\-o hello../../lib/multiboot.o hello.o\-loskit_clientos-loskit_kern-loskit_lmm\-loskit_c../../lib/crtn.o。

我有点惊讶,它从来没有真正起飞,也许它太超前了。我见过的使用它的最著名的项目是OSKit-Mach,尽管他们后来放弃了OSKit。我不知道为什么,但我怀疑2002年后没有更新可能与此有关。

建造这座建筑的人是…。有趣的是,我记得这有点困难,我知道我可能让它变得更难了,但我认为使用当时的工具会很“有趣”。1999年我们的版本是Debian 2.2r0。谢天谢地,它在Archive.org上,只有3张i386二进制文件的CD-ROM。将其安装到VMWare中并不是那么困难,并且交换周围的CD映像使我能够安装足够的软件来开始构建。对于那些不想安装Debian的人,这里是我在Linux上预编译的Linux工具链:i586-linux2.tar.gz。它是i386上的i386,所以你需要能够运行i386ELF exe。对于没有安装Catalina的OS X用户,你可以试试osx-linux-2.00-i586-gc2723.tar.gz。

我应该指出的是,虽然老版本的OSKit必须打补丁,但20020317使用Debian2.2r0中的GCC 2.95.2(20000220)构建得很好。因此,如果您想要构建VM,那么您真的不需要任何这些。但是我很奇怪,我有我的WSL2Debian10要考虑。所以构建GCC 2.x最简单的方法就是使用GCC 2.x,那么为什么不从Debian开始呢?

首先,让我们准备我们的目标目录,并像一个很好的小交叉编译器一样填充它:

Rm-rf/usr/local/i586-linux2mkdir-p/usr/local/i586-linux/include(cd/usr/include;tar-cf-.)|(cd/usr/local/i586-linux2/i586-linux/include;Tar-xf-)mkdir-p/usr/local/i586-linux2/lib/gcc-lib/i586-linux/2.7.2.3/cp/usr/lib/crt*.o/usr/local/i586-linux2/lib/gcc-lib/i586-linux/2.7.2.3/mkdir-p/usr/LOCAL/i586-linux2/i586-linux/libcp/usr/lib/*.a/usr/local/i586-linux2/i586-linux/lib。

这样,我们就可以构建旧的OSKit归档上的“修补的”binutils,我使用的是binutils-990818-patched.tar.gz。

接下来,我将构建OSKit提到的GCC 2.7.2.3,我想为什么不是最后一行呢?我觉得这是个好主意。

构建有点奇怪,因为我首先构建libgcc1.a,然后只构建C语言,然后安装它。OSKit是用C编写的,我甚至不想查看C++/ObjectiveC的依赖项。

Unix人,我不是一个伟大的人,所以快速破解一下让新的GCC走上正轨:

现在我可以造东西了!…。然后我压缩了if并将其复制到我的WSL实例中,现在我可以很好地交叉编译(WSL2的一大优点是您可以安装32位支持,并运行旧的EXE!)。拿着那个苹果!)。

现在值得注意的是,有几个东西需要编辑,‘OSKit on UNIX’的东西不会干净地构建,我没有调查,因为QEMU现在是一个东西。因此,请在modes.x86.pc文件中禁用它。然后运行Configure,如下所示:

尽管使用了主机、构建或目标设置,但它不会提取交叉编译器的前缀,因此您必须手动编辑Makeconf

Export CC=i586-linux-gccexport LD=i586-linux-ldexport strie=i586-linux-stripexport AR=i586-linux-arexport RANLIB=i586-linux-ranlibexport OBJCOPY=i586-linux-objcopy export NM=i586-linux-nm。

额外的好处是,它可以在一台现代机器上构建不到一分钟。

如上所述,您现在应该能够使用hello world示例内核,并将其转换为多引导,然后通过GRUB引导它。

再说一次,这是一个如此激动人心的项目,我不希望它突然在绝对默默无闻中夭折。也许它会激励其他人尝试“辅助裸机”程序,在那个时代,除了其他操作系统之外,还有一个厄运操作系统。