Добавлена переменная среды after_init
This commit is contained in:
parent
e0d42d991c
commit
d8e5d5f081
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
|
@ -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)( );
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 1
|
||||
#define VERSION_BUILD 968
|
||||
#define VERSION_BUILD 969
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
23
kernel/mod.c
23
kernel/mod.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"); }
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)( );
|
||||
|
|
|
@ -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 };
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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 };
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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 };
|
||||
}
|
|
@ -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 };
|
||||
}
|
|
@ -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 };
|
||||
}
|
Loading…
Reference in New Issue