2.2 运行

Loko Scheme 既可以在现有操作系统内核下运行 (目前支持 Linux 和 NetBSD),也可以在硬件虚拟机下运行, 或者直接在裸硬件上运行。

2.2.1 在 Linux 或 NetBSD 下运行

loko 二进制文件是一个静态链接的 ELF 二进制文件, 内核可以直接加载。

Loko 不带有内置的行编辑器。在运行 Loko 时 使用 rlwrap 会很方便:rlwrap loko。rlwrap 程序为 任何程序添加 readline 功能,提供行编辑和历史记录。

Loko 使用环境变量 LOKO_LIBRARY_PATH 来查找 库。这是一个冒号分隔的目录列表。如果你 使用包管理器 Akku,那么在激活项目环境时 此变量会被设置。默认的文件扩展名列表 是 .loko.sls、.sls 和 .sld。可以通过 设置 LOKO_LIBRARY_FILE_EXTENSIONS 来更改它们。

R6RS 顶层程序可以从命令行通过 loko --program program.sps 来运行。

loko 二进制文件也可以以 scheme-script 的名称 安装。如果以此名称调用,它将加载一个 Scheme 脚本, 如 R6RS 非规范性附录所述。通常 这样使用:

#!/usr/bin/env scheme-script
(import (rnrs))
(display "Hello, world!\n")

通过将这样的文件标记为可执行,系统会将其交给 scheme-script,然后将其作为 Scheme 顶层 程序运行。但 scheme-script 这个名称通常由 alternatives 系统处理,因此可能是另一个 Scheme 运行该脚本。

此类脚本也可以编译为可以直接运行的静态二进制文件。 See 编译程序。

2.2.2 在虚拟机内运行

Loko 可以在虚拟机内运行(例如 KVM、QEMU 等),前提是 "硬件"支持对齐检查。如果你看到类似 "……系统不支持 #AC"的消息,则说明不支持。

你的模拟器可能仍然通过命令行选项以不明显的方式 提供此功能。例如,QEMU(在 Windows 主机上)需要以下选项:

qemu-system-x86_64.exe -accel whpx ...

对于高级用例,也可以在串行端口上获得 repl:

qemu-system-x86_64 -enable-kvm -kernel loko -m 1024 -serial stdio

没有回显或行编辑,但作为 Emacs 的 Inferior Scheme 运行良好。你也可以尝试 rlwrap -a。

如果你使用此命令创建一个脚本,那么可以轻松地将其作为 例如 Emacs 中的"Inferior Scheme"运行。还有一些你可以 尝试的附加选项:

有关更多示例,请参阅源代码发行版中的 samples 目录。

2.2.3 在裸金属上运行

裸金属上的 Loko 还没有一个足够的用户界面。 在引导期间,文本控制台上有基本的日志输出。这 可以被重定向,see 调试日志。

第一个用户进程将附加到 COM1 串行端口 (115200, 8n1)。这足以用于开发,直到有 网络支持为止。loko 程序的第一个进程是一个 repl, 但如果你编译了一个程序,那么它将是你的顶层程序。

loko 二进制文件应该适用于任何 Multiboot 引导加载器, 例如 GRUB 2。请参阅下面的菜单项示例。

2.2.3.1 网络引导

如果你的硬件支持,可以进行网络引导。它已经 在 GRUB 2 上测试过,也应该可以在 PXELINUX 上使用。

你需要在网络的 DHCP 服务器中添加一个条目, 并且需要一台可以安装 TFTP 服务器(如 tftpd-hpa)的计算机。

  • 安装 TFTP 服务器后,使用 GRUB 创建一个网络目录:
    grub-mknetdir --net-directory /tftpboot
    

    TFTP 服务器可能提供另一个目录,例如 /srv/tftp。

  • 在 /tftpboot/boot/grub/grub.cfg 中创建一个配置, 包含一个 Loko 条目,如下所示:
    menuentry "Loko Scheme" {
      multiboot  /loko loko
    }
    

    你还可以包含将在 /boot 中可用的文件:

    menuentry "Loko Scheme with foo library" {
      multiboot  /loko loko LOKO_LIBRARY_PATH=/boot
      module     /foo.sls foo.sls
    }
    

    或者在解释器中启动一个程序:

    menuentry "Hello world" {
      multiboot  /loko loko -- --program /boot/hello.sps
      module     /hello.sps hello.sps
    }
    
  • 将 Loko 二进制文件复制到 /tftpboot 目录。
  • 在 DHCP 服务器中添加一个条目。如果你使用 ISC dhcpd,它可以像这样:
    host darkstar {
      hardware ethernet 00:11:22:33:44:55;
      filename "boot/grub/i386-pc/core.0";
      next-server 192.168.0.2;
    }
    

    硬件地址必须更改为用于网络引导的接口的 MAC 地址(将运行 Loko 的机器)。服务器地址 是 TFTP 服务器的地址。

2.2.4 在 Docker 中运行

Loko 可以在 Docker 容器中运行。有时不需要在 容器中提供任何其他文件;Loko Scheme 是 自给自足的。

提供了以下 Docker 镜像: