The Unix Heritage Society mailing list
 help / color / mirror / Atom feed
* [TUHS] Re: UNIX "Machine Layer" Standards
@ 2023-04-20 15:57 Paul Ruizendaal
  2023-04-20 18:57 ` segaloco via TUHS
  0 siblings, 1 reply; 9+ messages in thread
From: Paul Ruizendaal @ 2023-04-20 15:57 UTC (permalink / raw)
  To: tuhs

Hi Matt,

I’ve responded on list about the early unix development process as I understand it, but I want to avoid discussing things that are not directly related to the history of Unix. Hence this PM as well.
 
> Where I'm trying to put this sort of knowledge into use is I'm starting to spec out a kernel bootstrap for the RPi Pico and Pine64 Ox64 boards (ARM32 and RISCV64 respectively) that is not only sufficient to start a V7-ish kernel on each, but that are ultimately based on the same design, varying literally only where the hardware strictly necessitates it, but similar enough that reading the two assembly files side by side yields essentially the exact same discrete operations.

I have a similar interest, working with early Unix and modern RiscV hardware for a compare and contrast experience.

- My development targets are (i) an FPGA based RV32 SoC implementation, (ii) a Sipeed D1 RV64GC board and shortly (iii) a Pine64 Pinetab-V.

- My software targets are: (a) xv6-rv, (b) SysIII, (c) Linux, (d) experiments around SysIII

Linux is for me a secondary target, just for comparison and to see if ideas are “Linux capable”. I’m not overly interested in Arm at the moment.


My ideas are still evolving, but currently more or less along the below lines:

- Boot rom loads SPL, this is custom in each case and set by the SoC's designers.

- SPL initialises DRAM system and loads next stage. Unfortunately, this too would seem to be quite system specific, but the BSP should provide the baseline for this. As BSP’s are often a mess, milage may vary.

- The next stage is a hybrid of BBL, OpenSBI and Virtio. The idea is to provide a standard abstraction layer that all of my software targets can work with. This idea is used for the FPGA target and allows booting a Linux kernel with just the generic Virtio device drivers (so far just disk and console).

- The last layer is the classical OS layer. If I get it right, each OS can run on all h/w targets without customisation.

At the moment I’m playing with USB, and how that might layer into the structure of V7, SysIII or 8th Edition -- and also the above.









^ permalink raw reply	[flat|nested] 9+ messages in thread
* [TUHS] Re: UNIX "Machine Layer" Standards
@ 2023-04-21 14:37 Noel Chiappa
  2023-04-21 17:58 ` John Cowan
  0 siblings, 1 reply; 9+ messages in thread
From: Noel Chiappa @ 2023-04-21 14:37 UTC (permalink / raw)
  To: tuhs; +Cc: jnc

    > From: Paul Ruizendaal

    > something like a boot rom only became the norm in the late
    > 70's. Before that, one keyed in two dozen words with a tiny program to
    > load the first boot stage.

A little wrong on that date. Even the PDP-11/20 (the first -11) had a boot
ROM:

  https://gunkies.org/wiki/BM792_ROM

which appreared in mid-1971 (about a year after the release of the /20). DEC
sold them pre-programmed, but one could 'program' one onself, if one wanted -
with a soldering iron! (Check out the image! I actually did that to one that
I was given, that had been eviscerated by someone.) From then on (follow the
category link), the rest used PROM chips.

  
    > From: Warner Losh

    > Oftentimes, the interrupt vector was in the lowest core addresses

It's worth remembering that in the early period, that restriction to low
addresses was built into the hardware (in an amusing way :-).

Take the DL11:

  https://gunkies.org/wiki/DL11_asynchronous_serial_line_interface

which was sort of mandatory as the 'console' serial interface on most early
-11's (until the DL11-W appeared; more on its big improvement in a second).
It set the interrupt vector with _jumpers_. (You want to change the interrupt
vector? Dig out your soldering iron! :-) There were only 6 jumpers - one each
for address bits 3 through 8. So the largest vector you could set was 0770.

The DL11-W was a big step forward - it replaced the jumpers with a DIP
switch! :-) Still only six bits, though. :-)

	Noel

^ permalink raw reply	[flat|nested] 9+ messages in thread
* [TUHS] Re: UNIX "Machine Layer" Standards
@ 2023-04-20 14:56 Paul Ruizendaal
  2023-04-20 16:04 ` Warner Losh
  0 siblings, 1 reply; 9+ messages in thread
From: Paul Ruizendaal @ 2023-04-20 14:56 UTC (permalink / raw)
  To: tuhs


> Date: Mon, 10 Apr 2023 18:27:51 +0000
> From: segaloco

> ... or was there no single guiding principle and each machine came up, at that level at least, in a relative vacuum, with only the machine interface to UNIX being the guiding principle?

I stumbled into the same question last year, when doing my SysIII to RV64 port. I managed to turn that into a somewhat chaotic discussion, mixing old and new, and history with ideas. From that chaotic discussion I got the impression that it was indeed mostly ad hoc. In context, hardware was much easier to boot and drive back then -- it probably was not seen as complex enough to warrant much research into layering and abstraction.

Also bear in mind that something like a boot rom only became the norm in the late 70’s. Before that, one keyed in two dozen words with a tiny program to load the first boot stage.

That said, there is an implicit layering in v7 and beyond:

- “low.s" does hardware setup, incl. such stuff as setting up interrupt tables. As this is closely tied to the hardware, it would have been a custom job in each case.

- “mch.s” (later also mch.c) has the basic routines that are hardware dependent (switching stacks, changing priority levels and modes, etc.). It also has emulation for ‘missing’ instructions, such as floating point ops where this is not available in hardware. Same as above, I think. Maybe h/w related memory protection operations should live here as well, but the hardware was still quite divergent in this area in the 70’s and early 80’s.

- low-level device drivers live in the ‘dmr’ or (later) ‘io’ directory. Here there is some standardisation, as all device drivers must conform to the (char/block) device switch APIs. It seems to me that most of these drivers were written by taking one that was similar to what needed to be written and to start from there. Maybe this is still how it works in Linux today.

- To the extent that there is such a thing as 'high-level device drivers’ in early Unix, the structure is less clearly visible. The file system (and there was only one at the time of v7) is placed between the block device switch and the mount table so to speak. This was structured enough that splicing in other file systems seems to have been fairly easy in the early 80’s (the splicing in, not the writing of the file system itself, of course). Starting with 8th edition, the ‘file system switch’ created a clear API for multiple file systems. Arguably, the ‘tty’ subsystem is also a ‘high-level device driver’, but this one lives as custom code together with the serial port device drivers. Also in 8th Edition, ‘streams' were introduced. One could think of this as a structured approach to high-level device drivers for character mode devices, incl. the ’tty’ subsystem.

- I don’t think there was ever anything in early Unix that merged ’streams’ and the 'file system switch' into a single abstraction (but maybe 9P did?).


> Where I'm trying to put this sort of knowledge into use is I'm starting to spec out a kernel bootstrap for the RPi Pico and Pine64 Ox64 boards (ARM32 and RISCV64 respectively) that is not only sufficient to start a V7-ish kernel on each, but that are ultimately based on the same design, varying literally only where the hardware strictly necessitates it, but similar enough that reading the two assembly files side by side yields essentially the exact same discrete operations.

I have a similar interest, but to avoid the same chaos as I created before, I’ll respond to this with a pm.





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-04-21 20:36 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-20 15:57 [TUHS] Re: UNIX "Machine Layer" Standards Paul Ruizendaal
2023-04-20 18:57 ` segaloco via TUHS
2023-04-20 20:18   ` Steve Nickolas
  -- strict thread matches above, loose matches on Subject: below --
2023-04-21 14:37 Noel Chiappa
2023-04-21 17:58 ` John Cowan
2023-04-21 20:36   ` Clem Cole
2023-04-20 14:56 Paul Ruizendaal
2023-04-20 16:04 ` Warner Losh
2023-04-20 19:04   ` segaloco via TUHS

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).