Hinweise zum BS2 Übungszettel 3 =============================== Kernel-Modul bauen: - Makros module_init, module_exit, MODULE_DESCRIPTION, MODULE_AUTHOR, MODULE_LICENSE $ make modules $ make modules_install (als root) Loop-Device einrichten: $ dd if=/dev/zero bs=512 count=1024 of=image $ losetup /dev/loop0 image (als root) Formatierungsprogramm: - testen ob Blockdevice oder normale Datei mit fstat() - Auslesen der Größe einer normalen Datei ebenfalls mit fstat() - Auslesen der Größe eines Blockdevices mit ioctl(fd, BLKGETSIZE, &physicalBlockCount) Dateisystem registrieren - register_filesystem() - struct file_system_type - struct super_block (include/linux/fs.h) - blocksize setzen (sb_set_blocksize()) - Superblock vom Device lesen (sb_bread()) - private daten in s_fs_info - s_maxbytes (max. Dateigröße) setzen - s_op setzen - s_root: root-Inode laden/anlegen, dentry bauen (d_alloc_root()) - struct super_operations - wichtige Funktionen: .alloc_inode .destroy_inode .write_inode (leer, wenn keine On-Disk-Inodes, sonst: mark_buffer_dirty(), sync_dirty_buffer() wenn wait) .delete_inode (clear_inode()) .write_super (mark_buffer_dirty(), sync_dirty_buffer(), s_dirt auf 0) .put_super (brelse() nach sync) .statfs (struct kstatfs ausfüllen (include/linux/statfs.h) - eine eine Operation "read_inode" gibt es so nicht mehr. Stattdessen schreibt man sich eine Funktion die einen Inode üblicherweise mit iget_locked() alloziert und dann ausfüllt. i_op und i_fop müssen gesetzt werden, bei Dateien zusätzlich noch i_size. - struct inode_operations - wichtige Funktionen: - für Directories: .create .lookup .unlink .mkdir .rmdir .rename - für Files: .truncate struct file_operations - wichtige Funktionen - für Directories: .readdir .read (Fehler zurückgeben) .fsync - für Files: .llseek .read .write .ioctl (hier den eigenen Ioctl einbauen) .fsync struct dentry: - zu finden in include/linux/dcache.h - Sonstiges: - eigene Blockverwaltung (frei/belegt) - eigene Verzeichniseintrags-struct (auch physisch auf Device) - ggf. physische Inode-struct