%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% This default.mgp is "TrueType fonts" oriented. %% First, you should create "~/.mgprc" whose contents are: %% tfdir "/path/to/truetype/fonts" %% %% To visualize English, install "standard.ttf", "thick.ttf", and %% "typewriter.ttf" into the "tfdir" directory above: %% ftp://ftp.mew.org/pub/mgp/ttf-us.tar.gz %% %% To visualize Japanese, install "kochi-mincho.ttf" and "goth.ttf" %% into the "tfdir" directory above: %% ftp://ftp.mew.org/pub/mgp/ttf-jp.tar.gz %% %deffont "standard" tfont "verdana.ttf", tmfont "kochi-mincho.ttf" %deffont "thick" tfont "verdanai.ttf", tmfont "goth.ttf" %deffont "typewriter" tfont "courbd.ttf", tmfont "goth.ttf" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings per each line numbers. %% %default 1 area 90 90, leftfill, size 2, fore "white", back "black", font "thick" %default 2 size 7, vgap 10, prefix " " %default 3 size 2, bar "gray70", vgap 10 %default 4 size 5, fore "white", vgap 30, prefix " ", font "standard" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Default settings that are applied to TAB-indented lines. %% %tab 1 size 5, vgap 40, prefix " ", icon box "green" 50 %tab 2 size 4, vgap 40, prefix " ", icon arc "yellow" 50 %tab 3 size 3, vgap 40, prefix " ", icon delta3 "red" 40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page %nodefault %size 7, font "standard", fore "white", vgap 20, center Linux %size 4 Kernen Linux Byg en kerne Moduler Tråde Filsystemer Minix filsystemet %size 2 Kasper Dupont kasperd@brics.dk http://kasperd.net/ AaUUG 29. november 2005 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %page Linux Linux er en kerne Overholder standarder Posix Single UNIX Specification BSD SysV %page Byg en kerne Værktøjer make gcc + mange flere Konfiguration: make help make xconfig %page Byg en kerne Bygning: make bzImage make modules make modules_install make install %page Kerne sourcen Makefile kernel mm arch drivers fs %page Bygge et modul Brug kbuild med -C og M= En forbedret Makefile %page Kerne tråde Man kan starte en tråd med kernel_thread Det er besværligt at stoppe en tråd %page VFS Objekt orienteret C kode ret = file->f_op->read(file, buf, count, pos); VFS tager sig af de fleste besværlige opgaver filsystemer implementerer metoderne %page Klasser struct file_system_type struct super_operations struct inode_operations struct file_operations struct address_space_operations %page minix static struct file_system_type minix_fs_type = { .owner = THIS_MODULE, .name = "minix", .get_sb = minix_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; %page minix static struct super_block *minix_get_sb( struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super); } %page minix static struct super_operations minix_sops = { .alloc_inode = minix_alloc_inode, .destroy_inode = minix_destroy_inode, .read_inode = minix_read_inode, .write_inode = minix_write_inode, .delete_inode = minix_delete_inode, .put_super = minix_put_super, .statfs = minix_statfs, .remount_fs = minix_remount, }; %page minix struct inode_operations minix_dir_inode_operations = { .create = minix_create, .lookup = minix_lookup, .link = minix_link, .unlink = minix_unlink, .symlink = minix_symlink, .mkdir = minix_mkdir, .rmdir = minix_rmdir, .mknod = minix_mknod, .rename = minix_rename, .getattr = minix_getattr, }; %page minix static struct inode_operations minix_symlink_inode_operations = { .readlink = generic_readlink, .follow_link = page_follow_link_light, .put_link = page_put_link, .getattr = minix_getattr, }; %page minix struct file_operations minix_file_operations = { .llseek = generic_file_llseek, .read = generic_file_read, .write = generic_file_write, .mmap = generic_file_mmap, .fsync = minix_sync_file, .sendfile = generic_file_sendfile, }; struct inode_operations minix_file_inode_operations = { .truncate = minix_truncate, .getattr = minix_getattr, }; %page minix static struct address_space_operations minix_aops = { .readpage = minix_readpage, .writepage = minix_writepage, .sync_page = block_sync_page, .prepare_write = minix_prepare_write, .commit_write = generic_commit_write, .bmap = minix_bmap }; %page minix %size 4 static int minix_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create) { if (INODE_VERSION(inode) == MINIX_V1) return V1_minix_get_block(inode, block, bh_result, create); else return V2_minix_get_block(inode, block, bh_result, create); } %page minix %size 4 static int minix_writepage(struct page *page, struct writeback_control *wbc) { return block_write_full_page(page, minix_get_block, wbc); } static int minix_readpage(struct file *file, struct page *page) { return block_read_full_page(page,minix_get_block); } static int minix_prepare_write(struct file *file, struct page *page, unsigned fr { return block_prepare_write(page,from,to,minix_get_block); } static sector_t minix_bmap(struct address_space *mapping, sector_t block) { return generic_block_bmap(mapping,block,minix_get_block); } %page Før man implementerer et filsystem Test så meget som muligt i user mode. Brug en user mode version af sb_bread, mark_buffer_dirty og brelse. Implementer mkfs, fsck og debugfs værktøjer. %page Gode råd Kompiler aldrig som root Test på et minimalt system Undgå X Stop dæmoner Unmount filsystemer Vær omhyggelig med koden Verificer alle antagelser Check for NULL pointere Clear pointere Stol aldrig på brugeren %page Gode råd Test gerne på en seperat maskine Nogle ting kan testes på en emulator Brug netboot hvis du har muligheden Brug serial console eller net console %page Spørgsmål Spørgsmål tak