Once: start something else on the next start, and only that one
A program that owns the whole machine had nowhere to run. It cannot be started from the shell, because starting it means there is no shell, and pointing boot.cfg at it means a machine that keeps starting it - which is a poor place to find a mistake in something written five minutes ago. Once writes /System/Boot/once.cfg, in the same format as boot.cfg and read with the same routines, because a second format for one setting would be a second format. The loader reads it before boot.cfg and DELETES IT BEFORE IT JUMPS, which is the only moment there is: after the jump the loader does not exist. Consumed by being read rather than by working, so a one shot that hangs cannot hang twice - the request is gone before the image ran, and the next start reads boot.cfg like any other. THE BOOT STATE IS NOT TOUCHED, and the first version got that wrong. It marked the start the way any other start is marked, and then every successful bare metal boot reported that it had never arrived - because a program with the whole machine has no filesystem to clear a mark with and is doing nothing wrong by not having one. Found by running it: the image printed its line and the next start still said the last one did not. Three disks, each a start further along, so none of the tests depends on another having run. The loop is closed on the machine now: write it in Edit, assemble it with Asm, ask for it with Once, restart, watch it own the machine, and the system comes back without being asked.
This commit is contained in:
@@ -296,6 +296,34 @@ so a machine interrupted while updating its only boot slot would not boot at all
|
||||
the one failure on this disk with no way back. Writing the slot that is *not* live and then
|
||||
moving one byte in the superblock turns that into a machine that boots what it had before.
|
||||
|
||||
### Starting Something Else Just This Once:
|
||||
|
||||
A program that owns the whole machine has nowhere to run. It cannot be started from the
|
||||
shell, because starting it means there is no shell; and pointing `boot.cfg` at it means a
|
||||
machine that keeps starting it, which is a poor place to find a mistake.
|
||||
|
||||
```
|
||||
> Once /System/Boot/mine.bin
|
||||
next start: /System/Boot/mine.bin, once
|
||||
```
|
||||
|
||||
That writes `/System/Boot/once.cfg`, in the same format as `boot.cfg` and read with the same
|
||||
routines, because a second format for one setting would be a second format. The loader reads
|
||||
it before `boot.cfg` and **deletes it before it jumps** - the only moment there is, since
|
||||
after the jump the loader does not exist.
|
||||
|
||||
**Consumed by being read, not by working.** A one shot that hangs cannot hang twice: the
|
||||
request is gone before the image ran, so the next start reads `boot.cfg` like any other.
|
||||
|
||||
And **the boot state is not touched** by a one shot, which the first version got wrong. A
|
||||
program with the whole machine has no filesystem to clear a mark with, and is doing nothing
|
||||
wrong by not having one - so marking it reported every successful bare metal boot as a start
|
||||
that never arrived.
|
||||
|
||||
Which closes the loop on the machine itself: write a bare metal program in `Edit`, assemble
|
||||
it with `Asm`, ask for it with `Once`, restart, watch it run, and the system comes back
|
||||
without being asked.
|
||||
|
||||
### Knowing Whether The Last Start Arrived:
|
||||
|
||||
The loader marks the disk before it hands over, and the system clears the mark when it
|
||||
|
||||
Reference in New Issue
Block a user