Fri, 24 Mar 2023 19:51:50 +0100
5 files changed,
46 insertions(+),
7 deletions(-)
M
include/string.h
→
include/string.h
@@ -34,5 +34,6 @@ void *memset (void *ptr, int value, size_t num);
unsigned int strlen (const char *str); char *strcpy(char *destination, const char *source); +int strcmp(const char *str1, const char *str2); #endif
M
src/boot/fat.h
→
src/boot/fat.h
@@ -8,5 +8,6 @@ void *FAT_read_sector_offset(uint32_t lba, uint32_t *offset);
void *FAT_read_cluster(uint16_t cluster, void *buffer); uint16_t FAT_next_cluster(uint16_t cluster); int FAT_root_dir_next(int index, char *fname_buffer, uint16_t *first_cluster, uint32_t *file_size); +void *FAT_find_file(const char *fname); #endif
M
src/kernel/fat.c
→
src/kernel/fat.c
@@ -184,3 +184,24 @@ return low | high;
} } +void *FAT_find_file(const char *fname) { + int i = 0; + + void *addr = (void *)(0); + while (1) { + char buffer[832]; + uint16_t first_cluster; + uint32_t file_size; + + i = FAT_root_dir_next(i, buffer, &first_cluster, &file_size); + if (i <= 0) { break; } + + if (strcmp(buffer, fname) == 0) { + // file found + addr = FAT_read_sector_offset(data_lba + ((first_cluster - 2) * boot_sect->sect_per_cluster), NULL); + break; + } + } + + return addr; +}
M
src/kernel/main.c
→
src/kernel/main.c
@@ -18,6 +18,7 @@ #include "cedos/fat.h"
#include "linker.h" #include "assert.h" +#include "string.h" int os_init(void) { core_init();@@ -168,17 +169,16 @@ }
printk("\n"); } - while (1) {} - // create test tasks printk("Creating tasks.\n"); printk("Loading ELF executable.\n"); - VIRT_ADDR addr = (uint32_t)(KERNEL_VMA) + (uint32_t)(0x8600 - (int)KERNEL_LMA); - printk("ELF address: %p\n", addr); - elf_exec(addr, 0x1000, "app1", "Hello World!"); - elf_exec(addr, 0x1000, "app2", "Hello World!"); - elf_exec(addr, 0x1000, "app3", "Hello World!"); + VIRT_ADDR elf_addr = FAT_find_file("apps.o"); + assert(elf_addr != (void*)(0)); + printk("ELF address: %p\n", elf_addr); + elf_exec(elf_addr, 0x1000, "app1", "Hello World!"); + elf_exec(elf_addr, 0x1000, "app2", "Hello World!"); + elf_exec(elf_addr, 0x1000, "app3", "Hello World!"); printk("Starting scheduler.\n"); sched_start();
M
src/kernel/string.c
→
src/kernel/string.c
@@ -34,4 +34,20 @@ unsigned int strlen (const char *str) {
int i = 0; while (str[i]) { i++; } return i; +} + +int strcmp(const char *str1, const char *str2) { + int i = 0; + + while (1) { + if (str1[i] != str2[i]) { + return str1[i] - str2[i]; + } + + if (str1[i] == 0) { + return 0; + } + + i++; + } }