From 976513b034377fe1c950aee2a11fa02e0841ae55 Mon Sep 17 00:00:00 2001 From: Aren Date: Sat, 21 Oct 2023 19:37:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B0=D1=80=D1=85=D0=B8=D1=82=D0=B5=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D1=80=D0=BD=D0=BE=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D1=8B=D1=85=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/version.h | 2 +- kernel/arch/cpu.cpp | 73 ++++++++++++++++++++++++++++++++++++++------ kernel/arch/idt.cpp | 2 +- kernel/fb.cpp | 1 + kernel/main/main.cpp | 1 + kernel/mem.cpp | 28 +++++++++++------ kernel/task.cpp | 9 ++++++ 7 files changed, 95 insertions(+), 21 deletions(-) diff --git a/include/version.h b/include/version.h index 80240d7..33d25a0 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 1 -#define VERSION_BUILD 198 +#define VERSION_BUILD 227 diff --git a/kernel/arch/cpu.cpp b/kernel/arch/cpu.cpp index 1e50d0d..40432dd 100644 --- a/kernel/arch/cpu.cpp +++ b/kernel/arch/cpu.cpp @@ -58,16 +58,13 @@ void l2_cache( ) { unsigned int eax, ebx, ecx, edx; unsigned int lsize, assoc, cache; - cpuid(0x80000005, &eax, &ebx, &ecx, &edx); - lsize = ecx & 0xFF; - fb::printf("Кэш L1: %d KB\n", lsize); - cpuid(0x80000006, &eax, &ebx, &ecx, &edx); lsize = ecx & 0xFF; - assoc = (ecx >> 12) & 0x0F; - cache = (ecx >> 16) & 0xFF; + assoc = (ecx >> 12) & 0x07; + cache = (ecx >> 16) & 0xFFFF; - fb::printf("Кэш L2: %d KB\n", lsize); + fb::printf("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", + lsize, assoc, cache); } void do_amd( ) { @@ -157,12 +154,70 @@ void init( ) { fb::printf("RDRND подерживается!\n"); } + cpuid(0x80000000, &eax, &ebx, &ecx, &edx); + fb::printf("0x80000000 [EAX] = 0x%x (%u)\n", eax, eax); + cpuid(0x80000001, &eax, &ebx, &ecx, &edx); - if ((edx >> 11) & 1) { fb::printf("SYSCALL подерживается!\n"); } + if ((edx >> 5) & 1) { fb::printf("Регистры MSR подерживаются!\n"); } + + if ((edx >> 6) & 1) { + fb::printf("Расширение физического адреса подерживается!\n"); + } + + if ((edx >> 7) & 1) { + fb::printf("Исключение проверки компьютера (MCE) подерживается!\n"); + } + + if ((edx >> 9) & 1) { + fb::printf("Усовершенствованный программируемый контроллер прерываний " + "подерживаются!\n"); + } + + if ((edx >> 10) & 1) { + fb::printf( + "SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n"); + } + if ((edx >> 11) & 1) { fb::printf("SYSCALL/SYSRET подерживаются!\n"); } + + if ((edx >> 26) & 1) { + fb::printf("Гигабайтные страницы подерживаются!\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!\" подерживается!\n"); } + if ((ecx >> 6) & 1) { fb::printf("SSE4a подерживается!\n"); } + if ((ecx >> 7) & 1) { fb::printf("Смещенный режим SSE подерживается!\n"); } + + cpuid(0x80000007, &eax, &ebx, &ecx, &edx); + if ((ebx >> 0) & 1) { + fb::printf("Восстановление после переполнения MCA подерживается!\n"); + } + if ((ebx >> 1) & 1) { + fb::printf("Возможность локализации и восстановления неисправимых " + "программных ошибок подерживается!\n"); + } + if ((edx >> 0) & 1) { fb::printf("Датчик температуры подерживается!\n"); } + if ((edx >> 3) & 1) { fb::printf("Терморегулятор подерживается!\n"); } + if ((edx >> 4) & 1) { + fb::printf("Аппаратный терморегулятор (HTC) подерживается!\n"); + } + if ((edx >> 5) & 1) { + fb::printf("Программный терморегулятор (STC) подерживается!\n"); + } + if ((edx >> 6) & 1) { + fb::printf("Управление множителем 100 МГц подерживается!\n"); + } + + fb::printf("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); + } brandname( ); - // l2_cache( ); + l2_cache( ); } } // namespace cpu \ No newline at end of file diff --git a/kernel/arch/idt.cpp b/kernel/arch/idt.cpp index 594b09e..c211397 100644 --- a/kernel/arch/idt.cpp +++ b/kernel/arch/idt.cpp @@ -145,7 +145,7 @@ void idt_init( ) { } idt_load( ); - fb::printf("IDT инициализирован.\n"); + fb::printf("IDT инициализирован\n"); } void idt_set_ist(uint8_t vector, uint8_t ist) { diff --git a/kernel/fb.cpp b/kernel/fb.cpp index 17916d5..26c9a4d 100644 --- a/kernel/fb.cpp +++ b/kernel/fb.cpp @@ -25,6 +25,7 @@ static volatile struct limine_framebuffer_request framebuffer_request = { struct limine_framebuffer_response *framebuffer_response; struct limine_framebuffer *boot_framebuffer; +uint32_t *fb_addr; uint32_t text_color = GREEN; uint32_t background = DARK_GREEN; uint64_t width; diff --git a/kernel/main/main.cpp b/kernel/main/main.cpp index e08d183..d963476 100644 --- a/kernel/main/main.cpp +++ b/kernel/main/main.cpp @@ -159,6 +159,7 @@ unsigned int *tga_parse(unsigned char *ptr, int size) { return data; } void main( ) { + for (uint64_t i = 512; i > 1; i--) { pause( ); } fb::printf("Загрузка завершена! 1\n"); unsigned int *res = tga_parse((uint8_t *)bootpng_ptr, bootpng_size); fb::printf("Загрузка завершена! 2 %x\n", res); diff --git a/kernel/mem.cpp b/kernel/mem.cpp index 5889b1a..7596d67 100644 --- a/kernel/mem.cpp +++ b/kernel/mem.cpp @@ -58,8 +58,9 @@ void dump_memory( ) { mem_entry_t *curr = first_node; while (curr) { - fb::printf("->0x%x | %u kb | %u | 0x%x\n", &curr->data, - curr->size / 1024, curr->free, curr->next); + fb::printf("->0x%x | %u.%u kb | %u | 0x%x\n", &curr->data, + (curr->size) / 1024, (curr->size) % 1024, curr->free, + curr->next); curr = curr->next; } } @@ -111,6 +112,15 @@ void merge_blocks(mem_entry_t *start) { } } +void merge_all_blocks( ) { + mem_entry_t *curr = first_node; + + while (curr) { + merge_blocks(curr); + curr = curr->next; + } +} + void add_block(void *addr, size_t size) { mem_entry_t *new_entry = (mem_entry_t *)addr; @@ -127,7 +137,6 @@ void add_block(void *addr, size_t size) { curr->next = new_entry; new_entry->next = NULL; } - merge_blocks(first_node); } void alloc_init(void *address, size_t length) { @@ -214,7 +223,7 @@ void init( ) { mmmap_count = memmap_response->entry_count; struct limine_memmap_entry **mmaps = memmap_response->entries; - fb::printf("В карте памяти: %u записей.\n", memmap_response->entry_count); + fb::printf("Записей в карте памяти: %u\n", memmap_response->entry_count); // Обработка каждой записи в карте памяти for (int i = 0; i < mmmap_count; i++) { @@ -267,15 +276,14 @@ void init( ) { fb::printf("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); fb::printf("Размер битовой карты: %u\n", bitmap_size); - alloc_init(frame_alloc(100), 1000 * BLOCK_SIZE); - for (uint64_t i = 0; i < 255; i++) { - add_block(frame_alloc(100), 1000 * BLOCK_SIZE); + alloc_init(frame_alloc(1), BLOCK_SIZE); + for (uint64_t i = 256 * 1024; i > 0; i -= BLOCK_SIZE) { + add_block(frame_alloc(1024), 1024 * BLOCK_SIZE); } - mem::dump_memory( ); - merge_blocks(first_node); + merge_all_blocks( ); mem::dump_memory( ); fb::printf("%u мегабайт выделено в динамичную память\n", - (256 * 1000 * BLOCK_SIZE) / 1024 / 1024); + (256 * 1024 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024); fb::printf("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n", (bitmap_available * BLOCK_SIZE) / 1024 / 1024, available / 1024 / 1024); diff --git a/kernel/task.cpp b/kernel/task.cpp index e69de29..51bc326 100644 --- a/kernel/task.cpp +++ b/kernel/task.cpp @@ -0,0 +1,9 @@ + + +void new_thread( ) { + return; +} + +void delete_thread( ) { + return; +} \ No newline at end of file