如何在树莓派 Pico 上使用 Unix:FUZIX

FUZIX 由英国计算机科学家 Alan Cox 创建,是用于小型计算机的轻量级 Unix 操作系统。其最初是为 8 位 Zilog Z80 处理器编写的。

David Given 已将 FUZIX 移植到各种架构上,并于近期发布了树莓派 Pico 的 RP2040 微型芯片的端口。

Given 将 Fuzix 描述为「老式的 Unix 克隆」。 「它将在很小的空间中运行,同时还可以扩展到具有合理数量的RAM(例如兆字节)的计算机,同时还提供了一个相当不错的老式 Unix 环境,它具有多个进程,经典的 Bourne shell 等等。」

FUZIX 仅使用树莓派 Pico 的一个内核,并运行用户可执行文件使用 64KB 的代码和数据、最多 15 个进程、Unix 文件系统、SD 卡支持以及树莓派 Pico 的 UART0 上的串行控制台。

下面介绍如何在树莓派或另一台基于 Linux 的计算机上,让树莓派 Pico 用上 FUZIX。

从源码编译 FUZIX

编译 FUZIX 并不复杂。如果你还没有准备好树莓派 Pico 的工具链,请通过在终端运行下面的命令来安装。

如果 wget 还没有安装,请执行 sudo apt install wget 命令。然后下载安装脚本,执行。

wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh chmod +x pico_setup.sh ./pico_setup.sh

然后从 FUZIX 仓库获取源码。

git clone https://github.com/davidgiven/FUZIX.git cd FUZIX git checkout rpipico cd Kernel/platform-rpipico/

修改 Makefile 的第一行,设置为 pico-sdk 的路径。例如:

export PICO_SDK_PATH = /home/pi/pico/pico-sdk

然后就可以编译 FUZIX UF2 文件和 root 文件系统了。

make world -j ./update-flash.sh

如果一切顺利,在 build/fuzix.uf2 中会出现 UF2 文件,在当前工作目录中有一个 filesystem.img 文件。

现在,您可以按常规方式将 UF2 文件上传到 Pico 上,参考 https://pico.org.cn/ 。

1、按住 BOOTSEL 按钮,然后将 Pico 插入树莓派或 PC 的 USB 接口。

2、Pico 会被识别为大容量存储设备。

3、将下载的 UF2 文件放入 RPI-RP2 卷上。

该卷将自动卸载,树莓派 Pico 就已经开始运行 Unix 了。

创建可引导启动的 SD 卡

上面所得到的 filesystem.img 镜像文件并不具备引导启动的能力。下面将介绍在树莓派或其他类似的 Linux 平台上构建文件系统的方法。

先找一张 microSD 卡,由于我们只需要 34MB,所以几乎是随便找一张什么容量的都可以。这里使用了一张 4GB 的卡。插入读卡器,再通过 USB 插到 PC 上。构建 FUZIX 所需的分区表。这包含两个分区:

1、2MB 的交换分区

2、32MB 的根分区(将根文件系统,即 filesystem.img 复制进去)

使用 lsblk 命令,如果你有空白的未格式化的卡,会显示为 /dev/sda。

$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 3.7G 0 disk mmcblk0 179:0 0 14.9G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.6G 0 part / $

如果是格式化过的卡,则会是下面这样子。

$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 3.7G 0 disk └─sda1 8:1 1 3.7G 0 part /media/pi/USB mmcblk0 179:0 0 14.9G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.6G 0 part / $

上面 /media/pi/USB 所挂载的就是 FAT 格式的 SD 卡的 MBR 分区。

要卸载 SD 卡直接使用命令卸载。

$ umount /dev/sda1

然后使用 lsblk 命令会成这个样子。

$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 3.7G 0 disk └─sda1 8:1 1 3.7G 0 part mmcblk0 179:0 0 14.9G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.6G 0 part / $

此时,我们可以通过将卡的第一部分清零并删除「磁盘起始(start of disk)」结构来删除当前分区表。

$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1

之后再次运行 lsblk,将会看到 sda1 分区已被删除。接下来,我们将使用 fdisk 创建一个新的分区表。输入以下内容:

$ sudo fdisk /dev/sda

进入 fdisk 提示符。然后键入 o 以创建新的 DOS 磁盘卷标。

Command (m for help): o Created a new DOS disklabel with disk identifier 0x6e8481a2.

键入 n 创建新分区。

Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-7744511, default 2048): 2048 Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-7744511, default 7744511): +2M Created a new partition 1 of type ‘Linux’ and of size 2 MiB.

根据磁盘的初始状态,系统可能会提示分区包含 vfat 签名。如果询问,按 Y 确认即可。

下面我们将该分区类型设置为 7F。

Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 7F Changed type of partition ‘Linux’ to ‘unknown’.

创建 2MB 的交换分区。

下面创建第二个分区,32MB 的根文件系统。

Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): 2 First sector (6144-7744511, default 6144): 6144 Last sector, +/-sectors or +/-size{K,M,G,T,P} (6144-7744511, default 7744511): +32M Created a new partition 2 of type ‘Linux’ and of size 32 MiB.

然后在 fdisk 提示符下键入 p 。

Command (m for help): p Disk /dev/sda: 3.7 GiB, 3965190144 bytes, 7744512 sectors Disk model: STORAGE DEVICE Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe121b9a3 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 6143 4096 2M 7f unknown /dev/sda2 6144 71679 65536 32M 83 Linux

键入 w 写入并保存分区表。

最后,将 filesystem.img 文件复制到 32MB 的分区中。

$ sudo dd if=filesystem.img of=/dev/sda2 65535+0 records in 65535+0 records out 33553920 bytes (34 MB, 32 MiB) copied, 14.1064 s, 2.4 MB/s $

是时候弹出 SD 卡,连接面包板了!

在面包板上接线

如果你是在树莓派上开发,并且之前没有试用过在树莓派上使用 UART 串口,请参考入门指南的第 4.5 节操作。

按照图上所示,连接树莓派、树莓派 Pico、SD 卡模块。

如果你是在笔记本电脑上开发,则可以使用 SparkFun FTDI Basic Breakout 之类的模块将 UART 串口连接到计算机。

无论是哪种方式,树莓派 Pico 上的引脚和 SD 卡模块的引脚对应关系都是一样的,如下:

接好之后,将格式化了的 microSD 卡弹出,插到 SD 卡模块上。然后将树莓派 Pico 通电,FUZIX 就会自动启动了。

连接到 FUZIX

如果你使用树莓派连接 Pico,需要先启用 UART 串行通信。

$ sudo raspi-config

依次选择 Interfacing Options → Serial,出现 “Would you like a login shell to be accessible over serial?” 选择 “No”,然后 “Would you like the serial port hardware to be enabled?” 选择 “Yes”。

退出 raspi-config 时你需要选择 “Yes” 并重启树莓派。

你还可以使用 minicom 连接到 FUZIX:

$ sudo apt install minicom $ minicom -b 115200 -o -D /dev/serial0

如果你使用 macOS 或者 Windows,你可以用 minicom、screen 或者常用的终端程序。

如果这时候你没有看到任何输出,请拔下树莓派 Pico 并重新插入即可。

最后,输入日期和时间,当出现登录提示时,请以 root 身份登录而无需输入密码。开始你的 FUZIX 探索之旅吧!