StuBS
|
Auf einer Platte mit Minix V3 steht jeweils nacheinander
struct Minix_Super_Block
in minix/minix.h
struct Minix_Disk_Inode
in minix/minix.h
mkfs.minix
von Linux sind Blöcke jeweils 1024 Byte groß.struct Minix_Dirent
in minix/minix.h
Unter einem Linux:
$ dd if=/dev/zero of=~/file.img bs=1MiB count=1 $ mkfs.minix -3 ~/file.img # optional --inodes <number> 352 Inodes 1024 Blöcke Erste Datenzone=26 (26) Zonengröße=1024 Maximalgröße=2147483647
Als Root unter Linux:
$ losetup --find --show ~/file.img $ mount /dev/loop0 /mnt/tmp # Jetzt Dateien und Co anlegen $ umount /dev/loop0 $ losetup --detach /dev/loop0
Da nicht immer Rootzugriff vorhanden ist (z.B. im CIP) gibt es eine Kommandozeilenanwendung, welche mit FTP-artigen Befehlen einen direkten Zugriff auf das Abbild erlaubt
$ cd tool $ make $ fstool ~/file.img # Jetzt Dateien und Co bearbeiten. # "help" für weitere Informationen
Ermöglicht das Schreiben aus OOStuBS auf das Abbild, so dass diese Daten dann in z.B. Linux später gelesen werden können.
In common.mk
bei QEMU
-drive file=./test_imgs/minix_sample_data.img,format=raw
hinzufügen. Dann ist das Abbild – sollte es das Einzige sein – Master am ersten Port. Es reicht dann in der App
#include "fs/harddisk.h" Harddisk harddisk; int error = VFS::mount("minix", &harddisk, "");
Möchte man einen anderen Port nutzen, muss man . Z.B. -drive file=./test_imgs/minix_sample_data.img,format=raw,bus=1,unit=1
bei QEMU
anhängen (siehe man qemu
). Dementsprechend Harddisk harddisk(secondary_bus_slave);
in der App verwenden. Alle weiteren unterstützten Ports finden sich in enum Drive
unter harddisk.h
.
Ermöglicht kein Schreiben. Dazu via QEMUINITRD
Dateisystemabbild als initrd übergeben.
In der App
#include "memory/multiboot.h" extern void *multiboot_addr; multiboot_info_t *mb_info = (multiboot_info_t*)multiboot_addr; if (mb_info->mods_count <= 0) { GuardedScheduler::exit(); } multiboot_module_t *mod = (multiboot_module_t*)mb_info->mods_addr; void *initrd = (void *)mod->mod_start; size_t initrdsize = ((size_t)mod->mod_end) - ((size_t)mod->mod_start); Ramdisk ramdisk(initrd, initrdsize); int error = VFS::mount("minix", &ramdisk, "");
Ermöglicht kein Schreiben. Das Erstellen einer Headerdatei, wodurch das Abbild dann über eine Variable genutzt werden kann, geht folgendermaßen:
xxd -i minix_mkfs.img > minix_img.h
In der App
#include "minix_img.h" #include "fs/ramdisk.h" static Ramdisk ramdisk(test_imgs_minix_sample_data_img, test_imgs_minix_sample_data_img_len); int error = VFS::mount("minix", &ramdisk, "");
Einige Ordner- und Dateioperationen bietet das Virtualfilesystem (kurz VFS). Beispielsweise finden sich dort Operationen wie VFS::open(…)
, VFS::lseek(…)
oder VFS::stat(…)
. Genauere Beschreibungen der Methoden finden sich in den Kommentaren von vfs.h
.