Добавлена переменная среды after_init

This commit is contained in:
Aren Elchinyan 2024-01-21 19:25:04 +03:00
parent e0d42d991c
commit d8e5d5f081
20 changed files with 83 additions and 36 deletions

View File

@ -17,7 +17,6 @@
typedef struct task {
uint64_t rax, rbx, rcx, rdx;
uint64_t rsi, rdi, rsp, rbp;
uint64_t cr3;
uint64_t id;
uint64_t ret;

View File

@ -17,6 +17,7 @@
#define HHDM_OFFSET (hhdm_request.response->offset)
void mem_dump_memory( );
void mem_get_stat( );
void mem_init( );
void *mem_alloc(size_t size);
void mem_add_block(void *addr, size_t size);

View File

@ -35,7 +35,9 @@ typedef struct {
} elf64_header_t;
void mod_init( );
void mod_after_init( );
void mod_list_show( );
module_info_t *mod_find(char *tag);
module_info_t *mod_list_get(uint64_t *count);
#endif // mod.h

View File

@ -59,6 +59,7 @@ typedef struct {
uint8_t irq; // Номер прерывания
void *irq_handler; // Адрес обработчика прерываний
void *(*get_func)(uint64_t id);
void (*after_init)( );
} __attribute__((packed)) module_info_t;
typedef struct {
@ -72,6 +73,7 @@ typedef struct {
int (*get_error)( );
sys_info_t *(*get_info)( );
module_info_t *(*get_module)(char *module_id);
module_info_t *(*mod_list_get)(uint64_t *count);
uint64_t (*new_thread)(uint64_t func);
int (*delete_thread)(uint64_t thread_id);
time_t (*get_time)( );

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 1
#define VERSION_BUILD 968
#define VERSION_BUILD 969

View File

@ -22,7 +22,7 @@ void task_switch_asm(task_t *, task_t *);
void task_switch(struct frame *state) {
UNUSED(state);
LOG("Смена потоков\n");
// LOG("Смена потоков\n");
asm volatile("cli");
task_t *next = current_task->next;
@ -30,7 +30,7 @@ void task_switch(struct frame *state) {
current_task = next;
LOG("Смена потоков 2\n");
// LOG("Смена потоков 2\n");
task_switch_asm(last, next);
asm volatile("sti");
}
@ -56,7 +56,6 @@ uint64_t task_new_thread(void (*func)(void *), void *arg) {
new_task->rsp = (uint64_t)new_task->stack + STACK_SIZE - sizeof(uint64_t) * 2;
new_task->stack = stack;
new_task->cr3 = cr3;
new_task->id = next_thread_id++;
new_task->last = current_task;
@ -74,9 +73,7 @@ uint64_t task_new_thread(void (*func)(void *), void *arg) {
}
void dummy(uint64_t n) {
for (;;) {
asm volatile("hlt");
}
for (;;) { asm volatile("hlt"); }
}
void task_init( ) {
@ -93,7 +90,6 @@ void task_init( ) {
tool_memset(kernel_task, 0, sizeof(task_t));
kernel_task->id = next_thread_id++;
kernel_task->cr3 = cr3;
kernel_task->rsp = rsp;
current_task = kernel_task;
@ -103,7 +99,7 @@ void task_init( ) {
last_task = kernel_task;
task_new_thread(dummy, 2 + 2);
// task_new_thread(dummy, 2 + 2);
LOG("Потоки инициализированы\n");
}

View File

@ -9,11 +9,10 @@ task_switch_asm:
movq %rdi, 40(%rdi)
movq %rsp, 48(%rdi)
movq %rbp, 56(%rdi)
movq %cr3, %rax
movq %rax, 64(%rdi)
movq 64(%rsi), %rax
movq %rax, %cr3
movq %rax, 64(%rdi)
movq 56(%rsi), %rbp
movq 48(%rsi), %rsp
movq 40(%rsi), %rdi

View File

@ -50,6 +50,7 @@ void mod_list_show( ) {
LOG("Описание модуля: %s\n", module_list[i].message);
LOG("Тип модуля: %u\n", module_list[i].type);
LOG("Код ошибки модуля: %u\n", module_list[i].err_code);
if (module_list[i].data_size) {
LOG("Размер данных: %u\n", module_list[i].data_size);
LOG("Адрес данных: 0x%x\n", module_list[i].data);
@ -57,15 +58,28 @@ void mod_list_show( ) {
}
}
void mod_after_init( ) {
for (uint64_t i = 0; i < modules_count; i++) {
if (module_list[i].after_init != 0) { module_list[i].after_init( ); }
}
}
module_info_t *mod_list_get(uint64_t *count) {
*count = modules_count;
return module_list;
}
module_info_t *mod_find(char *tag) {
for (uint64_t i = 0; i < modules_count; i++) {
if (tool_starts_with(module_list[i].name, tag)) { return &module_list[i]; }
}
return (module_info_t *)NULL;
}
void mod_init( ) {
module_response = module_request.response;
uint64_t module_count = module_response->module_count;
struct limine_file *module_ptr = (struct limine_file *)0;
@ -126,7 +140,10 @@ void mod_init( ) {
module_list[modules_count].message = ret.message;
module_list[modules_count].data_size = ret.data_size;
module_list[modules_count].get_func = ret.get_func;
module_list[modules_count].after_init = ret.after_init;
if (ret.data_size != 0) { module_list[modules_count].data = ret.data; }
if (ret.irq != 0) {
if (ret.irq_handler != 0) {
LOG("Установлен обработчик прерывания [%u] по адресу 0x%x в модуле %s\n", ret.irq, ret.irq_handler,
@ -143,6 +160,7 @@ void mod_init( ) {
void mod_add(module_info_t module) {
if (modules_count == 0) {
module_list = (module_info_t *)mem_alloc(sizeof(module_info_t));
if (module_list == NULL) {
LOG("Ошибка выделения памяти для массива module_list\n");
return;
@ -150,10 +168,12 @@ void mod_add(module_info_t module) {
} else {
module_info_t *new_module_list =
(module_info_t *)mem_realloc(module_list, (modules_count + 1) * sizeof(module_info_t));
if (new_module_list == NULL) {
LOG("Ошибка выделения памяти для массива module_list\n");
return;
}
module_list = new_module_list;
}
@ -170,12 +190,15 @@ void mod_del(module_info_t *module) {
for (uint64_t i = 0; i < modules_count; i++) {
if (&module_list[i] == module) {
for (uint64_t j = i; j < modules_count - 1; j++) { module_list[j] = module_list[j + 1]; }
modules_count--;
module_list = (module_info_t *)mem_realloc(module_list, modules_count * sizeof(module_info_t));
if (module_list == NULL) {
LOG("Ошибка выделения памяти для массива module_list\n");
return;
}
LOG("Модуль удален\n");
return;
}

View File

@ -22,10 +22,10 @@ void _start( ) {
asm volatile("cli");
log_init( );
fb_init( );
arch_init( );
mem_init( );
fb_init( );
log_init_mem( );
arch_init( );
LOG("\t\t\t\t *** Базовая Модульная Платформа Операционных Систем "
"версии %u.%u.%u %s***\n",
@ -43,5 +43,7 @@ void _start( ) {
asm volatile("sti");
mod_after_init( );
for (;;) { asm volatile("hlt"); }
}

View File

@ -71,6 +71,7 @@ env_t *sys_install(env_t *module) {
module->get_error = &sys_get_error;
module->get_info = &sys_get_info;
module->get_module = &sys_get_module;
module->mod_list_get = &mod_list_get;
module->new_thread = &sys_new_thread;
module->delete_thread = &sys_delete_thread;
module->get_time = &sys_get_time;

View File

@ -13,6 +13,7 @@ void *(*alloc)(uint64_t size);
void (*free)(void *ptr);
void (*fb_printf)(char *str, ...);
module_info_t *(*get_module)(char *module_id);
module_info_t *(*mod_list_get)(uint64_t *count);
framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void (*exit)(int code);
@ -29,6 +30,7 @@ void init_env(env_t *loader_env) {
alloc = loader_env->alloc;
free = loader_env->free;
get_module = loader_env->get_module;
mod_list_get = loader_env->mod_list_get;
alloc_framebuffer = loader_env->alloc_framebuffer;
free_framebuffer = loader_env->free_framebuffer;
exit = loader_env->exit;

View File

@ -16,6 +16,7 @@ extern void *(*alloc)(uint64_t size);
extern void (*free)(void *ptr);
extern void (*fb_printf)(char *str, ...);
extern module_info_t *(*get_module)(char *module_id);
extern module_info_t *(*mod_list_get)(uint64_t *count);
extern framebuffer_t (*alloc_framebuffer)( );
extern void (*free_framebuffer)(framebuffer_t *frame);
extern void (*exit)(int code);

View File

@ -100,11 +100,12 @@ typedef struct {
uint8_t irq;
int_entry_t irq_handler;
void *(*get_func)(uint64_t id);
void (*after_init)( );
} __attribute__((packed)) module_info_t;
typedef struct {
uint64_t offset;
void (*fb_printf)(char *str, ...);
void (*fb_printf)(char *str, ...); // Временная функция
framebuffer_t (*alloc_framebuffer)( );
void (*free_framebuffer)(framebuffer_t *frame);
void *(*alloc)(uint64_t size);
@ -113,6 +114,7 @@ typedef struct {
int (*get_error)( );
sys_info_t *(*get_info)( );
module_info_t *(*get_module)(char *module_id);
module_info_t *(*mod_list_get)(uint64_t *count);
uint64_t (*new_thread)(uint64_t func);
int (*delete_thread)(uint64_t thread_id);
time_t (*get_time)( );

View File

@ -86,5 +86,6 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0 };
.get_func = 0,
.after_init = 0 };
}

View File

@ -11,8 +11,7 @@ fi
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o hello.o
$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c lol.c -o lol.o
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld lol.o hello.o -L../../modlib/lib/ -lmod -o hello.ko
$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld hello.o -L../../modlib/lib/ -lmod -o hello.ko
cp hello.ko ../bin/
echo "Сборка завершена, файл: hello.ko"

View File

@ -15,5 +15,6 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0 };
.get_func = 0,
.after_init = 0 };
}

View File

@ -22,6 +22,10 @@ typedef struct folder_t {
} folder_t;
folder_t *root_folder = NULL;
folder_t *cache_f = NULL;
folder_t *docs_f = NULL;
folder_t *media_f = NULL;
folder_t *mod_f = NULL;
folder_t *create_folder(char *name, folder_t *parent) {
folder_t *folder = alloc(sizeof(folder_t));
@ -72,6 +76,12 @@ void write_file(file_t *file, void *data, size_t size) {
file->size += size;
}
file_t *add_file(char *name, char *type, folder_t *folder, void *data, size_t size) {
file_t *file = create_file(name, type, folder);
write_file(file, data, size);
return file;
}
void read_file(file_t *file, char *buffer, size_t size) {
memcpy(buffer, file->data, size);
}
@ -120,7 +130,7 @@ void print_folder_contents(folder_t *folder, size_t depth) {
while (file != NULL) {
for (size_t i = 0; i < depth + 1; i++) { fb_printf("\t"); }
fb_printf("- %s.%s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024);
fb_printf("- %8s %4s | %8u килобайт\n", file->name, file->type, (file->size + 1024) / 1024);
file = file->next;
}
@ -132,26 +142,28 @@ void print_folder_contents(folder_t *folder, size_t depth) {
}
}
static void main( ) {
uint64_t mod_count = 0;
module_info_t *mod_list = mod_list_get(&mod_count);
for (uint64_t i = 0; i < mod_count; i++) {
add_file(mod_list[i].name, "", mod_f, mod_list[i].data, mod_list[i].data_size);
}
print_folder_contents(root_folder, 0);
}
module_info_t __attribute__((section(".minit"))) init(env_t *env) {
init_env(env);
create_folder("", NULL);
folder_t *cache_f = create_folder("cache", root_folder);
folder_t *docs_f = create_folder("docs", root_folder);
folder_t *media_f = create_folder("media", root_folder);
cache_f = create_folder("cache", root_folder);
docs_f = create_folder("docs", root_folder);
media_f = create_folder("media", root_folder);
mod_f = create_folder("mod", root_folder);
file_t *readme = create_file("readme", "txt", root_folder);
write_file(readme, "БМПОС 2023-2024", 21);
module_info_t *boot_tga = get_module("[BOOTIMG]");
if (boot_tga != NULL) {
file_t *boot_img = create_file("boot", "tga", media_f);
write_file(boot_img, boot_tga->data, boot_tga->data_size);
}
print_folder_contents(root_folder, 0);
return (module_info_t){
.name = (char *)"[FS][IMFS]",
.message = (char *)"IMFS (in memory filesystem) - файловая система работающая исключительно в ОЗУ.",
@ -162,6 +174,7 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0
.get_func = 0,
.after_init = main
};
}

View File

@ -138,5 +138,6 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0 };
.get_func = 0,
.after_init = 0 };
}

View File

@ -80,5 +80,6 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0 };
.get_func = 0,
.after_init = 0 };
}

View File

@ -38,5 +38,6 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) {
.module_id = 0,
.irq = 0,
.irq_handler = 0,
.get_func = 0 };
.get_func = 0,
.after_init = 0 };
}