From 5d4ebbe4156c503cc7a6e9a46f23744f424d810c Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Sun, 29 Oct 2023 16:12:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 ++-- configs/limine.cfg | 8 ++-- include/arch.h | 1 + include/fb.h | 9 ++++ include/lock.h | 4 +- include/version.h | 2 +- kernel/arch/arch.c | 32 +++++++++++++++ kernel/arch/cpu.c | 82 ++++++++++++++++++------------------- kernel/arch/gdt.c | 2 +- kernel/arch/idt.c | 36 ++++++++-------- kernel/arch/pit.c | 2 +- kernel/fb.c | 2 +- kernel/lock.c | 2 +- kernel/main/main.c | 15 ++++--- kernel/mem.c | 34 ++++++++------- kernel/mod.c | 46 ++++++++++----------- kernel/start.c | 14 +++---- modules/helloworld/build.sh | 4 +- modules/helloworld/main.c | 11 +++-- modules/music/build.sh | 4 +- modules/music/main.c | 21 ++++++---- pbuild.py | 62 ++++++++++++---------------- 22 files changed, 216 insertions(+), 186 deletions(-) diff --git a/.gitignore b/.gitignore index 8629f39..dadc93a 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,8 @@ ovmf/ iso_root/ modules/helloworld/helloworld.elf modules/com/com.elf -modules/helloworld/hello.o -modules/helloworld/hello.so -*.so -*.o +modules/helloworld/hello.o +modules/helloworld/hello.ko +*.so +*.o +*.ko diff --git a/configs/limine.cfg b/configs/limine.cfg index a88e74a..50bb845 100644 --- a/configs/limine.cfg +++ b/configs/limine.cfg @@ -18,8 +18,8 @@ BACKGROUND_PATH=boot:///boot.tga MODULE_PATH=boot:///boot.tga MODULE_CMDLINE=[BOOTIMG] - MODULE_PATH=boot:///mod/hello.so - MODULE_CMDLINE=[MOD]hello.so + MODULE_PATH=boot:///mod/hello.ko + MODULE_CMDLINE=[MOD]hello.ko - MODULE_PATH=boot:///mod/music.so - MODULE_CMDLINE=[MOD]music.so \ No newline at end of file + MODULE_PATH=boot:///mod/music.ko + MODULE_CMDLINE=[MOD]music.ko \ No newline at end of file diff --git a/include/arch.h b/include/arch.h index f4dc8bb..96a57ce 100644 --- a/include/arch.h +++ b/include/arch.h @@ -17,6 +17,7 @@ void cpu_init( ); void gdt_init( ); void idt_init( ); void idt_set_int(uint8_t vector, void *int_handler); +uint64_t arch_get_tick( ); static inline void outb(uint16_t port, uint8_t val) { asm volatile("outb %0, %1" : : "a"(val), "Nd"(port)); diff --git a/include/fb.h b/include/fb.h index dd9fff6..f607fff 100644 --- a/include/fb.h +++ b/include/fb.h @@ -13,6 +13,15 @@ #include #include #include +#include + +#define GET_TICK_BIG arch_get_tick_b( ) +#define GET_TICK_lOW arch_get_tick_l( ) + +#define LOG(...) \ + fb_printf("[%u.%u]%s() (%s:%d) ", GET_TICK_BIG, GET_TICK_lOW, __func__, \ + __FILE__, __LINE__); \ + fb_printf(__VA_ARGS__) void fb_init( ); void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf); diff --git a/include/lock.h b/include/lock.h index 4062a37..2e05492 100644 --- a/include/lock.h +++ b/include/lock.h @@ -18,7 +18,9 @@ typedef struct { } lock_t; #define LOCK_INIT \ - (lock_t) { 0, __FILE__ } + (lock_t) { \ + 0, __FILE__ \ + } int lock_swap(lock_t* lock); void lock_acquire(lock_t* lock); diff --git a/include/version.h b/include/version.h index 0baf76a..57e5812 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 1 -#define VERSION_BUILD 301 +#define VERSION_BUILD 320 diff --git a/kernel/arch/arch.c b/kernel/arch/arch.c index 54bdda8..e326b28 100644 --- a/kernel/arch/arch.c +++ b/kernel/arch/arch.c @@ -8,6 +8,38 @@ #include +static uint64_t kernel_start_ticks = 0; +static uint64_t kernel_ticks = 0; + +uint64_t rdtsc( ) { + unsigned int lo, hi; + asm volatile("rdtsc" : "=a"(lo), "=d"(hi)); + return ((uint64_t)hi << 32) | lo; +} + +uint64_t arch_get_tick( ) { + if (kernel_start_ticks == 0) { + kernel_start_ticks = rdtsc( ); + return 0; + } + + kernel_ticks = rdtsc( ) - kernel_start_ticks; + + return kernel_ticks; +} + +uint64_t arch_get_tick_b( ) { + uint64_t tick = arch_get_tick( ) + 1; + + return tick / 1000000; +} + +uint64_t arch_get_tick_l( ) { + uint64_t tick = arch_get_tick( ) + 1; + + return tick % 1000000; +} + void arch_init( ) { gdt_init( ); idt_init( ); diff --git a/kernel/arch/cpu.c b/kernel/arch/cpu.c index 0f61529..40ecdfd 100644 --- a/kernel/arch/cpu.c +++ b/kernel/arch/cpu.c @@ -69,8 +69,8 @@ static void l2_cache( ) { assoc = (ecx >> 12) & 0x07; cache = (ecx >> 16) & 0xFFFF; - fb_printf("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", - lsize, assoc, cache); + LOG("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", lsize, + assoc, cache); } static void do_amd( ) { @@ -87,9 +87,9 @@ static void do_amd( ) { cpu_model = (eax >> 4) & 0x0F; cpu_family = (eax >> 8) & 0x0F; - fb_printf("Используется процессор AMD, 0x8FFFFFFF = [%s]\n", eggs_string); - fb_printf("cpu_model = [%u]\n", cpu_model); - fb_printf("cpu_family = [%u]\n", cpu_family); + LOG("Используется процессор AMD, 0x8FFFFFFF = [%s]\n", eggs_string); + LOG("cpu_model = [%u]\n", cpu_model); + LOG("cpu_family = [%u]\n", cpu_family); } static void brandname( ) { @@ -106,7 +106,7 @@ static void brandname( ) { brand_string[48] = 0; manufacturer_string[12] = 0; - fb_printf("[CPUID] manufacturer [%s]\n", manufacturer_string); + LOG("[CPUID] manufacturer [%s]\n", manufacturer_string); cpuid(0x80000000, &eax, &ebx, &ecx, &edx); if (eax >= 0x80000004) { @@ -114,7 +114,7 @@ static void brandname( ) { cpuid(0x80000003, &brand[4], &brand[5], &brand[6], &brand[7]); cpuid(0x80000004, &brand[8], &brand[9], &brand[10], &brand[11]); tool_memcpy(brand_string, brand, 48); - fb_printf("[CPUID] 0x80000002:0x80000004 [%s]\n", brand_string); + LOG("[CPUID] 0x80000002:0x80000004 [%s]\n", brand_string); } if (manufacturer[0] == 0x68747541) { do_amd( ); } @@ -124,106 +124,102 @@ void cpu_init( ) { uint32_t eax, ebx, ecx, edx; cpuid(1, &eax, &ebx, &ecx, &edx); - if ((edx >> 0) & 1) { fb_printf("FPU(x87) поддерживается!\n"); } + if ((edx >> 0) & 1) { LOG("FPU(x87) поддерживается!\n"); } if ((edx >> 22) & 1) { acpi_msrs_support = true; - fb_printf("Встроенный терморегулятор MSRS для ACPI\n"); - fb_printf("Температура: %u (в QEMU/KVM всегда 0)\n", - get_cpu_temperature( )); + LOG("Встроенный терморегулятор MSRS для ACPI\n"); + LOG("Температура: %u (в QEMU/KVM всегда 0)\n", get_cpu_temperature( )); } if ((edx >> 23) & 1) { mmx_support = true; - fb_printf("MMX поддерживается!\n"); + LOG("MMX поддерживается!\n"); } if ((edx >> 25) & 1) { sse2_support = true; - fb_printf("SSE2 поддерживается!\n"); + LOG("SSE2 поддерживается!\n"); // sse_init( ); } cpuid(1, &eax, &ebx, &ecx, &edx); if ((edx >> 29) & 1) { - fb_printf("Термоконтроллер автоматически ограничивает температуру\n"); + LOG("Термоконтроллер автоматически ограничивает температуру\n"); } if ((ecx >> 28) & 1) { avx_support = true; - fb_printf("AVX поддерживается!\n"); + LOG("AVX поддерживается!\n"); } - if ((ecx >> 26) & 1) { fb_printf("XSAVE поддерживается!\n"); } + if ((ecx >> 26) & 1) { LOG("XSAVE поддерживается!\n"); } if ((ecx >> 30) & 1) { rdrnd_support = true; - fb_printf("RDRND поддерживается!\n"); + LOG("RDRND поддерживается!\n"); } cpuid(0x80000000, &eax, &ebx, &ecx, &edx); - fb_printf("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax, - eax); + LOG("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax, eax); cpuid(0x80000001, &eax, &ebx, &ecx, &edx); - if ((edx >> 5) & 1) { fb_printf("Регистры MSR подерживаются!\n"); } + if ((edx >> 5) & 1) { LOG("Регистры MSR подерживаются!\n"); } if ((edx >> 6) & 1) { - fb_printf("Расширение физического адреса поддерживается!\n"); + LOG("Расширение физического адреса поддерживается!\n"); } if ((edx >> 7) & 1) { - fb_printf("Исключение проверки компьютера (MCE) поддерживается!\n"); + LOG("Исключение проверки компьютера (MCE) поддерживается!\n"); } if ((edx >> 9) & 1) { - fb_printf("Усовершенствованный программируемый контроллер прерываний " - "поддерживается!\n"); + LOG("Усовершенствованный программируемый контроллер прерываний " + "поддерживается!\n"); } if ((edx >> 10) & 1) { fb_printf( "SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n"); } - if ((edx >> 11) & 1) { fb_printf("SYSCALL/SYSRET подерживаются!\n"); } + if ((edx >> 11) & 1) { LOG("SYSCALL/SYSRET подерживаются!\n"); } - // if ((edx >> 26) & 1) { fb_printf("Гигабайтные страницы + // if ((edx >> 26) & 1) { LOG("Гигабайтные страницы // подерживаются!\n"); } - if ((edx >> 29) & 1) { fb_printf("AMD64 поддерживается!\n"); } - // if ((edx >> 30) & 1) { fb_printf("\"3DNow!\" поддерживается!\n"); } - // if ((edx >> 31) & 1) { fb_printf("\"Extended 3DNow!\" + if ((edx >> 29) & 1) { LOG("AMD64 поддерживается!\n"); } + // if ((edx >> 30) & 1) { LOG("\"3DNow!\" поддерживается!\n"); } + // if ((edx >> 31) & 1) { LOG("\"Extended 3DNow!\" // поддерживается!\n"); } - if ((ecx >> 6) & 1) { fb_printf("SSE4a поддерживается!\n"); } - if ((ecx >> 7) & 1) { fb_printf("Смещенный режим SSE поддерживается!\n"); } + if ((ecx >> 6) & 1) { LOG("SSE4a поддерживается!\n"); } + if ((ecx >> 7) & 1) { LOG("Смещенный режим SSE поддерживается!\n"); } cpuid(0x80000007, &eax, &ebx, &ecx, &edx); if ((ebx >> 0) & 1) { - fb_printf("Восстановление после переполнения MCA поддерживается!\n"); + LOG("Восстановление после переполнения MCA поддерживается!\n"); } if ((ebx >> 1) & 1) { - fb_printf("Возможность локализации и восстановления неисправимых " - "программных ошибок поддерживается!\n"); + LOG("Возможность локализации и восстановления неисправимых " + "программных ошибок поддерживается!\n"); } - if ((edx >> 0) & 1) { fb_printf("Датчик температуры поддерживается!\n"); } - if ((edx >> 3) & 1) { fb_printf("Терморегулятор поддерживается!\n"); } + if ((edx >> 0) & 1) { LOG("Датчик температуры поддерживается!\n"); } + if ((edx >> 3) & 1) { LOG("Терморегулятор поддерживается!\n"); } if ((edx >> 4) & 1) { - fb_printf("Аппаратный терморегулятор (HTC) поддерживается!\n"); + LOG("Аппаратный терморегулятор (HTC) поддерживается!\n"); } if ((edx >> 5) & 1) { - fb_printf("Программный терморегулятор (STC) поддерживается!\n"); + LOG("Программный терморегулятор (STC) поддерживается!\n"); } if ((edx >> 6) & 1) { - fb_printf("Управление множителем 100 МГц поддерживается!\n"); + LOG("Управление множителем 100 МГц поддерживается!\n"); } - // fb_printf("0x80000007[ECX] = 0x%x (%u)\n", ecx, ecx); + // LOG("0x80000007[ECX] = 0x%x (%u)\n", ecx, ecx); cpuid(0xC0000000, &eax, &ebx, &ecx, &edx); - if (eax > 0xC0000000) { - fb_printf("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax); - } + if (eax > 0xC0000000) { LOG("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax); } brandname( ); l2_cache( ); diff --git a/kernel/arch/gdt.c b/kernel/arch/gdt.c index d9e2fd8..d0564b7 100644 --- a/kernel/arch/gdt.c +++ b/kernel/arch/gdt.c @@ -62,5 +62,5 @@ void gdt_init( ) { set_gdt_entry(&gdt[10], 0, 0, 0, 0); gdt_load( ); - fb_printf("GDT инициализирован\n"); + LOG("GDT инициализирован\n"); } \ No newline at end of file diff --git a/kernel/arch/idt.c b/kernel/arch/idt.c index aa5a9e8..344a125 100644 --- a/kernel/arch/idt.c +++ b/kernel/arch/idt.c @@ -76,23 +76,23 @@ static void encode_idt_entry(uint8_t vector, void *handler, uint8_t flags) { } static void exception_handler(struct frame state) { - fb_printf("\nПОЛУЧЕНО ИСКЛЮЧЕНИЕ: %s\n", exception_names[state.int_number]); + LOG("\nПОЛУЧЕНО ИСКЛЮЧЕНИЕ: %s\n", exception_names[state.int_number]); - fb_printf(" RAX=%x RBX=%x\n" - " RCX=%x RDX=%x\n" - " RSI=%x RDI=%x\n" - " RBP=%x RSP=%x\n" - " R08=%x R09=%x\n" - " R10=%x R11=%x\n" - " R12=%x R13=%x\n" - " R14=%x R15=%x\n" - " RIP=%x RFLAGS=%x\n" - " CS=%x SS=%x\n" - " ERR=%x INT=%u", - state.rax, state.rbx, state.rcx, state.rdx, state.rsi, state.rdi, - state.rbp, state.rsp, state.r8, state.r9, state.r10, state.r11, - state.r12, state.r13, state.r14, state.r15, state.rip, - state.rflags, state.cs, state.ss, state.err, state.int_number); + LOG(" RAX=%x RBX=%x\n" + " RCX=%x RDX=%x\n" + " RSI=%x RDI=%x\n" + " RBP=%x RSP=%x\n" + " R08=%x R09=%x\n" + " R10=%x R11=%x\n" + " R12=%x R13=%x\n" + " R14=%x R15=%x\n" + " RIP=%x RFLAGS=%x\n" + " CS=%x SS=%x\n" + " ERR=%x INT=%u", + state.rax, state.rbx, state.rcx, state.rdx, state.rsi, state.rdi, + state.rbp, state.rsp, state.r8, state.r9, state.r10, state.r11, + state.r12, state.r13, state.r14, state.r15, state.rip, state.rflags, + state.cs, state.ss, state.err, state.int_number); asm volatile("cli; hlt"); } @@ -101,7 +101,7 @@ void isr_generic(struct frame state) { if (state.int_number < 32) { exception_handler(state); } else { - fb_printf("\nПрерывание! %u необработано :(\n", state.int_number); + LOG("\nПрерывание! %u необработано :(\n", state.int_number); } } @@ -119,7 +119,7 @@ void idt_init( ) { } idt_load( ); - fb_printf("IDT инициализирован\n"); + LOG("IDT инициализирован\n"); } void idt_set_int(uint8_t vector, void *int_handler) { diff --git a/kernel/arch/pit.c b/kernel/arch/pit.c index 84ef4a3..1a04434 100644 --- a/kernel/arch/pit.c +++ b/kernel/arch/pit.c @@ -15,7 +15,7 @@ static uint64_t count = 0; static void isr_generic( ) { - fb_printf("\nТик! %u", count++); + LOG("\nТик! %u", count++); } void pit_set_interval(int hz) { diff --git a/kernel/fb.c b/kernel/fb.c index 17b62aa..aff5898 100644 --- a/kernel/fb.c +++ b/kernel/fb.c @@ -60,7 +60,7 @@ void fb_init( ) { for (uint64_t i = 0; i < width * height; i++) { fb_addr[i] = background; } - fb_printf("0x%x %ux%u\n", fb_addr, width, height); + LOG("0x%x %ux%u\n", fb_addr, width, height); } // Отрисовка буффера по координатам (полезно для картинок) diff --git a/kernel/lock.c b/kernel/lock.c index bb21675..6674639 100644 --- a/kernel/lock.c +++ b/kernel/lock.c @@ -24,7 +24,7 @@ void lock_acquire(lock_t *lock) { if (lock_swap(lock)) { break; } count++; if (count > 1000000) { - fb_printf("%s блокировка зависла", lock->file); + LOG("%s блокировка зависла", lock->file); assert(0); } diff --git a/kernel/main/main.c b/kernel/main/main.c index 39f659c..5073b06 100644 --- a/kernel/main/main.c +++ b/kernel/main/main.c @@ -10,8 +10,7 @@ #include #include -#define TGA_ERR( ) \ - fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__); +#define TGA_ERR( ) LOG("Ошибка декодирования TGA на строчке: %u\n", __LINE__); extern void *bootpng_ptr; extern uint64_t bootpng_size; @@ -41,8 +40,8 @@ unsigned int *tga_parse(unsigned char *ptr, int size) { data = (unsigned int *)mem_alloc((w * h + 2) * sizeof(unsigned int)); if (!data) { - fb_printf("Ошибка декодирования TGA на строчке: %u, %x, %u kb\n", - __LINE__, data, ((w * h + 2) * sizeof(unsigned int)) / 1024); + LOG("Ошибка декодирования TGA на строчке: %u, %x, %u kb\n", __LINE__, + data, ((w * h + 2) * sizeof(unsigned int)) / 1024); return NULL; } @@ -171,16 +170,16 @@ unsigned int *tga_parse(unsigned char *ptr, int size) { } void main( ) { for (uint64_t i = 512; i > 1; i--) { pause( ); } - fb_printf("Загрузка завершена! 1\n"); + LOG("Загрузка завершена! 1\n"); unsigned int *res = tga_parse((uint8_t *)bootpng_ptr, bootpng_size); - fb_printf("Загрузка завершена! 2 %x\n", res); + LOG("Загрузка завершена! 2 %x\n", res); tga_header_t *head = (tga_header_t *)bootpng_ptr; if (res != NULL) { - fb_printf("Размер экрана загрузки: %ux%u \n", res[0], res[1]); + LOG("Размер экрана загрузки: %ux%u \n", res[0], res[1]); } - fb_printf("Размер экрана загрузки: %ux%u \n", head->h, head->w); + LOG("Размер экрана загрузки: %ux%u \n", head->h, head->w); mem_dump_memory( ); fb_print_buf(0, 0, head->w, head->h, (uint32_t *)(res + 2)); diff --git a/kernel/mem.c b/kernel/mem.c index 01670f3..ceaed22 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -64,9 +64,8 @@ void mem_dump_memory( ) { mem_entry_t *curr = first_node; while (curr) { - fb_printf("->0x%x | %u.%u kb | %u | 0x%x\n", &curr->data, - (curr->size) / 1024, (curr->size) % 1024, curr->free, - curr->next); + LOG("->0x%x | %u.%u kb | %u | 0x%x\n", &curr->data, (curr->size) / 1024, + (curr->size) % 1024, curr->free, curr->next); curr = curr->next; } } @@ -229,19 +228,19 @@ void mem_init( ) { mmmap_count = memmap_response->entry_count; struct limine_memmap_entry **mmaps = memmap_response->entries; - fb_printf("Записей в карте памяти: %u\n", memmap_response->entry_count); + LOG("Записей в карте памяти: %u\n", memmap_response->entry_count); // Обработка каждой записи в карте памяти for (int i = 0; i < mmmap_count; i++) { available += mmaps[i]->length; - // fb_printf("\t%d: 0x%x\tдлина: 0x%x\tтип: %s\n", i + 1, + // LOG("\t%d: 0x%x\tдлина: 0x%x\tтип: %s\n", i + 1, // mmaps[i]->base, mmaps[i]->length, memory_types[mmaps[i]->type]); if (mmaps[i]->type == LIMINE_MEMMAP_FRAMEBUFFER) { - fb_printf("На видеопамять BIOS/UEFI выделено: %u мегабайт + %u " - "килобайт\n", - mmaps[i]->length / 1024 / 1024, - (mmaps[i]->length / 1024) % 1024); + LOG("На видеопамять BIOS/UEFI выделено: %u мегабайт + %u " + "килобайт\n", + mmaps[i]->length / 1024 / 1024, + (mmaps[i]->length / 1024) % 1024); } if (!(mmaps[i]->type == LIMINE_MEMMAP_USABLE)) { continue; } @@ -280,20 +279,19 @@ void mem_init( ) { } } - fb_printf("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); - fb_printf("Размер битовой карты: %u\n", bitmap_size); + LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); + LOG("Размер битовой карты: %u\n", bitmap_size); alloc_init(mem_frame_alloc(1), BLOCK_SIZE); - fb_printf("%u мегабайт выделено в динамичную память\n", - (256 * 16 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024); + LOG("%u мегабайт выделено в динамичную память\n", + (256 * 16 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024); for (uint64_t i = 256 * 16; i > 0; i -= BLOCK_SIZE) { add_block(mem_frame_alloc(1024), 1024 * BLOCK_SIZE); } mem_merge_all_blocks( ); mem_dump_memory( ); - fb_printf("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n", - (bitmap_available * BLOCK_SIZE) / 1024 / 1024, - available / 1024 / 1024); + LOG("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n", + (bitmap_available * BLOCK_SIZE) / 1024 / 1024, available / 1024 / 1024); - fb_printf("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); - fb_printf("Проверка менеджера памяти\n"); + LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); + LOG("Проверка менеджера памяти\n"); } \ No newline at end of file diff --git a/kernel/mod.c b/kernel/mod.c index 1f374cf..96cd523 100644 --- a/kernel/mod.c +++ b/kernel/mod.c @@ -42,13 +42,13 @@ static void *elf_entry(void *module_bin, uint64_t size) { elf64_header_t *elf_header = (elf64_header_t *)module_bin; #if 0 - fb_printf(" Класс: ELF64\n"); - fb_printf(" Версия: %u\n", elf_header->e_ident[6]); - fb_printf(" ОС/ABI: %u\n", elf_header->e_ident[7]); - fb_printf(" Тип: %u\n", elf_header->e_type); - fb_printf(" Машина: %u\n", elf_header->e_machine); - fb_printf(" Версия: %u\n", elf_header->e_version); - fb_printf(" Точка входа: 0x%x\n", elf_header->e_entry); + LOG(" Класс: ELF64\n"); + LOG(" Версия: %u\n", elf_header->e_ident[6]); + LOG(" ОС/ABI: %u\n", elf_header->e_ident[7]); + LOG(" Тип: %u\n", elf_header->e_type); + LOG(" Машина: %u\n", elf_header->e_machine); + LOG(" Версия: %u\n", elf_header->e_version); + LOG(" Точка входа: 0x%x\n", elf_header->e_entry); #endif // Возвращаем указатель на точку входа @@ -71,44 +71,44 @@ void mod_init( ) { for (uint64_t i = 0; i < module_count; i++) { module_ptr = module_response->modules[i]; - fb_printf("[%d] %s [%s] 0x%x\n", i, module_ptr->path, - module_ptr->cmdline, module_ptr->address); - fb_printf("->Размер: %u, тип носителя: %u, индекс раздела: %u\n", - module_ptr->size, module_ptr->media_type, - module_ptr->partition_index); + LOG("[%d] %s [%s] 0x%x\n", i, module_ptr->path, module_ptr->cmdline, + module_ptr->address); + LOG("->Размер: %u, тип носителя: %u, индекс раздела: %u\n", + module_ptr->size, module_ptr->media_type, + module_ptr->partition_index); #if 0 - fb_printf("[%d] %s [%s] 0x%x\n", i, module_ptr->path, + LOG("[%d] %s [%s] 0x%x\n", i, module_ptr->path, module_ptr->cmdline, module_ptr->address); - fb_printf("->Размер: %u, тип носителя: %u, индекс раздела: %u\n", + LOG("->Размер: %u, тип носителя: %u, индекс раздела: %u\n", module_ptr->size, module_ptr->media_type, module_ptr->partition_index); - fb_printf("->Идентификатор диска MBR: %u, TFTP IP: %u, TFTP порт: %u\n", + LOG("->Идентификатор диска MBR: %u, TFTP IP: %u, TFTP порт: %u\n", module_ptr->mbr_disk_id, module_ptr->tftp_ip, module_ptr->tftp_port); #endif if (tool_starts_with(module_ptr->cmdline, "[BOOTIMG]")) { - fb_printf("\t\t[BOOTIMG]\n"); + LOG("\t\t[BOOTIMG]\n"); bootpng_ptr = module_ptr->address; bootpng_size = module_ptr->size; continue; } if (!tool_starts_with(module_ptr->cmdline, "[MOD]")) { continue; } modules_count++; - uint64_t (*module_init)(env_t * env) = + module_info_t (*module_init)(env_t * env) = (module_info_t * (*)(env_t * env)) elf_entry(module_ptr->address, module_ptr->size); - fb_printf("\t->Точка входа: 0x%x\n", module_init); + LOG("\t->Точка входа: 0x%x\n", module_init); main_env.offset = module_ptr->address; main_env.info = (module_info_t *)0; main_env.fb_printf = &fb_printf; - uint64_t ret = module_init(&main_env); + module_info_t ret = module_init(&main_env); - fb_printf("Инициализированно с кодом: %u\n", ret); - // fb_printf("Инициализированно с кодом: %u\n", ret->err_code); - // fb_printf("Сообщение из модуля: %s\n\n", ret->message); + LOG("Инициализированно с кодом: %u\n", ret.err_code); + // LOG("Инициализированно с кодом: %u\n", ret->err_code); + // LOG("Сообщение из модуля: %s\n\n", ret->message); } - fb_printf("Модулей обработано: %u\n", modules_count); + LOG("Модулей обработано: %u\n", modules_count); } \ No newline at end of file diff --git a/kernel/start.c b/kernel/start.c index 8b4bee4..3f0b21c 100644 --- a/kernel/start.c +++ b/kernel/start.c @@ -22,14 +22,14 @@ void _start( ) { fb_init( ); arch_init( ); mem_init( ); + + LOG("\t\t\t\t *** Базовая Модульная Платформа Операционных Систем " + "версии %u.%u.%u ***\n", + VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD); + + LOG("\t\t\t\t *** Дата сборки: %s %s ***\n", __DATE__, __TIME__); mod_init( ); - - fb_printf("\t\t\t\t *** Базовая Модульная Платформа Операционных Систем " - "версии %u.%u.%u ***\n", - VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD); - - fb_printf("\t\t\t\t *** Дата сборки: %s %s ***\n", __DATE__, __TIME__); pit_init( ); - fb_printf("Готово!\n"); + LOG("Готово!\n"); for (;;) { asm volatile("hlt"); } } \ No newline at end of file diff --git a/modules/helloworld/build.sh b/modules/helloworld/build.sh index 63ef3da..8fc01e1 100755 --- a/modules/helloworld/build.sh +++ b/modules/helloworld/build.sh @@ -2,5 +2,5 @@ echo "Название: Hello world" echo "Лицензия: Публичное достояние" gcc -mcmodel=large -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o hello.o -gcc -mcmodel=large -Wl,--entry=init -fPIC -shared -nostdlib hello.o -o hello.so -echo "Сборка завершена, файл: hello.so" +gcc -mcmodel=large -Wl,--entry=init -fPIC -shared -nostdlib hello.o -o hello.ko +echo "Сборка завершена, файл: hello.ko" diff --git a/modules/helloworld/main.c b/modules/helloworld/main.c index a8e6283..583ce2c 100644 --- a/modules/helloworld/main.c +++ b/modules/helloworld/main.c @@ -2,11 +2,10 @@ const char name[] = "Привет мир!"; const char message[] = "Привет из модуля!"; -module_info_t info = { .name = (char *)&name, - .message = (char *)&message, - .err_code = 2023, - .func_count = 1 }; -uint64_t init(env_t *env) { - return 0; +module_info_t init(env_t *env) { + return (module_info_t){ .name = (char *)&name, + .message = (char *)&message, + .err_code = 2023, + .func_count = 1 }; } diff --git a/modules/music/build.sh b/modules/music/build.sh index 6c3e497..127db81 100755 --- a/modules/music/build.sh +++ b/modules/music/build.sh @@ -2,5 +2,5 @@ echo "Название: Мелодия из тетриса" echo "Лицензия: Публичное достояние" gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o music.o -gcc -Wl,--entry=init -fPIC -shared -nostdlib music.o -o music.so -echo "Сборка завершена, файл: music.so" +gcc -Wl,--entry=init -fPIC -shared -nostdlib music.o -o music.ko +echo "Сборка завершена, файл: music.ko" diff --git a/modules/music/main.c b/modules/music/main.c index 547e3b4..427c239 100644 --- a/modules/music/main.c +++ b/modules/music/main.c @@ -18,13 +18,13 @@ static inline void play_sound(unsigned int frequency) { uint32_t div; uint8_t tmp; - // Set the PIT to the desired frequency + // Устанавливаем частоту таймера div = 1193180 / frequency; - outb(0x43, 0xb6); + outb(0x43, 0xB6); outb(0x42, (uint8_t)(div)); outb(0x42, (uint8_t)(div >> 8)); - // And play the sound using the PC speaker + // Воспроизводим мелодию tmp = inb(0x61); if (tmp != (tmp | 3)) { outb(0x61, tmp | 3); } } @@ -35,21 +35,26 @@ static void nosound( ) { outb(0x61, tmp); } -int init(env_t *env) { +module_info_t init(env_t *env) { init_env(env); env->fb_printf("Программа инициализирована!\n"); - return 0; + return (module_info_t){ .name = (char *)"Мелодия", + .message = + (char *)"Надеюсь скоро тут будет тетрис!", + .err_code = 404, + .func_count = 1 }; + // Массив с нотами unsigned int tetris_notes[] = { 0 }; // Расчет количества нот в мелодии - int num_notes = sizeof(tetris_notes) / sizeof(tetris_notes[0]); + uint64_t num_notes = sizeof(tetris_notes) / sizeof(tetris_notes[0]); // Начальное значение для подсчета времени int note_duration = 1000000; // 1 секунда // Зацикленное воспроизведение мелодии в течение минуты - for (int i = 0; i < num_notes; i++) { + for (uint64_t i = 0; i < num_notes; i++) { // Воспроизведение ноты с заданным временем play_sound(tetris_notes[i]); usleep(note_duration); @@ -57,6 +62,4 @@ int init(env_t *env) { // Уменьшение времени для следующей ноты note_duration -= note_duration / 24; // Уменьшение на 1/24 каждый раз } - - return 0; } \ No newline at end of file diff --git a/pbuild.py b/pbuild.py index d5adddc..a5bdfb9 100644 --- a/pbuild.py +++ b/pbuild.py @@ -126,44 +126,33 @@ def check_tools(): def create_hdd(IMAGE_NAME): - subprocess.run(["rm", "-f", IMAGE_NAME+".hdd"]) - subprocess.run(["dd", "if=/dev/zero", "bs=1M", "count=0", "seek=4", "of="+IMAGE_NAME+".hdd"]) - subprocess.run(["sgdisk", IMAGE_NAME+".hdd", "-n", "1:2048", "-t", "1:ef00"]) - subprocess.run(["./limine/limine", "bios-install", IMAGE_NAME+".hdd"]) - subprocess.run(["mformat", "-i", IMAGE_NAME+".hdd@@1M"]) - subprocess.run(["mmd", "-i", IMAGE_NAME+".hdd@@1M", "::/mod", "::/EFI", "::/EFI/BOOT", "::/user"]) - subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M", - "kernel.elf", "configs/limine.cfg", "limine/limine-bios.sys", "::/"]) - subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M", - "modules/music/music.so", "modules/helloworld/hello.so", "::/mod"]) - subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M", - "limine/BOOTX64.EFI", "limine/BOOTIA32.EFI", "::/EFI/BOOT"]) - subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M", - "boot.tga", "::/"]) - subprocess.run(["./limine/limine", "bios-install", IMAGE_NAME+".hdd"]) + os.system("rm -f {}.hdd".format(IMAGE_NAME)) + os.system("dd if=/dev/zero bs=1M count=0 seek=4 of={}.hdd".format(IMAGE_NAME)) + os.system("sgdisk {}.hdd -n 1:2048 -t 1:ef00".format(IMAGE_NAME)) + os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME)) + os.system("mformat -i {}.hdd@@1M".format(IMAGE_NAME)) + os.system("mmd -i {}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user".format(IMAGE_NAME)) + os.system("mcopy -i {}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/".format(IMAGE_NAME)) + os.system("mcopy -i {}.hdd@@1M modules/music/music.ko modules/helloworld/hello.ko ::/mod".format(IMAGE_NAME)) + os.system("mcopy -i {}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT".format(IMAGE_NAME)) + os.system("mcopy -i {}.hdd@@1M boot.tga ::/".format(IMAGE_NAME)) + os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME)) def create_iso(IMAGE_NAME): - subprocess.run(["rm", "-f", IMAGE_NAME+".iso"]) - subprocess.run(["rm", "-rf", "iso_root"]) - subprocess.run(["mkdir", "-p", "iso_root"]) - subprocess.run(["cp", "-v", "iso_root/"]) - subprocess.run(["cp", "-v", "kernel.elf", "boot.tga", - "configs/limine.cfg", "limine/limine-bios.sys", - "limine/limine-bios-cd.bin", "limine/limine-uefi-cd.bin", - "iso_root/"]) - subprocess.run(["mkdir", "-p", "iso_root/EFI/BOOT"]) - subprocess.run(["mkdir", "-p", "iso_root/mod"]) - subprocess.run(["cp", "-v", "modules/helloworld/hello.so", "iso_root/mod/"]) - subprocess.run(["cp", "-v", "modules/music/music.so", "iso_root/mod/"]) - subprocess.run(["cp", "-v", "limine/BOOTX64.EFI", "iso_root/EFI/BOOT/"]) - subprocess.run(["cp", "-v", "limine/BOOTIA32.EFI", "iso_root/EFI/BOOT/"]) - subprocess.run(["xorriso", "-as", "mkisofs", "-b", "limine-bios-cd.bin", - "-no-emul-boot", "-boot-load-size", "4", "-boot-info-table", - "--efi-boot", "limine-uefi-cd.bin", - "-efi-boot-part", "--efi-boot-image", "--protective-msdos-label", - "iso_root", "-o", IMAGE_NAME+".iso"]) - subprocess.run(["./limine/limine", "bios-install", IMAGE_NAME+".iso"]) + os.system("rm -f {}.iso".format(IMAGE_NAME)) + os.system("rm -rf iso_root") + os.system("mkdir -p iso_root") + os.system("cp -v iso_root/") + os.system("cp -v kernel.elf boot.tga configs/limine.cfg limine/limine-bios.sys limine/limine-bios-cd.bin limine/limine-uefi-cd.bin iso_root/") + os.system("mkdir -p iso_root/EFI/BOOT") + os.system("mkdir -p iso_root/mod") + os.system("cp -v modules/helloworld/hello.ko iso_root/mod/") + os.system("cp -v modules/music/music.ko iso_root/mod/") + os.system("cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/") + os.system("cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/") + os.system("xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label iso_root -o {}.iso".format(IMAGE_NAME)) + os.system("./limine/limine bios-install {}.iso".format(IMAGE_NAME)) if __name__ == "__main__": os.system("""find . \( -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.hpp" \) -print0 | xargs -0 clang-format -i -style=file""") @@ -176,7 +165,8 @@ if __name__ == "__main__": subprocess.run(["curl", "-Lo", "OVMF.fd", "https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd"]) os.chdir("..") - check_limine() + if not os.path.isdir("limine"): + check_limine() check_tools() major, minor, build = version_build() compile_all()