From 9a54c41ad07ec00316bb8fcdeba51c215446d454 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Mon, 22 Aug 2022 15:12:25 +0200 Subject: ext2 as multiboot2 module --- kernel/include/disc.h | 21 +++++++ kernel/include/ext2.h | 144 ++++++++++++++++++++++++++++++++++++++++++++ kernel/include/heap.h | 4 +- kernel/include/multiboot2.h | 13 +++- 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 kernel/include/disc.h create mode 100644 kernel/include/ext2.h (limited to 'kernel/include') diff --git a/kernel/include/disc.h b/kernel/include/disc.h new file mode 100644 index 0000000..7b4fd0b --- /dev/null +++ b/kernel/include/disc.h @@ -0,0 +1,21 @@ +#ifndef DISC_H +#define DISC_H + +#include + +#include + +#define SECTOR_SIZE 512 + +struct disc_sector_t { + uint8_t data[SECTOR_SIZE]; +}; +typedef struct disc_sector_t disc_sector_t; + +extern disc_sector_t* disc; + +void disc_init(void); +void read_sector(size_t sector_num, disc_sector_t* disc_sector); +void write_sector(size_t sector_num, disc_sector_t* disc_sector); + +#endif diff --git a/kernel/include/ext2.h b/kernel/include/ext2.h new file mode 100644 index 0000000..1760fef --- /dev/null +++ b/kernel/include/ext2.h @@ -0,0 +1,144 @@ +#ifndef EXT2_H +#define EXT2_H + +#include + +#include + +struct ext2_superblock_t { +// base fields + uint32_t inodes_count; + uint32_t blocks_count; + uint32_t superuser_blocks; + uint32_t free_blocks; + uint32_t free_inodes; + uint32_t superblock_block; + uint32_t block_size; + uint32_t fragment_size; + uint32_t blocks_per_group; + uint32_t fragments_per_group; + uint32_t inodes_per_group; + uint32_t last_mount_time; + uint32_t last_write_time; + uint16_t mounts_since_fcsk; + uint16_t mounts_before_fcsk; + uint16_t signature; + uint16_t state; + uint16_t on_error; + uint16_t version_minor; + uint32_t last_time_fcsk; + uint32_t interval_fcsk; + uint32_t os_id; + uint32_t version_major; + uint16_t superuser_id; + uint16_t supergroup_id; +// extended fields + uint32_t first_inode; + uint16_t inode_size; + uint16_t superblock_group; + uint32_t optional_features; + uint32_t required_features; + uint32_t ro_features; + uint8_t id[16]; + uint8_t volume_name[16]; + uint8_t path_name[64]; + uint32_t compression; + uint8_t blocks_for_files; + uint8_t blocks_for_dirs; + uint16_t unused; + uint8_t journal_id[16]; + uint32_t journal_inode; + uint32_t journal_device; + uint32_t orphan_inode_head; + // unused +}; +typedef struct ext2_superblock_t ext2_superblock_t; + +struct ext2_bg_desc_t { + uint32_t block_bitmap; + uint32_t inode_bitmap; + uint32_t inode_block_address; + uint16_t free_blocks; + uint16_t free_inodes; + uint16_t dir_count; +}; +typedef struct ext2_bg_desc_t ext2_bg_desc_t; + +struct ext2_inode_t { + uint16_t type_perms; + uint16_t user_id; + uint32_t size_lower; + uint32_t last_accessed; + uint32_t creation_time; + uint32_t last_modified; + uint32_t deletion_time; + uint16_t group_id; + uint16_t hard_links_count; + uint32_t sectors_used; + uint32_t flags; + uint8_t os_specific1[4]; + uint32_t dbp[12]; + uint32_t sibp; + uint32_t dibp; + uint32_t tibp; + uint32_t gen_number; + uint32_t eab; + uint32_t size_upper; + uint32_t fragment_address; + uint8_t os_specific2[12]; +}; +typedef struct ext2_inode_t ext2_inode_t; + +// inode type +#define TYPE_FIFO 0x1000 +#define TYPE_CHAR_DEV 0x2000 +#define TYPE_DIR 0x4000 +#define TYPE_BLOCK DEV 0x6000 +#define TYPE_FILE 0x8000 +#define TYPE_SYMLINK 0xA000 +#define TYPE_SOCKET 0xC000 + +// inode permission +#define PERM_OE 0x001 +#define PERM_OR 0x002 +#define PERM_OW 0x004 +#define PERM_GE 0x008 +#define PERM_GR 0x010 +#define PERM_GW 0x020 +#define PERM_UE 0x040 +#define PERM_UR 0x080 +#define PERM_UW 0x100 +#define PERM_STICKY 0x200 +#define PERM_GID 0x400 +#define PERM_UID 0x800 + +struct ext2_dentry_t { + uint32_t inode; + uint16_t size; + uint8_t name_length_lower; + uint8_t type; + char* name; +}; +typedef struct ext2_dentry_t ext2_dentry_t; + +extern ext2_superblock_t* ext2_superblock; + +// size of structs +#define BG_DESC_SIZE 32 +#define BLOCK_SIZE (uint32_t)(1024 << ext2_superblock->block_size) +#define INODE_SIZE (ext2_superblock->inode_size) +#define INODES_PER_BLOCK (BLOCK_SIZE / INODE_SIZE) + + +void read_block(uint32_t block_num, void* block_ptr); +void read_superblock(ext2_superblock_t* ext2_superblock); +void read_bg_desc(uint32_t bg_desc, ext2_bg_desc_t* ext2_bg_desc); +void read_inode(uint32_t starting_block_num, uint32_t inode_index, ext2_inode_t* ext2_inode); +list_t* directory_to_entries(uint32_t inode); +char* files_to_buffer(uint32_t inode); +list_t* path_to_list(const char* path); +uint32_t path_to_inode(const char* path); +void ls(uint32_t inode); +void print(uint32_t inode); + +#endif diff --git a/kernel/include/heap.h b/kernel/include/heap.h index 88a9ad0..62d3b6f 100644 --- a/kernel/include/heap.h +++ b/kernel/include/heap.h @@ -3,8 +3,8 @@ #include -#define HEAP_VMEM_ADDR 0xc0400000 -#define HEAP_PMEM_ADDR 0x00400000 +#define HEAP_VMEM_ADDR 0xc1000000 +#define HEAP_PMEM_ADDR 0x01000000 #define HEAP_SIZE 0x01000000 #define HEAP_BLOCK_SIZE 0x00000010 diff --git a/kernel/include/multiboot2.h b/kernel/include/multiboot2.h index 6d4a86f..994dbc5 100644 --- a/kernel/include/multiboot2.h +++ b/kernel/include/multiboot2.h @@ -37,6 +37,15 @@ struct mb2_tag_mmap_entry { }; typedef struct mb2_tag_mmap_entry mb2_tag_mmap_entry; +struct mb2_tag_module { + uint32_t type; + uint32_t size; + uint32_t mod_start; + uint32_t mod_end; + char* name; +}; +typedef struct mb2_tag_module mb2_tag_module; + // multiboot2 magic check #define MB2_MAGIC 0x36D76289 @@ -45,16 +54,18 @@ typedef struct mb2_tag_mmap_entry mb2_tag_mmap_entry; #define MB2_TAG_END 0 #define MB2_TAG_CMDLINE 1 #define MB2_TAG_BOOTLOADER 2 -#define MB2_TAG_MODULES 3 +#define MB2_TAG_MODULE 3 #define MB2_TAG_MEM 4 #define MB2_TAG_BIOS 5 #define MB2_TAG_MMAP 6 #define MB2_TAG_VBE 7 #define MB2_TAG_FB 8 +extern mb2_tag_module* ext2_module; void read_mb2(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic); void init_fb(mb2_tag_fb* tag_fb); void init_mmap(mb2_tag_mmap* tag_mmap); +void init_module(mb2_tag_module* tag_module); #endif -- cgit v1.2.3