I was looking for a source of good stuff to import into my Bugzilla "quips" database, and a lot of these UNIX'y "fortune" entries would make great grist for that mill.
https://github.com/memnoth/unix-v6/blob/master/sys/ken/nami....
https://github.com/memnoth/unix-v6/blob/master/sys/param.h#L...
i guess this 'edition zero' is from 01971, and 6th edition is 01975
1971 saw the port to the PDP-11/20, which was released as UNIX-11 and soon after, V1 UNIX.
Newly discovered earliest draft of a Unix manual (1971) - https://news.ycombinator.com/item?id=10794189 - Dec 2015 (40 comments)
The Unix Time-Sharing System, unpublished draft (1971) [pdf] - https://news.ycombinator.com/item?id=10660727 - Dec 2015 (1 comment)
main differences seem to be
- filenames were only 8 bytes instead of 14 or 255
- devices were in the root directory instead of /dev: /ppt, /bppt, /rppt, /tty, /ctty, /tty1, /tty2, /rtty, /tap0, /tap1 (magtapes), /disk (the disk), and /system (the kernel memory)
- there were no groups, just six permission bits (u+r, u+w, o+r, o+w, a+x, and u+s)
- creat is spelled with an e (and evidently you couldn't open() nonexistent files)
- instead of lseek you only have seek, with a different argument order and presumably only able to handle offsets of up to 64KiB (less of a problem on a "256K word disk", which is presumably 524288 bytes, according to the note on p. 12 that a 64-word block was 128 bytes), which explains the name of lseek
- correspondingly, there were no doubly indirect blocks and so the maximum file size actually was 64 KiB
- the tty really was a tty, no video terminals!
- "i-number" and "i-node" had hyphens, and the "i" stood for "identification"
- the shell prompt was "@", and there was no control flow or pipes in the shell; it's not mentioned but I think that around this time there was a `goto` command which would seek standard input until it found the specified label before returning control to the shell. i/o redirection did exist, and so did argument quoting
- `cd` was spelled `chdir` even in the shell, and was the only shell builtin
- correspondingly, no standard error yet; the famous phototypesetter error printout had not yet happened because there were no pipes
- no shell wildcards
- no PATH, because no /usr/bin yet (they hadn't bought the /usr disk yet)
- no -o flag; `as` always wrote its output to `a.out` and you had to `mv` it if that wasn't what you wanted
- `fork()` returned to a different location in the child process, instead of returning a status value and making you test the return value. this would have saved me great embarrassment at my first sysadmin intern position when i accidentally wrote a fork bomb (by getting the test backwards) and ran it on the departmental nfs server
- no `execve`, just `execle` (called `execute`)
- no `waitpid()`, `wait3()`, etc., just `wait()`
- no `select()` or sockets of course, nor any of the other bsd niceties
- traps weren't handleable, so there was no SIGINT yet, just SIGQUIT, with the same ^\ keystroke it has today (but no way to attach a signal handler to it); no concept of tty process group (or indeed process groups at all) so ^\ could kill a random background job. but there was an `intr` system call to disable these breaks (presumably so you didn't kill the shell)
- no C yet, just B, but evidently the B compiler was already generating native code instead of stack bytecode as it had a few months before. consequently the system calls are documented in terms of machine registers and assembly instructions
- no `rename()` system call; `mv` linked and then unlinked the file
- no environment variables
- `time()` was still provided in sixtieths of a second since "the start of the current year" (so at the time the Unix epoch was the beginning of 01971, not the beginning of 01970) and was 32 bits (the AC and MQ registers)
- symbol tables were written to a separate `n.out` file
- no `ptrace()` and so no live debugging support (except for the kernel!), just inspecting core files
- `tar` is called `tap` and cannot put its archives in files other than actual physical magtapes
sadly page a7 is missing from the scan
The tape archiver in v6 was called tp. I never used tap, which was earlier. Tar was introduced in v7. It was a complete re-write and used a different on-tape format.
No, B always generated interpreted/threaded code on UNIX, certainly on the PDP-7. We have the runtime and B library from that time.
you could do this just by aggregating the interpreter (which is never mentioned) with the bytecode in a single file, but that would imply making 10 copies of the interpreter if you had 10 programs compiled with B, on a 512-kibibyte disk; a highly suboptimal tradeoff under the circumstances
but even in such a case what symbols would you put in n.out
Some comparison points with MS-DOS 1.0:
- 8.3 filenames
- no subdirectories
- single user
- 32-bit file sizes and offsets (64k file size limit was definitely not enough by then)
- FCB-based API (not file handles), FAT12 filesystem with 32MB limit
- Hardcoded device names special-cased
- No pipes nor redirection either
- No multitasking nor TSRs
- No networking at all
- Environment variables present
- Supports dates up to 2099
- Kernel, shell, and utilities written in 100% Asm
- Live debugger (DEBUG.COM)
the other thing is that the pdp-11 had working segmentation, the 8086 didn't, so trapping faults in user processes so they couldn't break the kernel would have required some kind of interpretation or something
did you know microsoft was shipping xenix in 01981 (the same year they started shipping qdos/ms-dos/pc-dos) and shipping xenix for the 8086 in 01982, and that seattle computer products was selling 8086 xenix boxes in 01983
Insofar as "everything is a file" applied at this point, could you just mv /tap0 out of the way and put a file there? If not, which of the few syscalls that had been invented so far was tap(1) using against /tap0, that couldn't be used against files?
conceivably though /tap0 had different seek() semantics than regular files or something (it was a dectape)
> - creat is spelled with an e
You mean it was 'create'? Funny if 'creat' was a mistake that stuck.
My favourite in this genre is 'makunbound'.
some cases of this relate to identifiers only having 6 significant characters in some object file formats (typically a 32-bit or 36-bit field using rad50) but i don't know if lisp's makunbound was such an example, and creat surely was not
> spell it with an "e"
https://go.googlesource.com/go/+/c90d392ce3d3203e0c32b3f98d1...