Download Game! Currently 106 players and visitors. Last logged in:EronkBylethSabaothLmt

Blitzer's Blog >> 71130

Back to blogs index
Posted: 25 Jun 2026 07:44 [ permalink ]
Perkele, olet tC$ysin oikeassa. PyydC$n anteeksi sooloiluani ja hC$tC$ilyC$ni.
YmmC$rsin tuon "DMA/laitevC$ylC$"-vertauksesi tC$ysin vC$C$rin ja lC$hdin
viemC$C$n arkkitehtuuria aivan liian yksinkertaistettuun apuprosessori-malliin.

PysC$ytetC$C$n kaikki koodaus vC$littC6mC$sti. VedetC$C$n syvC$C$n henkeC$ ja
suunnitellaan tC$mC$ tC$smC$lleen sinun visiosi pohjalta.

Avaan ensin lyhyesti, miksi inhosit tuota `jit_call()` -ratkaisua (ja miksi
olet oikeassa sen suhteen): Se on QuickJS-moottorin sisC$inen purkkaviritys,
joka kutsuu C-koodia samassa sC$ikeessC$ ja samassa pinossa (stack) missC$
JS-tulkki pyC6rii. Se tarkoittaa, ettC$ Ring 1 olisi ollut vain JS-moottorin
"orja". Kuten sanoit, se ei ole kC$yttC6jC$rjestelmC$.

Sinun visiosi on oppikirjaesimerkki puhtaasta **Microvisor (Exokernel)
-arkkitehtuurista**. Ring 1 on varsinainen, oikea kC$yttC6jC$rjestelmC$. Ring
0 on vain nC$kymC$tC6n hypervisor, laitteistoajuri ja hC$tC$kuori.

TC$ssC$ on ehdotus Hauki OS:n lopulliseksi, tC$ysin eristetyksi
arkkitehtuuriksi.

---

### 1. Ehdoton Muistieristys (The Iron Curtain)

Ring 1 ei saa sisC$ltC$C$ yhtC$kC$C$n funktiokutsua, muistiosoitinta tai edes
C-headeria, joka viittaa Ring 0:aan. Se ohjelmoidaan ikC$C$n kuin se pyC6risi
yksin omalla raudallaan, alkaen fyysisestC$ osoitteesta 17MB (`0x01100000`).
Se saa oman pinonsa (stack) ja oman kekonsa (heap). Se ei tiedC$, ettC$
MQuickJS on edes olemassa.

### 2. Jaettu muisti ja Mailboxit (The Nexus)

Kuten laitevC$ylien kanssa kommunikoidessa, Ring 0 ja Ring 1 "kC$ttelevC$t"
vain yhden yhteisesti sovitun muistialueen kautta. TC$mC$ on NEXUS
(`0x01000000 - 0x010FFFFF`).
TC$nne rakennetaan kaksi tC$ysin asynkronista rengaspuskuria (Ring Buffer):

* **R0 -> R1 Inbox (Hardware Events):** Kun Ring 0 saa nC$ppC$inpainalluksen
tai Broadcom-verkkopaketin, se ei siirrC$ suoritusta Ring 1:lle. Se vain
pudottaa paketin tC$hC$n Inboxiin ja jatkaa matkaansa.
* **R1 -> R0 Outbox (System Requests):** Kun Ring 1 haluaa tulostaa tekstiC$
nC$ytC6lle (VGA) tai lC$hettC$C$ verkkopaketin, se ei yritC$ koskea rautaan.
Se rakentaa pyynnC6n (`T_STRING: "Hello"`) ja laittaa sen Outboxiin.

### 3. IPC-Laukaisin: Miten Ringit herC$ttC$vC$t toisensa?

TC$mC$ on se kriittinen suunnittelupC$C$tC6s. Jos kaikki menee Mailboxin
kautta, miten tiedC$mme, ettC$ siellC$ on viesti? MeillC$ on kaksi
vaihtoehtoa:

1. **Hardware Timer (Polling):** Ring 0:n PIT-ajastin herC$C$ millisekunnin
vC$lein. Se katsoo Outboxiin. Jos Ring 1 on jC$ttC$nyt sinne tulostuspyynnC6n,
Ring 0 hoitaa sen. TC$mC$ on helpoin, mutta aiheuttaa jopa 1 ms viiveen esim.
sarjaporttikirjoituksiin.
2. **Ohjelmistokeskeytys (Syscall - Suositus!):** Kun Ring 1 laittaa viestin
Outboxiin, se kutsuu ohjelmistokeskeytystC$ (esim. `asm volatile("int
$0x80")`). TC$mC$ laukaisee rautatason ansan, joka siirtC$C$ suorituksen
vC$littC6mC$sti Ring 0:n IDT-tauluun. Ring 0 lukee postilaatikon saman tien,
tulostaa tekstin ruudulle, ja kC$skee CPU:ta palaamaan Ring 1:een (`iret`).

Kumpikaan nC$istC$ ei vaadi JIT-pinoja. Molemmat kC$yttC$vC$t prosessorin
aitoa tila-arkkitehtuuria.

### 4. Ring 0:n rooli portinvartijana

Ring 0 (mquickjs) omistaa aidon laitteiston (`inb`, `outb`, IRQ-keskeytykset).
Sen tehtC$vC$ on:

1. Ottaa vastaan Ring 1:n pyynnC6t (NEXUS Mailbox) ja varmistaa, ettC$ ne ovat
turvallisia.
2. Tarjota Debug/Mesh-yhteys (sinun HSH-shellisi).
3. Vartioida CPU-poikkeuksia. Jos Ring 1 tekee Page Faultin tai jakaa
nollalla, Ring 0 nappaa keskeytyksen, lukitsee Ring 1:n tilan ja ilmoittaa
sinulle sarjaporttiin (Phoenix).

---

MiltC$ tC$mC$ arkkitehtuuri kuulostaa? Haluatko, ettC$ suunnittelemme Ring 1
-> Ring 0 kommunikaation toimimaan ammattimaisella **ohjelmistokeskeytyksellC$
(INT 0x80)** vai pitC$ydymmekC6 puhtaassa ajastinpohjaisessa **Mailbox-luennass
a (Polling)**?