From 93934c660506580dc4146f6c8bf7d8bb45fd71ae Mon Sep 17 00:00:00 2001 From: Aren Date: Mon, 22 Jan 2024 17:45:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/limine.cfg | 4 ++-- kernel/cpu/pit.c | 3 ++- kernel/cpu/task.c | 10 ++++++++-- kernel/lock.c | 2 +- kernel/mem.c | 7 ++++--- kernel/mod.c | 8 ++++++-- kernel/start.c | 5 ++--- modlib/lib/build.sh | 0 modules/imfs/main.c | 18 +++++++++++------- modules/ps2/main.c | 25 ++++++++++++++----------- 10 files changed, 50 insertions(+), 32 deletions(-) mode change 100644 => 100755 modlib/lib/build.sh diff --git a/configs/limine.cfg b/configs/limine.cfg index d0932cf..2047232 100644 --- a/configs/limine.cfg +++ b/configs/limine.cfg @@ -24,8 +24,8 @@ TERM_WALLPAPER=boot:///mod/boot.jpg MODULE_PATH=boot:///mod/simd.ko MODULE_CMDLINE=[MOD]simd.ko - MODULE_PATH=boot:///mod/pci_data.ko - MODULE_CMDLINE=[MOD]pci_data.ko + #MODULE_PATH=boot:///mod/pci_data.ko + #MODULE_CMDLINE=[MOD]pci_data.ko MODULE_PATH=boot:///mod/pci.ko MODULE_CMDLINE=[MOD]pci.ko diff --git a/kernel/cpu/pit.c b/kernel/cpu/pit.c index 1bf39b3..dec643d 100644 --- a/kernel/cpu/pit.c +++ b/kernel/cpu/pit.c @@ -7,7 +7,7 @@ */ #include -#include +#include #include #include #include @@ -20,5 +20,6 @@ void pit_set_interval(int hz) { } void pit_init( ) { + LOG("PIT установлен\n"); pit_set_interval(1); } \ No newline at end of file diff --git a/kernel/cpu/task.c b/kernel/cpu/task.c index 3c24b1f..c194f06 100644 --- a/kernel/cpu/task.c +++ b/kernel/cpu/task.c @@ -90,10 +90,16 @@ void task_init( ) { uint64_t rsp; uint64_t cr3; + LOG("Создание потока ядра\n"); asm volatile("mov %%rsp, %0" : "=r"(rsp)); asm volatile("mov %%cr3, %0" : "=r"(cr3)); - kernel_task = mem_alloc(sizeof(task_t)); + LOG("Настройка потока ядра\n"); + mem_dump_memory( ); + task_t *new_task = mem_alloc(sizeof(task_t)); + LOG("%x\n", new_task); + kernel_task = new_task; + tool_memset(kernel_task, 0, sizeof(task_t)); kernel_task->id = next_thread_id++; @@ -108,7 +114,7 @@ void task_init( ) { last_task = kernel_task; - task_new_thread(dummy); + LOG("Создание потока dummy\n"); task_new_thread(dummy); test_buf = mem_alloc(8 * 8 * sizeof(uint32_t)); diff --git a/kernel/lock.c b/kernel/lock.c index e625f8d..dc18768 100644 --- a/kernel/lock.c +++ b/kernel/lock.c @@ -37,5 +37,5 @@ void lock_acquire(lock_t lock) { // Запрос разблокировки ресурса void lock_release(lock_t lock) { - lock.lock = 0; + if (lock.lock) { lock.lock = 0; } } \ No newline at end of file diff --git a/kernel/mem.c b/kernel/mem.c index bd66a4f..927d044 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -238,6 +238,7 @@ void mem_free(void *addr) { if (curr->data == addr) { curr->free = 1; merge_blocks(prev ? prev : curr); + mem_merge_all_blocks( ); return; } prev = curr; @@ -319,12 +320,12 @@ void mem_init( ) { LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); // LOG("Размер битовой карты: %u\n", bitmap_size); alloc_init(mem_frame_alloc(1), BLOCK_SIZE); - LOG("%u мегабайт выделено в динамичную память\n", (256 * 16 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024); + LOG("%u мегабайт выделено в динамичную память\n", (256 * 32 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024); // Выделяем по 4 мегабайта в аллокатор динамичной памяти - for (int64_t i = 0; i < 16; i += 8) { mem_add_block(mem_frame_alloc(1024), 1024 * BLOCK_SIZE); } + for (int64_t i = 0; i < 64; i += 8) { mem_add_block(mem_frame_alloc(1024), 1024 * BLOCK_SIZE); } mem_merge_all_blocks( ); - // mem_dump_memory( ); + mem_dump_memory( ); LOG("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n", (bitmap_available * BLOCK_SIZE) / 1024 / 1024, available / 1024 / 1024); diff --git a/kernel/mod.c b/kernel/mod.c index 3822167..1654669 100644 --- a/kernel/mod.c +++ b/kernel/mod.c @@ -60,7 +60,11 @@ 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( ); } + if (module_list[i].after_init != 0) { + LOG("%s.after_init( );\n", module_list[i].name); + module_list[i].after_init( ); + LOG("%s.after_init( );\n", module_list[i].name); + } } } @@ -124,7 +128,7 @@ void mod_init( ) { continue; } - module_info_t (*module_init)(env_t * env) = + module_info_t (*module_init)(env_t *env) = (module_info_t(*)(env_t * env)) elf_entry((elf64_header_t *)module_ptr->address); // LOG("\t->Точка входа: 0x%x\n", module_init); diff --git a/kernel/start.c b/kernel/start.c index b894c27..336769b 100644 --- a/kernel/start.c +++ b/kernel/start.c @@ -31,6 +31,8 @@ void _start( ) { fb_init( ); log_init_mem( ); arch_init( ); + mod_init( ); + mod_after_init( ); LOG("\t\t\t\t *** Базовая Модульная Платформа Операционных Систем " "версии %u.%u.%u %s***\n", @@ -38,9 +40,6 @@ void _start( ) { LOG("\t\t\t\t *** Дата сборки: %s %s ***\n", __DATE__, __TIME__); - mod_init( ); - mod_after_init( ); - pit_init( ); task_init( ); diff --git a/modlib/lib/build.sh b/modlib/lib/build.sh old mode 100644 new mode 100755 diff --git a/modules/imfs/main.c b/modules/imfs/main.c index 2d481e8..fca5a65 100644 --- a/modules/imfs/main.c +++ b/modules/imfs/main.c @@ -143,15 +143,19 @@ 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++) { - if (mod_list[i].data_size) { + uint64_t *mod_count = alloc(sizeof(uint64_t)); + module_info_t *mod_list = mod_list_get(mod_count); + fb_printf("Модулей: %u\n", *mod_count); + for (uint64_t i = 0; i < *mod_count; i++) { + if (mod_list[i].data_size > 0) { + fb_printf("Модуль: %s\n", mod_list[i].name); add_file(mod_list[i].name, "datafile", mod_f, mod_list[i].data, mod_list[i].data_size); } } + fb_printf("Модулей: %u\n", *mod_count); print_folder_contents(root_folder, 0); + free(mod_count); + fb_printf("Модулей: %u\n", *mod_count); } module_info_t __attribute__((section(".minit"))) init(env_t *env) { @@ -170,8 +174,8 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { .name = (char *)"[FS][IMFS]", .message = (char *)"IMFS (in memory filesystem) - файловая система работающая исключительно в ОЗУ.", .type = 0, - .data_size = sizeof(file_t), - .data = (void *)root_folder, + .data_size = 0, + .data = (void *)0, .err_code = 0, .module_id = 0, .irq = 0, diff --git a/modules/ps2/main.c b/modules/ps2/main.c index a9019e8..8600363 100644 --- a/modules/ps2/main.c +++ b/modules/ps2/main.c @@ -7,7 +7,7 @@ static int ru = 1; static char c_char = '\0'; static key_event_t keyboard_buffer; -static inline void virt_exit( ) { +static void virt_exit( ) { fb_printf("Выход для Bochs\n"); outw(0xB004, 0x2000); @@ -87,6 +87,17 @@ static void handler(struct frame *state) { uint8_t scancode = inb(0x60); char c = '\0'; + switch (scancode) { + case 0x01: + fb_printf("ВЫХОД\n"); + virt_exit( ); + break; // Клавиша "ESCAPE" + case 0x4F: // Клавиша "END" + fb_printf("END?\n"); + break; + default: break; + } + if (scancode == 0xE0) { current_state = PREFIX_STATE; after_interrupt( ); @@ -140,14 +151,6 @@ static void handler(struct frame *state) { c_char = c; kbd_free = true; - - switch (scancode) { - case 0x01: virt_exit( ); break; // Клавиша "ESCAPE" - case 0x4F: // Клавиша "END" - fb_printf("END?\n"); - break; - default: break; - } after_interrupt( ); } @@ -161,8 +164,8 @@ module_info_t __attribute__((section(".minit"))) init(env_t *env) { return (module_info_t){ .name = (char *)"[KEYBOARD]", .message = (char *)"PS/2 драйвер", .type = 0, - .data_size = MAX_KEY_BUFFER_SIZE, - .data = (void *)&keyboard_buffer, + .data_size = 0, + .data = (void *)0, .err_code = 0, .module_id = 0, .irq = 33,