====== Lyx OS – RAM-Disk ======
Lyx OS unterstützt neben physischen ATA/AHCI-Festplatten bis zu **4 RAM-Disks** (Disk-IDs 4–7). Eine RAM-Disk wird aus physisch kontiguösem Speicher alloziert, verhält sich für alle darüber liegenden Schichten (FAT32, VFS, Shell) wie eine normale Festplatte und bleibt bis zum nächsten Neustart erhalten.
→ [[lyxos:syscalls|Syscall-ABI]] · [[lyxos:kernel|Kernel-Interna]] · [[lyxos:start|Übersicht]]
----
===== 1. Disk-ID-Schema =====
^ Disk-IDs ^ Typ ^ Treiber ^
| 0–3 | ATA PIO / AHCI (physische Festplatten) | ''kernel/ata.lyx'' / ''kernel/ahci.lyx'' |
| 4–7 | RAM-Disk | ''kernel/ramdisk.lyx'' |
Die Dispatch-Schicht in ''kernel/disk.lyx'' leitet ''DiskRead'' / ''DiskWrite'' transparent an den richtigen Treiber weiter — alle höheren Schichten (FAT32, VFS, Diskmap, Shell-Tools) sehen nur Disk-IDs und merken den Unterschied nicht.
----
===== 2. kernel/ramdisk.lyx =====
Verwaltet eine statische Tabelle von bis zu 4 RAM-Disk-Slots. Jeder Slot ist 24 Bytes groß:
rd_table[slot]:
+0 phys_base (int64) — physische Basisadresse des allokierten Speichers
+8 sectors (int64) — Sektor-Anzahl (size_mb × 2048)
+16 present (int64) — 0 = frei, 1 = belegt
==== Konstanten ====
con RD_MAX: int64 := 4; // max. gleichzeitige RAM-Disks
con RD_ID_BASE: int64 := 4; // externe Disk-ID = RD_ID_BASE + slot
con RD_ENT_SZ: int64 := 24; // Bytes pro Tabelleneintrag
==== Funktionen ====
^ Signatur ^ Beschreibung ^
| ''RdInit(): void'' | Tabelle allozieren und alle ''present''-Felder auf 0 setzen. Wird von ''DiskInit()'' aufgerufen. |
| ''RdPresent(rd_id): bool'' | Prüft ob Slot ''rd_id'' (0-basiert) belegt ist. |
| ''RdSectorCount(rd_id): int64'' | Liefert Sektor-Anzahl des Slots; 0 wenn nicht vorhanden. |
| ''RdCreate(size_mb): int64'' | Alloziert ''size_mb'' MB physischen Speichers (1–256 MB), belegt den nächsten freien Slot. Gibt die externe Disk-ID (4–7) zurück; -1 bei Fehler (kein freier Slot oder OOM). |
| ''RdRead(rd_id, lba, buf): int64'' | Liest einen 512-Byte-Sektor (byte-für-byte) aus dem physischen Puffer in ''buf''. |
| ''RdWrite(rd_id, lba, buf): int64'' | Schreibt einen 512-Byte-Sektor aus ''buf'' in den physischen Puffer. |
| ''RdPrintInfo(): void'' | Gibt alle belegten RAM-Disk-Slots auf COM1 + Framebuffer aus. |
> **Hinweis:** ''RdRead''/''RdWrite'' nehmen die **slot-interne ID** (0–3), nicht die externe Disk-ID (4–7). Die Umrechnung macht die Dispatch-Schicht in ''disk.lyx''.
----
===== 3. kernel/disk.lyx — Dispatch-Schicht =====
''disk.lyx'' ist die einheitliche Zugriffsfassade für alle Disk-Typen. Alle höheren Schichten rufen ausschließlich ''DiskRead''/''DiskWrite'' auf.
==== Dispatch-Logik ====
pub fn DiskRead(disk_id: int64, lba: int64, buf: int64): int64 {
if (disk_id >= 4) { return RdRead(disk_id - 4, lba, buf); }
return AtaReadDisk(disk_id, lba, buf);
}
pub fn DiskWrite(disk_id: int64, lba: int64, buf: int64): int64 {
if (disk_id >= 4) { return RdWrite(disk_id - 4, lba, buf); }
return AtaWriteDisk(disk_id, lba, buf);
}
==== Funktionen ====
^ Signatur ^ Beschreibung ^
| ''DiskInit(): void'' | Initialisiert ATA/AHCI-Disks (Probe) und ruft ''RdInit()'' auf. |
| ''DiskRead(disk_id, lba, buf): int64'' | Einen 512-Byte-Sektor lesen. Leitet bei ID ≥ 4 an RAM-Disk weiter. |
| ''DiskWrite(disk_id, lba, buf): int64'' | Einen 512-Byte-Sektor schreiben. Leitet bei ID ≥ 4 an RAM-Disk weiter. |
| ''DiskCreateRam(size_mb): int64'' | Dünner Wrapper um ''RdCreate''. Gibt Disk-ID 4–7 zurück. |
| ''DiskPresent(disk_id): bool'' | Prüft ob Disk-ID belegt ist (ATA-Tabelle für 0–3, ''RdPresent'' für 4–7). |
| ''DiskSectorCount(disk_id): int64'' | Liefert Sektor-Anzahl (ATA oder RAM, transparent). |
| ''DiskPrintInfo(): void'' | Gibt alle Disks aus (ATA + RAM). |
----
===== 4. kernel/vfs.lyx =====
VFS-Layer-Wrapper für die RAM-Disk-Operationen, die über Ring-3-Syscalls erreichbar sind:
^ Signatur ^ Beschreibung ^
| ''VfsRamdiskCreate(size_mb): int64'' | Ruft ''DiskCreateRam(size_mb)'' auf. Gibt Disk-ID 4–7 oder -1 zurück. |
| ''VfsRamdiskFmt(disk_id): bool'' | Formatiert ''disk_id'' als FAT32 (''Fat32Format'', gesamte Disk ab LBA 0) und mountet sie als aktives Volume (''VfsMountDisk(0, disk_id, 0)''). Gibt ''true'' bei Erfolg. |
----
===== 5. Ring-3-Syscalls =====
^ Nr ^ Name ^ Argument ^ Rückgabe ^ Beschreibung ^
| 153 | ''sys_ramdisk_create'' | ''size_mb'' | disk_id (4–7) oder -1 | RAM-Disk allozieren. Ruft ''VfsRamdiskCreate'' auf. |
| 154 | ''sys_ramdisk_fmt'' | ''disk_id'' | 0 oder -1 | RAM-Disk als FAT32 formatieren + als aktives Volume mounten. Ruft ''VfsRamdiskFmt'' auf. |
==== bsys.lyx / bsys_vega.lyx — Ring-3-Wrapper ====
Beide Wrapper-Bibliotheken stellen identische Funktionen bereit:
// SysRamdiskCreate(size_mb) → disk_id (4-7) oder -1
pub fn SysRamdiskCreate(size_mb: int64): int64 {
poke64(g_r3sc + B_OFF_NR, 153);
poke64(g_r3sc + B_OFF_A0, size_mb);
return b_trigger();
}
// SysRamdiskFmt(disk_id) → 0 oder -1
pub fn SysRamdiskFmt(disk_id: int64): int64 {
poke64(g_r3sc + B_OFF_NR, 154);
poke64(g_r3sc + B_OFF_A0, disk_id);
return b_trigger();
}
----
===== 6. Shell-Tool: ramdisk =====
Das Tool ''bin/ramdisk.lyx'' läuft als normaler Ring-3-Prozess und nutzt ''SysRamdiskCreate'' / ''SysRamdiskFmt'' / ''BlockOpen'' über ''bsys''.
==== Befehle ====
^ Befehl ^ Beschreibung ^
| ''ramdisk create '' | Alloziert eine RAM-Disk der angegebenen Größe (1–256 MB). Gibt die zugewiesene Disk-ID aus. |
| ''ramdisk fmt '' | Formatiert Disk-ID 4–7 als FAT32 und mountet sie als aktives Volume. |
| ''ramdisk list'' | Listet alle belegten RAM-Disk-Slots (IDs 4–7) mit Größe und Sektor-Anzahl. |
==== Beispiel ====
> ramdisk create 32
ramdisk: created disk_id=4 32 MB
> ramdisk fmt 4
ramdisk: formatting disk_id=4 as FAT32... OK (mounted as active volume)
> ls /
(leeres Root auf RAM-Disk)
> ramdisk list
[4] RAMDISK 32 MB (65536 sectors)
----
===== 7. Architektur-Überblick =====
Ring-3-Shell / Anwendung
│ SysRamdiskCreate(mb) / SysRamdiskFmt(id)
▼
bsys.lyx / bsys_vega.lyx
│ Syscall-Nr 153 / 154
▼
kernel/ring3.lyx (Syscall-Handler)
│
├─ VfsRamdiskCreate → DiskCreateRam → RdCreate
└─ VfsRamdiskFmt → Fat32Format + VfsMountDisk
│
DiskRead / DiskWrite
┌─────┴─────┐
ID 0–3 ID 4–7
ATA/AHCI RdRead/RdWrite
(byte-für-byte
physischer Puffer)
FAT32 (''kernel/fat32.lyx''), Diskmap (''kernel/diskmap.lyx'') und alle anderen Disk-Konsumenten rufen ausschließlich ''DiskRead''/''DiskWrite'' auf — sie wissen nicht ob sie auf einer physischen Platte oder einer RAM-Disk arbeiten.
----
===== 8. Hinweise =====
* **Persistenz:** RAM-Disks überleben einen Soft-Reboot nicht — der physische Speicher wird nicht persistent gehalten. Inhalte gehen beim Neustart verloren.
* **Maximale Größe:** 256 MB pro RAM-Disk (''RdCreate''-Limit). Gesamtlimit durch verfügbaren physischen Speicher.
* **Sektor-Arithmetik:** ''size_mb × 2048 = Sektor-Anzahl'' (512-Byte-Sektoren).
* **Nur ein aktives Volume:** ''VfsRamdiskFmt'' mountet immer als Volume 0. Wenn eine physische Disk bereits als Vol 0 gemountet ist, überschreibt ''fmt'' den Mount.
* **Keine Partition:** Die FAT32-Formatierung beginnt direkt bei LBA 0 ohne MBR/GPT-Partitionstabelle.
* **Concurrent access:** Bis zu 4 RAM-Disks gleichzeitig allozierbar, aber nur eine kann per ''VfsRamdiskFmt'' als aktives Volume gemountet sein.
----
===== 9. Quelldateien =====
^ Modul ^ Datei ^
| RAM-Disk-Treiber | ''kernel/ramdisk.lyx'' |
| Disk-Dispatch | ''kernel/disk.lyx'' |
| VFS-Wrapper | ''kernel/vfs.lyx'' (''VfsRamdiskCreate'', ''VfsRamdiskFmt'') |
| Syscall-Handler | ''kernel/ring3.lyx'' (nr=153, nr=154) |
| Ring-3-Wrapper | ''bin/bsys.lyx'', ''vega/bsys_vega.lyx'' |
| Shell-Tool | ''bin/ramdisk.lyx'' |
Letzte Aktualisierung: 2026-06-18