From f2fdc0aada5e0057303a5913c5b0342b3b9b7107 Mon Sep 17 00:00:00 2001 From: d0p1 Date: Thu, 18 Jul 2024 11:28:07 +0200 Subject: [PATCH] doc: document file system --- kernel/Makefile | 1 + kernel/conf/devices | 3 ++ kernel/dev/at/floppy.inc | 33 +++++++++++++++-- kernel/dev/at/kbd.inc | 6 +++ kernel/dev/console.inc | 2 - kernel/dev/dev.inc | 1 - kernel/fork.inc | 2 + kernel/fs/fat.inc | 24 +++++++++++- kernel/fs/stpdfs.inc | 79 +++++++++++++++++++++++++++++++++++++++- kernel/fs/xv6fs.inc | 14 +++++++ kernel/heap.inc | 27 ++++++++++++++ kernel/kernel.asm | 8 ++-- kernel/sys/bootinfo.inc | 1 + kernel/sys/errno.inc | 2 +- kernel/sys/process.inc | 27 ++++++++++++++ sbin/cryptotools/main.c | 71 ------------------------------------ sbin/parted/main.c | 2 +- 17 files changed, 217 insertions(+), 86 deletions(-) create mode 100644 kernel/conf/devices create mode 100644 kernel/fork.inc create mode 100644 kernel/heap.inc create mode 100644 kernel/sys/process.inc delete mode 100644 sbin/cryptotools/main.c diff --git a/kernel/Makefile b/kernel/Makefile index cf14c08..f84be9e 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -13,6 +13,7 @@ SRCS = kernel.asm \ isr.inc \ pic.inc \ idt.inc \ + heap.inc \ dev/console.inc \ dev/at/pit.inc \ dev/at/cga.inc \ diff --git a/kernel/conf/devices b/kernel/conf/devices new file mode 100644 index 0000000..76c713d --- /dev/null +++ b/kernel/conf/devices @@ -0,0 +1,3 @@ +console c 0 0 +fd0 b 0 0 +fd1 b 0 1 diff --git a/kernel/dev/at/floppy.inc b/kernel/dev/at/floppy.inc index bec9b68..5ea2dcc 100644 --- a/kernel/dev/at/floppy.inc +++ b/kernel/dev/at/floppy.inc @@ -49,25 +49,50 @@ floppy_strategy: ret floppy_open: + push ebp + mov ebp, esp + mov eax, [ebp+4] + cmp al, FLOPPY_MAX + jb @f + mov eax, ENXIO + jmp .end +@@: xor eax, eax +.end: + pop ebp ret floppy_close: + xor eax, eax ret floppy_ioctl: mov eax, ENODEV ret +floppy_dump: + ret + +floppy_psize: + ret + floppy_irq: iret floppy_device: db 'floppy', 0, 0 dd floppy_init - db 0 - db 0 + db FLOPPY_BDEV_MAJOR + db FLOPPY_CDEV_MAJOR -szMsgFloppy0Found db "floppy0: Found", 0 -szMsgFloppy1Found db "floppy1: Found", 0 +floppy_blockdev: + dd floppy_open + dd floppy_strategy + dd floppy_ioctl + dd floppy_close + dd floppy_dump + dd floppy_psize + +szMsgFloppy0Found db "floppy: fd0 found", 0 +szMsgFloppy1Found db "floppy: fd1 found", 0 diff --git a/kernel/dev/at/kbd.inc b/kernel/dev/at/kbd.inc index 8a57881..f690c63 100644 --- a/kernel/dev/at/kbd.inc +++ b/kernel/dev/at/kbd.inc @@ -28,6 +28,12 @@ kbd_init: @@: ret +kbd_open: + ret + +kbd_close: + ret + kbd_getc: in al, KBD_STATP and al, KBS_DIB diff --git a/kernel/dev/console.inc b/kernel/dev/console.inc index 65fda22..ad8c145 100644 --- a/kernel/dev/console.inc +++ b/kernel/dev/console.inc @@ -1,6 +1,4 @@ ;; File: console.inc -console_probe: - ret console_write: mov eax, uConsoleLock diff --git a/kernel/dev/dev.inc b/kernel/dev/dev.inc index f267031..344f3d5 100644 --- a/kernel/dev/dev.inc +++ b/kernel/dev/dev.inc @@ -7,7 +7,6 @@ DEFN Device struc BlkDev { .open dd ? - .close dd ? .strategy dd ? .ioctl dd ? .close dd ? diff --git a/kernel/fork.inc b/kernel/fork.inc new file mode 100644 index 0000000..3ac3923 --- /dev/null +++ b/kernel/fork.inc @@ -0,0 +1,2 @@ +fork: + ret diff --git a/kernel/fs/fat.inc b/kernel/fs/fat.inc index 4c4a960..0810121 100644 --- a/kernel/fs/fat.inc +++ b/kernel/fs/fat.inc @@ -1,7 +1,8 @@ ;; File: fat.inc ;; + ;; ;; Usefull links: - ;; - + ;; - FAT_SECTOR_SIZE = 512 FAT_MDIR_SIZE = 32 @@ -59,6 +60,27 @@ struc FATFS_BootSector32 { } DEFN FATFS_BootSector32 +struc FATFS_Dirent { + .name db 8 dup(?) + .ext db 3 dup(?) + .attr db ? + .reserved db 0 + .crt_time_tenth db ? + .crt_time dw ? + .crt_date dw ? + .lst_acc_date dw ? + .fst_clus_hi dw ? + .wrt_time dw ? + .wrt_date dw ? + .fst_clus_lo dw ? + .file_size dd ? +} +DEFN FATFS_Dirent + + ; ------------------------------------------------------------------------ + + ;; Section: Implementation + szVfsFatName db 'FATFS', 0 vfs_fatfs: diff --git a/kernel/fs/stpdfs.inc b/kernel/fs/stpdfs.inc index ab36954..0864454 100644 --- a/kernel/fs/stpdfs.inc +++ b/kernel/fs/stpdfs.inc @@ -1,27 +1,86 @@ ;; File: stpdfs.inc + ;; + ;; > ┌──────────┬───────────┬──────┬───┬──────┬────┬───┬────┐ + ;; > │Boot block│Super block│Inodes│...│Inodes│Data│...│Data│ + ;; > └──────────┴───────────┴──────┴───┴──────┴────┴───┴────┘ + ;; Constant: STPDFS_SB_MAGIC + ;; Superblock magic number, MUST BE `0x44505453` (STPD) STPDFS_SB_MAGIC = 0x44505453 + ;; Constant: STPDFS_SB_REV + ;; StupidFS revision, currently `0x1` STPDFS_SB_REV = 1 + ;; Constant: STPDFS_BSIZE + ;; StupidFS block size (512) STPDFS_BSIZE = 512 + ;; Constant: STPDFS_BADINO + ;; StupidFS bad inode +STPDBOOT_BADINO = 0 + ;; Constant: STPDFS_ROOTINO + ;; StupidFS root inode STPDFS_ROOTINO = 1 + ;; Constant: STPDFS_NDIRECT STPDFS_NDIRECT = 7 + ;; Constant: STPDFS_NAME_MAX +STPDFS_NAME_MAX = 28 + ;; Enum: StupidFS State + ;; STPDFS_CLEANLY_UNMOUNTED - 0 + ;; STPDFS_ERROR - 1 + ;; STPDFS_DIRTY - 1 STPDFS_CLEANLY_UNMOUNTED = 0 STPDFS_ERROR = 1 STPDFS_DIRTY = 1 + ;; Struc: StpdFS_FreeList + ;; + ;; > ┌──────────┐ + ;; > │ block 99 │ + ;; > ├──────────┤ + ;; > │ block 98 │ + ;; > ├──────────┤ + ;; > │ ... │ + ;; > ├──────────┤ + ;; > │ block 2 │ + ;; > ├──────────┤ + ;; > │ block 1 │ + ;; > ├──────────┤ ┌──────────┐ + ;; > │ block 0 ├───►│ block 99 │ + ;; > └──────────┘ ├──────────┤ + ;; > │ ... │ + ;; > ├──────────┤ ┌──────────┐ + ;; > │ block 0 ├───►│ block 99 │ + ;; > └──────────┘ ├──────────┤ + ;; > │ ... │ + ;; > ├──────────┤ + ;; > │ block 0 │ + ;; > └──────────┘ + ;; +struc StpdFS_FreeList { + .free dd 100 dup(?) + .nfree db ? +} + + ;; Struc: StpdFS_Sb + ;; .magic - See + ;; .isize - Size in block of the i-node list + ;; .fsize - Size in block of the entire volume + ;; .freelist - See + ;; .rev - See + ;; .state - See + ;; .time - Last access time (64bit UNIX timestamp) struc StpdFS_Sb { .magic dd ? .isize dd ? .fsize dd ? - .free dd 100 dup(?) - .nfree db ? + .freelist StpdFS_FreeList .rev db ? .state dw ? .time dq ? } DEFN StpdFS_Sb + ;; Struc: StpdFS_Inode struc StpdFS_Inode { .mode dw ? .nlink dw ? @@ -35,6 +94,22 @@ struc StpdFS_Inode { } DEFN StpdFS_Inode + ;; Struc: StpdFS_Dirent + ;; StupidFS dir entry + ;; + ;; .inode - address of i-node + ;; .name - null terminated file name (see ) +struc StpdFS_Dirent { + .inode dd ? + .name db STPDFS_NAME_MAX dup(?) +} +DEFN StpdFS_Dirent + + ; ------------------------------------------------------------------------ + + ;; Section: Implementation + + szVfsStpdFSName db 'StupidFS', 0 vops_stpdfs: diff --git a/kernel/fs/xv6fs.inc b/kernel/fs/xv6fs.inc index e4f7f5f..d1ce887 100644 --- a/kernel/fs/xv6fs.inc +++ b/kernel/fs/xv6fs.inc @@ -1,9 +1,15 @@ ;; File: xv6fs.inc ;; + ;; > ┌──────────┬───────────┬───┬───┬───┬──────┬───┬──────┬──────┬───┬──────┬────┬───┬────┐ + ;; > │Boot block│Super block│Log│...│Log│Inodes│...│Inodes│Bitmap│...│Bitmap│Data│...│Data│ + ;; > └──────────┴───────────┴───┴───┴───┴──────┴───┴──────┴──────┴───┴──────┴────┴───┴────┘ + ;; ;; Usefull links: ;; - ;; - + ;; Constant: XV6FS_BSIZE + ;; xv6 Filesystem block size (1024) XV6FS_BSIZE = 1024 XV6FS_ROOTINO = 1 XV6FS_MAGIC = 0x10203040 @@ -13,6 +19,7 @@ XV6FS_MAXFILE = (XV6FS_NDIRECT + XV6FS_NINDIRECT) XV6FS_IPB = (XV6FS_BSIZE / 64) XV6FS_DIRSIZE = 14 + ;; Struc: Xv6FS_Sb struc Xv6FS_Sb { .magic dd ? .size dd ? @@ -25,6 +32,7 @@ struc Xv6FS_Sb { } DEFN Xv6FS_Sb + ;; Struc: Xv6FS_Inode struc Xv6FS_Inode { .type dw ? .major dw ? @@ -35,11 +43,17 @@ struc Xv6FS_Inode { } DEFN Xv6FS_Inode + ;; Struc: Xv6FS_Dirent struc Xv6FS_Dirent { .inum dw ? .name db XV6FS_DIRSIZE dup(?) } + ; ------------------------------------------------------------------------ + + ;; Section: Implementation + + szVfsXv6FSName db 'xv6FS', 0 vops_xv6fs: diff --git a/kernel/heap.inc b/kernel/heap.inc new file mode 100644 index 0000000..c2df053 --- /dev/null +++ b/kernel/heap.inc @@ -0,0 +1,27 @@ + ;; File: heap.inc + + ;; Function: heap_init +heap_init: + push ebp + mov ebp, esp + sub esp, 4 + mov [ebp-4], eax + mov ecx, KERNEL_VIRT_BASE + add eax, ecx + push eax + push ecx + mov esi, szMsgHeapInit + call klog + + ; TODO + + leave + ret + +heap_alloc: + ret + +heap_free: + ret + +szMsgHeapInit db "HEAP: initialize %x - %x", 0 diff --git a/kernel/kernel.asm b/kernel/kernel.asm index a2a8ef1..582b03b 100644 --- a/kernel/kernel.asm +++ b/kernel/kernel.asm @@ -6,15 +6,13 @@ include 'sys/bootinfo.inc' include 'sys/cpu.inc' include 'sys/errno.inc' + include 'sys/process.inc' org KBASE use32 jmp short kmain -db 'STPDKRNL' -db 32 dup(0) - ;; Function: kmain ;; ;; Parameters: @@ -56,6 +54,9 @@ kmain: add ebx, KERNEL_VIRT_BASE call pmm_free_range + mov eax, [boot_structure.low_mem] + call heap_init + call pic_init ; clear tss @@ -109,6 +110,7 @@ kmain: include 'isr.inc' include 'idt.inc' include 'pic.inc' + include 'heap.inc' include 'vfs.inc' include 'fs/fat.inc' include 'fs/stpdfs.inc' diff --git a/kernel/sys/bootinfo.inc b/kernel/sys/bootinfo.inc index 913b613..309b948 100644 --- a/kernel/sys/bootinfo.inc +++ b/kernel/sys/bootinfo.inc @@ -14,6 +14,7 @@ struc BootInfo { .kernel_start dd ? .kernel_size dd ? .high_mem dd ? + .low_mem dd ? } virtual at 0 BootInfo BootInfo diff --git a/kernel/sys/errno.inc b/kernel/sys/errno.inc index 24422db..14de0c2 100644 --- a/kernel/sys/errno.inc +++ b/kernel/sys/errno.inc @@ -1,2 +1,2 @@ - +ENXIO = 6 ENODEV = 19 diff --git a/kernel/sys/process.inc b/kernel/sys/process.inc new file mode 100644 index 0000000..4723a01 --- /dev/null +++ b/kernel/sys/process.inc @@ -0,0 +1,27 @@ + +struc ProcessGroup { +} + +struc Context { + .flags dd ? + .regs dd ? +} + +struc Process { + .pagedir dd ? + .parent dd ? + .context Context + .next dd ? +} + +PROCESS_STATE_IDL = 0 +PROCESS_STATE_RUN = 1 +PROCESS_STATE_SLEEP = 2 +PROCESS_STATE_STOP = 3 +PROCESS_STATE_ZOMBIE = 4 + +PZERO = 22 +PWAIT = 24 +PLOCK = 36 +PPAUSE = 40 +PUSER = 50 diff --git a/sbin/cryptotools/main.c b/sbin/cryptotools/main.c deleted file mode 100644 index 9933069..0000000 --- a/sbin/cryptotools/main.c +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include -#include - -static char *prg_name; - -struct kernel_header { - uint8_t jump[3]; - uint8_t magic[8]; - uint8_t signature[32]; -}; - -static void -do_keygen() -{ - uint8_t pk[crypto_sign_ed25519_PUBLICKEYBYTES]; - uint8_t sk[crypto_sign_ed25519_SECRETKEYBYTES]; -} - -static void -usage(int retcode) -{ - if (retcode == EXIT_FAILURE) - { - fprintf(stderr, "Try '%s -h' form more information.\n", prg_name); - } - else - { - printf("Usage: %s [-hV] [sign|verify|keygen]\n", prg_name); - printf("\t-h\tdisplay this help and exit\n"); - printf("\t-V\toutput version information\n"); - - printf("\nReport bugs to <%s>\n", MK_BUGREPORT); - } - - exit(retcode); -} - -static void -version(void) -{ - printf("%s commit %s\n", prg_name, MK_COMMIT); - exit(EXIT_SUCCESS); -} - -int -main(int argc, char **argv) -{ - prg_name = argv[0]; - - if (sodium_init() < 0) abort(); - - while ((argc > 1) && (argv[1][0] == '-')) - { - switch (argv[1][1]) - { - case 'h': - usage(EXIT_SUCCESS); - break; - case 'V': - version(); - } - - argv++; - argc--; - } - - if (argc <= 1) usage(EXIT_FAILURE); - - return (EXIT_SUCCESS); -} diff --git a/sbin/parted/main.c b/sbin/parted/main.c index 2f23703..ac42de4 100644 --- a/sbin/parted/main.c +++ b/sbin/parted/main.c @@ -107,7 +107,7 @@ main(int argc, char **argv) c = argv[1][2] - '0'; argv++; argc--; - if (c != 0 && c != 1 && c != 2 && c != 3) + if (c < 0 && c > 3) { usage(EXIT_FAILURE); }