During the past year I’ve worked on and off on porting
Sys III. My
approach to studying ancient Unix is to port it to a new system, as
that forces one to consider many of the design trade-offs in a code
base. For 16 bit Unix I used the TI990 as a target, for the 1980-1985
period I was thinking about a 68030 based board. However, in the end
using a Riscv based target seemed more interesting and that is what I
used (more specifically the 64-bit Allwinner D1 chip, for which
several cheap boards are available, along with Fabrice Ballard’s
TinyEMU for simulation).
In general, my approach was to first select a toolchain and I settled
on the Plan9 compiler suite, with the Riscv backend as done by Richard
Miller, used together with a library that enabled using this tool
chain on modern Unix. This I then used to port the educational XV6
system to the D1 chip, building on work done by Michael Engel. From
there I ported the SysIII kernel (reusing some bits of XV6 memory
code), initially using the XV6 user land. From there I went on to port
the original SysIII user land. Much to my surprise, the original
SysIII code can support the Plan 9 tool chain, just a dozen standard
libc routines needed to be added to give this SysIII port a native
compiler.
There is a lot to report, and I will split it over several posts
covering different aspects. I hope that this will not be perceived as
spamming this list. The topics are:
1. Riscv, Plan-9 and a toolchain
2. Porting the SysIII kernel: first steps & memory management
3. Porting the SysIII kernel: boot, config & device drivers
4. A few comments on porting the Bourne shell
5. Xv6, Linux and SysIII on a RV32 FPGA system
For those who just want to see the results, the tool chain is here:
Begin forwarded message:
*From: *Paul Ruizendaal <pnr(a)planet.nl <mailto:pnr@planet.nl>>
*Subject: **Early Unix on (64-bit) Risc-V*
*Date: *December 22, 2022 at 11:55:04 AM GMT+1
*To: *The Eunuchs Hysterical Society <tuhs(a)tuhs.org
<mailto:tuhs@tuhs.org>>
*Cc: *athornton(a)gmail.com <mailto:athornton@gmail.com>,
davida(a)pobox.com <mailto:davida@pobox.com>, luther(a)makerlisp.com
<mailto:luther@makerlisp.com>
Adam Thorton wrote:
I mean all I really want for Christmas is a
64-bit v7 with TCP/IP
support, a screen editor, and SMP support.
The third one is a solved problem. The second one would not be that
hard to adapt, say, uIP 0.9, to v7. That first one would require
some work with C type sizes, but getting larger is easier than the
reverse. It's that last one.
Having said that...maybe what I really want is 64-bit 4.3 BSD?
I mean, just a Unix, without all the cruft of a modern Linux, but
which can actually take advantage of the resources of a modern
machine. I don't care about a desktop, or even a graphical
environment, I don't care about all the strange syscalls that are
there to support particular databases, I don't care much about being
a virtualization host.
Luther Johnson wrote:
I'm in the process of building a system like
that for myself, but
perhaps a little smaller - mine will be based on an embedded
microprocessor I've developed (so much work still yet to do ! at
least a
year out).
Earlier this year I ported VAX System III to Risc-V, to a simple
Allwinner D1 based SBC. This is RV64GC. Just ported to the console
terminal.
It turned out that porting Sys III to 64 bit was surprisingly easy,
most of the kernel and user land appears to be 64 bit clean. It helps
that I am using a LLP64 compiler, though. Apart from networking Sys
III also feels surprisingly modern (for an ancient Unix) - its should
get more attention than it does. The hardest work was in porting the
VAX memory code to Risc-V page tables (and to a lesser extent,
updating libc for the different FP formats).
The code is currently in an ugly state (with debug stuff in
commented-out blocks, a mix of ansi and K&R styles, an incoherent
kludgy build system, etc.) and the shame stopped me from putting it
out on gitlab until I found enough time to clean this up. As there
seems to be some interest now, I’ll put it up anyway in the next week
or so. There you go Adam, half your wish comes true.
The kernel is about 60KB and most binaries are quite close in size to
the VAX equivalents.
My next goals for it are to re-implement the Reiser demand paging (I
think I have a good enough view of how that worked, but the proof of
the pudding will be in the eating), and to add TCP/IP networking,
probably the BBN stack. Making it work on RV32 and exploring early
SMP work is also on my interest list.
===
David Arnold wrote:
I think xv6 does SMP? (param.h says NCPU = 8, at
least).
You’d need to add a network stack and a userland, but there are
options for those …
For the above, making xv6 work on the D1 board was my first stepping
stone, to proof the tool chain and to get the basics right (hardware
init, low-level I/O, etc.).
As an educational tool, I am sure that xv6 hits all the right spots,
and it certainly does SMP (the D1 is single hart, so I have not tried
that myself). I like it a lot in that context. However, as a simple
Unix it is useless: from a user-land view it is less capable than
LSX. At minimum it needs fixes to make the file system less constrained.
In my view, for SMP Keith Kelleman’s work for Sys-V is probably a
better place to start.