Inhaltsverzeichnis

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.

Syscall-ABI · Kernel-Interna · Ü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 <size_mb> Alloziert eine RAM-Disk der angegebenen Größe (1–256 MB). Gibt die zugewiesene Disk-ID aus.
ramdisk fmt <disk_id> 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


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