Initial commit: Schunix as it stands before the SchOS rename
An x86-64 operating system built from xv6, now largely rewritten: SMP, a copy-on-write root filesystem (SchFS), PCI/USB/virtio drivers, a TTF rasteriser, and a Linux-numbered syscall ABI. No history before this point -- the tree was never under version control. This commit exists so the rename that follows has something to undo to.
This commit is contained in:
commit
d0f7acf9eb
275 changed files with 51417 additions and 0 deletions
241
docs/licensing.md
Normal file
241
docs/licensing.md
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
# Licensing
|
||||
|
||||
The one page to check before copying anyone else's code into Schunix.
|
||||
|
||||
Referenced from `LICENSE`, `LICENSE.MIT` and `NOTICE`, all three of which
|
||||
pointed here long before this file existed.
|
||||
|
||||
---
|
||||
|
||||
## 1. Schunix is Apache-2.0
|
||||
|
||||
Copyright Nexoniarz. See `LICENSE`.
|
||||
|
||||
Apache-2.0 was chosen over MIT/BSD for one reason that actually matters at OS
|
||||
scale: it contains an **express patent grant** and a patent-retaliation clause.
|
||||
MIT and BSD are silent on patents, which means a contributor can hand you code
|
||||
and later assert a patent over it. For a kernel that is intended to accept
|
||||
outside contributions, that silence is the expensive kind.
|
||||
|
||||
What that grant means in practice: Apache-2.0 §2 gives everyone a perpetual,
|
||||
worldwide, irrevocable licence to reproduce, modify, sublicense and distribute
|
||||
Schunix. Any additional restriction stated elsewhere — in a README, a website,
|
||||
or a policy — does not narrow it. The licence text is what holds up.
|
||||
|
||||
If restricted distribution is ever genuinely wanted, that is a licence change
|
||||
(a bespoke proprietary licence, or something like BUSL-1.1 with a conversion
|
||||
date), not a wording change, and it means giving up the Apache grant.
|
||||
|
||||
---
|
||||
|
||||
## 2. What can be copied in
|
||||
|
||||
| Licence | Verdict | Obligation |
|
||||
|---|---|---|
|
||||
| Public domain, 0BSD, CC0 | **Yes** | None |
|
||||
| MIT, ISC | **Yes** | Keep the notice |
|
||||
| BSD 2-clause | **Yes** | Keep the notice |
|
||||
| BSD 3-clause | **Yes** | Keep the notice; no endorsement claims |
|
||||
| BSD **4-clause** (advertising) | **Avoid** — see §3 | Notice *and* an acknowledgement in advertising materials |
|
||||
| Apache-2.0 | **Yes** | Keep NOTICE contents |
|
||||
| MPL-2.0 | Case by case | File-level copyleft; keep those files separate |
|
||||
| **GPL-2.0-only** | **No** | — |
|
||||
| **GPL-3.0 / LGPL-3.0** | **No** for linked code | — |
|
||||
|
||||
**Every "yes" above requires an entry in `NOTICE`.** That file is the project's
|
||||
attribution record and the thing that makes the permissive licences actually
|
||||
satisfied rather than merely tolerated.
|
||||
|
||||
### Why GPL-2.0-only is a hard no
|
||||
|
||||
Apache-2.0 imposes conditions GPLv2 treats as "further restrictions" under its
|
||||
§6 — principally the patent-retaliation term. The FSF and the ASF agree on
|
||||
this: **Apache-2.0 code and GPL-2.0-only code cannot be combined into one
|
||||
distributable work.** It is not a matter of taste or of how carefully the files
|
||||
are kept apart in the tree; it is that the combined binary cannot satisfy both
|
||||
licences at once.
|
||||
|
||||
GPL-3.0 fixed this in the other direction (Apache-2.0 is compatible *into*
|
||||
GPLv3), but that does not help: the result would have to ship under GPLv3, and
|
||||
Schunix does not.
|
||||
|
||||
**Practical consequence:** BSD drivers can be adopted. Linux drivers cannot,
|
||||
ever, no matter how convenient. This is why the USB stack was written from the
|
||||
specification rather than ported.
|
||||
|
||||
---
|
||||
|
||||
## 3. NetBSD in particular
|
||||
|
||||
`src-trunk/` is a NetBSD checkout kept as reference material and a parts bin
|
||||
(see [architecture/schapi.md](architecture/schapi.md) §5). NetBSD is **not
|
||||
uniformly licensed**, and the difference matters per file:
|
||||
|
||||
| Template | Status |
|
||||
|---|---|
|
||||
| 2-clause BSD — modern NetBSD Foundation files | **Fine** |
|
||||
| 3-clause, "Regents of the University of California" | **Fine.** Berkeley formally rescinded the advertising clause in 1999 |
|
||||
| 4-clause with the advertising clause, **non-UC** copyright holder | **Avoid.** Berkeley's rescission covers Berkeley's copyright, not other people's |
|
||||
|
||||
The last row is real, not hypothetical. Measured on this checkout:
|
||||
|
||||
```
|
||||
sys/kern 26 of 220 files carry the advertising clause
|
||||
sys/dev 500 of 3565
|
||||
lib/libc 101 of 1575
|
||||
sys/net 5 of 180 ← the TCP/IP stack is nearly clean
|
||||
```
|
||||
|
||||
4-clause is still permissive and still redistributable; the burden is an
|
||||
advertising obligation that accumulates quietly and is tedious to honour
|
||||
properly. Prefer a 2-clause or UC-Regents file. If a 4-clause file is genuinely
|
||||
the right answer, it goes into `NOTICE` with the full clause quoted.
|
||||
|
||||
Check before copying, not after:
|
||||
|
||||
```sh
|
||||
grep -l "All advertising materials" <file>
|
||||
```
|
||||
|
||||
### And check *whose* clause it is
|
||||
|
||||
A file can carry several licence blocks from several copyright holders. Finding
|
||||
the advertising clause is only half the check — Berkeley's rescission covers
|
||||
Berkeley's copyright and nobody else's, so the question is always *whose*
|
||||
clause you found.
|
||||
|
||||
Measured on `src-trunk`, the networking tree:
|
||||
|
||||
```
|
||||
sys/net 106 files, 5 with the advertising clause
|
||||
sys/netinet 121 files, 25 " " "
|
||||
sys/netinet6 51 files, 5 " " "
|
||||
```
|
||||
|
||||
Encouraging at first glance — the 25 in `sys/netinet` are almost all SCTP,
|
||||
DCCP and multicast routing, none of which Schunix needs. `ip_input.c`,
|
||||
`ip_output.c`, `udp_usrreq.c`, `if_arp.c`, `ip_icmp.c`, `if.c` and `route.c`
|
||||
are all UC 3-clause, i.e. fine.
|
||||
|
||||
**But `tcp_input.c` and `tcp_output.c` are not.** Their advertising clause
|
||||
belongs to the **WIDE Project** (the KAME IPv6 people), whose copyright sits at
|
||||
the top of the file; the UC block is a separate licence further down. Berkeley
|
||||
never spoke for WIDE, so the rescission does not reach it. The two most
|
||||
valuable files in the stack are the two encumbered ones.
|
||||
|
||||
That is not fatal — 4-clause is still permissive — but it is exactly the case
|
||||
where a **second BSD tree earns its disk space**: FreeBSD's TCP has been
|
||||
through a relicensing effort NetBSD's has not, so the same file there may well
|
||||
be 2-clause. Check it the same way before assuming either:
|
||||
|
||||
```sh
|
||||
grep -n "Copyright" <file> | head # who claims it
|
||||
grep -n -B6 "All advertising" <file> # whose clause is it
|
||||
```
|
||||
|
||||
### FreeBSD's TCP is clean where NetBSD's is not
|
||||
|
||||
Checked, 2026-08-08, exactly that way. Against FreeBSD `main`:
|
||||
`sys/netinet/tcp_input.c` contains **no advertising clause at all**. Its
|
||||
copyright holders are the UC Regents, Swinburne University, Lawrence Stewart,
|
||||
the FreeBSD Foundation and Juniper Networks -- all BSD-2 or BSD-3.
|
||||
|
||||
So if BSD networking code is taken, it must come from **FreeBSD, not NetBSD**,
|
||||
and the specific reason is TCP. This reverses the earlier assumption in
|
||||
`docs/roadmap.md` that NetBSD was the intended starting point; NetBSD remains
|
||||
the better-written reference to *read*, but FreeBSD is the one that can be
|
||||
copied from.
|
||||
|
||||
|
||||
### The third option: lwIP
|
||||
|
||||
Before porting either BSD stack, weigh **lwIP** against both. Verified
|
||||
2026-08-08 from its `COPYING`: 3-clause BSD, Swedish Institute of Computer
|
||||
Science, **no advertising clause anywhere in the file**. Compatible, one NOTICE
|
||||
entry, done.
|
||||
|
||||
The licence is the smaller half of the argument. The larger half is that
|
||||
FreeBSD's `sys/netinet` is not a library -- `tcp_input.c` alone is 122 KB and
|
||||
reaches into mbufs, `epoch(9)`, netisr, VNET, `uma(9)`, sockbufs, inpcb hash
|
||||
tables and FreeBSD's locking. Taking it means porting FreeBSD's kernel
|
||||
infrastructure first and finding the TCP somewhere underneath, which is the same
|
||||
conclusion `docs/roadmap.md` §1 already reached about `sys/dev/usb`.
|
||||
|
||||
lwIP was written for the case Schunix is in: a small operating system with a raw
|
||||
Ethernet driver and no infrastructure to speak of. Its port layer is a handful
|
||||
of files, it has no dependency on the host kernel's allocator or locking, and it
|
||||
brings ARP, IPv4, ICMP, UDP, TCP, DHCP and DNS.
|
||||
|
||||
### Fonts
|
||||
|
||||
Chosen 2026-08-09, both licences checked at source rather than assumed:
|
||||
|
||||
| Font | Where | Licence |
|
||||
|---|---|---|
|
||||
| Roboto | desktop, window manager, compositor | **Apache-2.0** |
|
||||
| JetBrains Mono | terminal, TTY | **SIL OFL 1.1** |
|
||||
|
||||
Roboto is the same licence as Schunix, so it is the easy case: a NOTICE entry
|
||||
and nothing else.
|
||||
|
||||
OFL is permissive and bundling is precisely what it is for, with two conditions
|
||||
worth knowing before anyone subsets or converts a font:
|
||||
|
||||
- **The font stays under OFL** even inside an Apache-2.0 system. It does not
|
||||
infect anything else; it just cannot be relicensed.
|
||||
- **It may not be sold on its own.** Shipping it as part of an OS is fine.
|
||||
- **Reserved Font Names.** JetBrains Mono declares *none* -- its copyright line
|
||||
names no reserved name -- so a modified version may keep the name. Most OFL
|
||||
fonts do reserve theirs, and then a derivative must be renamed.
|
||||
Pre-rasterising a font into bitmaps at build time **is** a modification, so
|
||||
this is not a theoretical point for this project.
|
||||
|
||||
---
|
||||
|
||||
## 4. Things that are deliberately not shipped
|
||||
|
||||
Some code is fine to *build and run locally* and impossible to *distribute*
|
||||
with Schunix. Keeping the distinction sharp is what stops it eroding:
|
||||
|
||||
- **`Refrence/`** — a FreeBSD checkout (`Refrence/freebsd-src`), kept as
|
||||
reference material and a parts bin. Never built, never in an image. The
|
||||
directory name is spelled as it is on disk; renaming it is a one-line change
|
||||
if it ever grates.
|
||||
- **`src-trunk/`** — a NetBSD checkout, same rules. Currently absent; it was
|
||||
deleted for disk space and can be re-fetched sparsely if needed.
|
||||
- **`dist/`** — upstream tarballs and other downloaded blobs. Cached so a
|
||||
rebuild never needs the network; not part of any image, and not all of it is
|
||||
redistributable.
|
||||
|
||||
The mechanisms that keep this from eroding, since good intentions have already
|
||||
failed once here:
|
||||
|
||||
- `NOTPORTS` in `ports/Makefile` — a port that lives in the tree but is never
|
||||
built by `make`.
|
||||
- `RAMDISK_EXCLUDE` in the root `Makefile` — paths kept out of the ramdisk root.
|
||||
This one matters more than it looks: the ramdisk image is linked *into the
|
||||
kernel binary*, so anything sitting in `sysroot/` when that image is built
|
||||
becomes part of a distributable artifact. A GPL-2.0 or non-redistributable
|
||||
file staged there does not merely ride along, it makes the kernel itself
|
||||
undistributable.
|
||||
|
||||
A previous acceptance test — a ported 1993 shooter, GPL-2.0 engine on
|
||||
non-redistributable shareware data — was carried under exactly these rules and
|
||||
has since been removed. It is worth recording *why* it was safe: it was never in
|
||||
`PORTS`, and its 33 MB of data was excluded from the ramdisk. It is equally
|
||||
worth recording that the safety depended on two separate opt-outs staying
|
||||
correct, which is a lot of standing risk for a test that had stopped finding
|
||||
bugs. See `docs/roadmap.md` Phase 7.
|
||||
|
||||
---
|
||||
|
||||
## 5. Specifications are not code
|
||||
|
||||
A published specification carries no copyright over an independent
|
||||
implementation of it. The xHCI, USB, PCI, fbdev and ELF specifications were all
|
||||
read and implemented directly, which is why those drivers have no licence
|
||||
entanglement at all despite equivalents existing in both Linux and BSD.
|
||||
|
||||
When a subsystem is small enough to write from the spec, that is usually the
|
||||
cheapest option in the long run — not because copying is hard, but because a
|
||||
copied file is a file to be understood, attributed and maintained forever.
|
||||
Loading…
Reference in a new issue