====== 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