Новая система логов
This commit is contained in:
parent
6b15ba0f8a
commit
5d4ebbe415
|
@ -9,7 +9,8 @@ ovmf/
|
||||||
iso_root/
|
iso_root/
|
||||||
modules/helloworld/helloworld.elf
|
modules/helloworld/helloworld.elf
|
||||||
modules/com/com.elf
|
modules/com/com.elf
|
||||||
modules/helloworld/hello.o
|
modules/helloworld/hello.o
|
||||||
modules/helloworld/hello.so
|
modules/helloworld/hello.ko
|
||||||
*.so
|
*.so
|
||||||
*.o
|
*.o
|
||||||
|
*.ko
|
||||||
|
|
|
@ -18,8 +18,8 @@ BACKGROUND_PATH=boot:///boot.tga
|
||||||
MODULE_PATH=boot:///boot.tga
|
MODULE_PATH=boot:///boot.tga
|
||||||
MODULE_CMDLINE=[BOOTIMG]
|
MODULE_CMDLINE=[BOOTIMG]
|
||||||
|
|
||||||
MODULE_PATH=boot:///mod/hello.so
|
MODULE_PATH=boot:///mod/hello.ko
|
||||||
MODULE_CMDLINE=[MOD]hello.so
|
MODULE_CMDLINE=[MOD]hello.ko
|
||||||
|
|
||||||
MODULE_PATH=boot:///mod/music.so
|
MODULE_PATH=boot:///mod/music.ko
|
||||||
MODULE_CMDLINE=[MOD]music.so
|
MODULE_CMDLINE=[MOD]music.ko
|
|
@ -17,6 +17,7 @@ void cpu_init( );
|
||||||
void gdt_init( );
|
void gdt_init( );
|
||||||
void idt_init( );
|
void idt_init( );
|
||||||
void idt_set_int(uint8_t vector, void *int_handler);
|
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) {
|
static inline void outb(uint16_t port, uint8_t val) {
|
||||||
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
|
asm volatile("outb %0, %1" : : "a"(val), "Nd"(port));
|
||||||
|
|
|
@ -13,6 +13,15 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <tool.h>
|
||||||
|
|
||||||
|
#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_init( );
|
||||||
void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf);
|
void fb_print_buf(size_t x, size_t y, size_t h, size_t w, uint32_t *buf);
|
||||||
|
|
|
@ -18,7 +18,9 @@ typedef struct {
|
||||||
} lock_t;
|
} lock_t;
|
||||||
|
|
||||||
#define LOCK_INIT \
|
#define LOCK_INIT \
|
||||||
(lock_t) { 0, __FILE__ }
|
(lock_t) { \
|
||||||
|
0, __FILE__ \
|
||||||
|
}
|
||||||
|
|
||||||
int lock_swap(lock_t* lock);
|
int lock_swap(lock_t* lock);
|
||||||
void lock_acquire(lock_t* lock);
|
void lock_acquire(lock_t* lock);
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 1
|
#define VERSION_MINOR 1
|
||||||
#define VERSION_BUILD 301
|
#define VERSION_BUILD 320
|
||||||
|
|
|
@ -8,6 +8,38 @@
|
||||||
|
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
|
||||||
|
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( ) {
|
void arch_init( ) {
|
||||||
gdt_init( );
|
gdt_init( );
|
||||||
idt_init( );
|
idt_init( );
|
||||||
|
|
|
@ -69,8 +69,8 @@ static void l2_cache( ) {
|
||||||
assoc = (ecx >> 12) & 0x07;
|
assoc = (ecx >> 12) & 0x07;
|
||||||
cache = (ecx >> 16) & 0xFFFF;
|
cache = (ecx >> 16) & 0xFFFF;
|
||||||
|
|
||||||
fb_printf("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n",
|
LOG("Размер строки: %u B, Тип ассоциации: %u, Размер кэша: %u КБ\n", lsize,
|
||||||
lsize, assoc, cache);
|
assoc, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_amd( ) {
|
static void do_amd( ) {
|
||||||
|
@ -87,9 +87,9 @@ static void do_amd( ) {
|
||||||
cpu_model = (eax >> 4) & 0x0F;
|
cpu_model = (eax >> 4) & 0x0F;
|
||||||
cpu_family = (eax >> 8) & 0x0F;
|
cpu_family = (eax >> 8) & 0x0F;
|
||||||
|
|
||||||
fb_printf("Используется процессор AMD, 0x8FFFFFFF = [%s]\n", eggs_string);
|
LOG("Используется процессор AMD, 0x8FFFFFFF = [%s]\n", eggs_string);
|
||||||
fb_printf("cpu_model = [%u]\n", cpu_model);
|
LOG("cpu_model = [%u]\n", cpu_model);
|
||||||
fb_printf("cpu_family = [%u]\n", cpu_family);
|
LOG("cpu_family = [%u]\n", cpu_family);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brandname( ) {
|
static void brandname( ) {
|
||||||
|
@ -106,7 +106,7 @@ static void brandname( ) {
|
||||||
brand_string[48] = 0;
|
brand_string[48] = 0;
|
||||||
manufacturer_string[12] = 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);
|
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
||||||
if (eax >= 0x80000004) {
|
if (eax >= 0x80000004) {
|
||||||
|
@ -114,7 +114,7 @@ static void brandname( ) {
|
||||||
cpuid(0x80000003, &brand[4], &brand[5], &brand[6], &brand[7]);
|
cpuid(0x80000003, &brand[4], &brand[5], &brand[6], &brand[7]);
|
||||||
cpuid(0x80000004, &brand[8], &brand[9], &brand[10], &brand[11]);
|
cpuid(0x80000004, &brand[8], &brand[9], &brand[10], &brand[11]);
|
||||||
tool_memcpy(brand_string, brand, 48);
|
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( ); }
|
if (manufacturer[0] == 0x68747541) { do_amd( ); }
|
||||||
|
@ -124,106 +124,102 @@ void cpu_init( ) {
|
||||||
uint32_t eax, ebx, ecx, edx;
|
uint32_t eax, ebx, ecx, edx;
|
||||||
cpuid(1, &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) {
|
if ((edx >> 22) & 1) {
|
||||||
acpi_msrs_support = true;
|
acpi_msrs_support = true;
|
||||||
fb_printf("Встроенный терморегулятор MSRS для ACPI\n");
|
LOG("Встроенный терморегулятор MSRS для ACPI\n");
|
||||||
fb_printf("Температура: %u (в QEMU/KVM всегда 0)\n",
|
LOG("Температура: %u (в QEMU/KVM всегда 0)\n", get_cpu_temperature( ));
|
||||||
get_cpu_temperature( ));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 23) & 1) {
|
if ((edx >> 23) & 1) {
|
||||||
mmx_support = true;
|
mmx_support = true;
|
||||||
fb_printf("MMX поддерживается!\n");
|
LOG("MMX поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 25) & 1) {
|
if ((edx >> 25) & 1) {
|
||||||
sse2_support = true;
|
sse2_support = true;
|
||||||
fb_printf("SSE2 поддерживается!\n");
|
LOG("SSE2 поддерживается!\n");
|
||||||
// sse_init( );
|
// sse_init( );
|
||||||
}
|
}
|
||||||
|
|
||||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||||
if ((edx >> 29) & 1) {
|
if ((edx >> 29) & 1) {
|
||||||
fb_printf("Термоконтроллер автоматически ограничивает температуру\n");
|
LOG("Термоконтроллер автоматически ограничивает температуру\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ecx >> 28) & 1) {
|
if ((ecx >> 28) & 1) {
|
||||||
avx_support = true;
|
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) {
|
if ((ecx >> 30) & 1) {
|
||||||
rdrnd_support = true;
|
rdrnd_support = true;
|
||||||
fb_printf("RDRND поддерживается!\n");
|
LOG("RDRND поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
|
||||||
fb_printf("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax,
|
LOG("Максимально поддерживаемая функция CPUID = 0x%x (%u)\n", eax, eax);
|
||||||
eax);
|
|
||||||
|
|
||||||
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
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) {
|
if ((edx >> 6) & 1) {
|
||||||
fb_printf("Расширение физического адреса поддерживается!\n");
|
LOG("Расширение физического адреса поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 7) & 1) {
|
if ((edx >> 7) & 1) {
|
||||||
fb_printf("Исключение проверки компьютера (MCE) поддерживается!\n");
|
LOG("Исключение проверки компьютера (MCE) поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 9) & 1) {
|
if ((edx >> 9) & 1) {
|
||||||
fb_printf("Усовершенствованный программируемый контроллер прерываний "
|
LOG("Усовершенствованный программируемый контроллер прерываний "
|
||||||
"поддерживается!\n");
|
"поддерживается!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((edx >> 10) & 1) {
|
if ((edx >> 10) & 1) {
|
||||||
fb_printf(
|
fb_printf(
|
||||||
"SYSCALL/SYSRET(для AMD семейства 5 линейки 7) подерживаются!\n");
|
"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"); }
|
// подерживаются!\n"); }
|
||||||
|
|
||||||
if ((edx >> 29) & 1) { fb_printf("AMD64 поддерживается!\n"); }
|
if ((edx >> 29) & 1) { LOG("AMD64 поддерживается!\n"); }
|
||||||
// if ((edx >> 30) & 1) { fb_printf("\"3DNow!\" поддерживается!\n"); }
|
// if ((edx >> 30) & 1) { LOG("\"3DNow!\" поддерживается!\n"); }
|
||||||
// if ((edx >> 31) & 1) { fb_printf("\"Extended 3DNow!\"
|
// if ((edx >> 31) & 1) { LOG("\"Extended 3DNow!\"
|
||||||
// поддерживается!\n"); }
|
// поддерживается!\n"); }
|
||||||
if ((ecx >> 6) & 1) { fb_printf("SSE4a поддерживается!\n"); }
|
if ((ecx >> 6) & 1) { LOG("SSE4a поддерживается!\n"); }
|
||||||
if ((ecx >> 7) & 1) { fb_printf("Смещенный режим SSE поддерживается!\n"); }
|
if ((ecx >> 7) & 1) { LOG("Смещенный режим SSE поддерживается!\n"); }
|
||||||
|
|
||||||
cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
|
cpuid(0x80000007, &eax, &ebx, &ecx, &edx);
|
||||||
if ((ebx >> 0) & 1) {
|
if ((ebx >> 0) & 1) {
|
||||||
fb_printf("Восстановление после переполнения MCA поддерживается!\n");
|
LOG("Восстановление после переполнения MCA поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((ebx >> 1) & 1) {
|
if ((ebx >> 1) & 1) {
|
||||||
fb_printf("Возможность локализации и восстановления неисправимых "
|
LOG("Возможность локализации и восстановления неисправимых "
|
||||||
"программных ошибок поддерживается!\n");
|
"программных ошибок поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((edx >> 0) & 1) { fb_printf("Датчик температуры поддерживается!\n"); }
|
if ((edx >> 0) & 1) { LOG("Датчик температуры поддерживается!\n"); }
|
||||||
if ((edx >> 3) & 1) { fb_printf("Терморегулятор поддерживается!\n"); }
|
if ((edx >> 3) & 1) { LOG("Терморегулятор поддерживается!\n"); }
|
||||||
if ((edx >> 4) & 1) {
|
if ((edx >> 4) & 1) {
|
||||||
fb_printf("Аппаратный терморегулятор (HTC) поддерживается!\n");
|
LOG("Аппаратный терморегулятор (HTC) поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((edx >> 5) & 1) {
|
if ((edx >> 5) & 1) {
|
||||||
fb_printf("Программный терморегулятор (STC) поддерживается!\n");
|
LOG("Программный терморегулятор (STC) поддерживается!\n");
|
||||||
}
|
}
|
||||||
if ((edx >> 6) & 1) {
|
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);
|
cpuid(0xC0000000, &eax, &ebx, &ecx, &edx);
|
||||||
if (eax > 0xC0000000) {
|
if (eax > 0xC0000000) { LOG("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax); }
|
||||||
fb_printf("0xC0000000 [EAX] = 0x%x (%u)\n", eax, eax);
|
|
||||||
}
|
|
||||||
|
|
||||||
brandname( );
|
brandname( );
|
||||||
l2_cache( );
|
l2_cache( );
|
||||||
|
|
|
@ -62,5 +62,5 @@ void gdt_init( ) {
|
||||||
set_gdt_entry(&gdt[10], 0, 0, 0, 0);
|
set_gdt_entry(&gdt[10], 0, 0, 0, 0);
|
||||||
|
|
||||||
gdt_load( );
|
gdt_load( );
|
||||||
fb_printf("GDT инициализирован\n");
|
LOG("GDT инициализирован\n");
|
||||||
}
|
}
|
|
@ -76,23 +76,23 @@ static void encode_idt_entry(uint8_t vector, void *handler, uint8_t flags) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exception_handler(struct frame state) {
|
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"
|
LOG(" RAX=%x RBX=%x\n"
|
||||||
" RCX=%x RDX=%x\n"
|
" RCX=%x RDX=%x\n"
|
||||||
" RSI=%x RDI=%x\n"
|
" RSI=%x RDI=%x\n"
|
||||||
" RBP=%x RSP=%x\n"
|
" RBP=%x RSP=%x\n"
|
||||||
" R08=%x R09=%x\n"
|
" R08=%x R09=%x\n"
|
||||||
" R10=%x R11=%x\n"
|
" R10=%x R11=%x\n"
|
||||||
" R12=%x R13=%x\n"
|
" R12=%x R13=%x\n"
|
||||||
" R14=%x R15=%x\n"
|
" R14=%x R15=%x\n"
|
||||||
" RIP=%x RFLAGS=%x\n"
|
" RIP=%x RFLAGS=%x\n"
|
||||||
" CS=%x SS=%x\n"
|
" CS=%x SS=%x\n"
|
||||||
" ERR=%x INT=%u",
|
" ERR=%x INT=%u",
|
||||||
state.rax, state.rbx, state.rcx, state.rdx, state.rsi, state.rdi,
|
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.rbp, state.rsp, state.r8, state.r9, state.r10, state.r11,
|
||||||
state.r12, state.r13, state.r14, state.r15, state.rip,
|
state.r12, state.r13, state.r14, state.r15, state.rip, state.rflags,
|
||||||
state.rflags, state.cs, state.ss, state.err, state.int_number);
|
state.cs, state.ss, state.err, state.int_number);
|
||||||
|
|
||||||
asm volatile("cli; hlt");
|
asm volatile("cli; hlt");
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ void isr_generic(struct frame state) {
|
||||||
if (state.int_number < 32) {
|
if (state.int_number < 32) {
|
||||||
exception_handler(state);
|
exception_handler(state);
|
||||||
} else {
|
} 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( );
|
idt_load( );
|
||||||
fb_printf("IDT инициализирован\n");
|
LOG("IDT инициализирован\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void idt_set_int(uint8_t vector, void *int_handler) {
|
void idt_set_int(uint8_t vector, void *int_handler) {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
static uint64_t count = 0;
|
static uint64_t count = 0;
|
||||||
|
|
||||||
static void isr_generic( ) {
|
static void isr_generic( ) {
|
||||||
fb_printf("\nТик! %u", count++);
|
LOG("\nТик! %u", count++);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pit_set_interval(int hz) {
|
void pit_set_interval(int hz) {
|
||||||
|
|
|
@ -60,7 +60,7 @@ void fb_init( ) {
|
||||||
|
|
||||||
for (uint64_t i = 0; i < width * height; i++) { fb_addr[i] = background; }
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Отрисовка буффера по координатам (полезно для картинок)
|
// Отрисовка буффера по координатам (полезно для картинок)
|
||||||
|
|
|
@ -24,7 +24,7 @@ void lock_acquire(lock_t *lock) {
|
||||||
if (lock_swap(lock)) { break; }
|
if (lock_swap(lock)) { break; }
|
||||||
count++;
|
count++;
|
||||||
if (count > 1000000) {
|
if (count > 1000000) {
|
||||||
fb_printf("%s блокировка зависла", lock->file);
|
LOG("%s блокировка зависла", lock->file);
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,7 @@
|
||||||
#include <mem.h>
|
#include <mem.h>
|
||||||
#include <tool.h>
|
#include <tool.h>
|
||||||
|
|
||||||
#define TGA_ERR( ) \
|
#define TGA_ERR( ) LOG("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
||||||
fb_printf("Ошибка декодирования TGA на строчке: %u\n", __LINE__);
|
|
||||||
|
|
||||||
extern void *bootpng_ptr;
|
extern void *bootpng_ptr;
|
||||||
extern uint64_t bootpng_size;
|
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));
|
data = (unsigned int *)mem_alloc((w * h + 2) * sizeof(unsigned int));
|
||||||
if (!data) {
|
if (!data) {
|
||||||
fb_printf("Ошибка декодирования TGA на строчке: %u, %x, %u kb\n",
|
LOG("Ошибка декодирования TGA на строчке: %u, %x, %u kb\n", __LINE__,
|
||||||
__LINE__, data, ((w * h + 2) * sizeof(unsigned int)) / 1024);
|
data, ((w * h + 2) * sizeof(unsigned int)) / 1024);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,16 +170,16 @@ unsigned int *tga_parse(unsigned char *ptr, int size) {
|
||||||
}
|
}
|
||||||
void main( ) {
|
void main( ) {
|
||||||
for (uint64_t i = 512; i > 1; i--) { pause( ); }
|
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);
|
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;
|
tga_header_t *head = (tga_header_t *)bootpng_ptr;
|
||||||
|
|
||||||
if (res != NULL) {
|
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( );
|
mem_dump_memory( );
|
||||||
|
|
||||||
fb_print_buf(0, 0, head->w, head->h, (uint32_t *)(res + 2));
|
fb_print_buf(0, 0, head->w, head->h, (uint32_t *)(res + 2));
|
||||||
|
|
34
kernel/mem.c
34
kernel/mem.c
|
@ -64,9 +64,8 @@ void mem_dump_memory( ) {
|
||||||
mem_entry_t *curr = first_node;
|
mem_entry_t *curr = first_node;
|
||||||
|
|
||||||
while (curr) {
|
while (curr) {
|
||||||
fb_printf("->0x%x | %u.%u kb | %u | 0x%x\n", &curr->data,
|
LOG("->0x%x | %u.%u kb | %u | 0x%x\n", &curr->data, (curr->size) / 1024,
|
||||||
(curr->size) / 1024, (curr->size) % 1024, curr->free,
|
(curr->size) % 1024, curr->free, curr->next);
|
||||||
curr->next);
|
|
||||||
curr = curr->next;
|
curr = curr->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -229,19 +228,19 @@ void mem_init( ) {
|
||||||
mmmap_count = memmap_response->entry_count;
|
mmmap_count = memmap_response->entry_count;
|
||||||
struct limine_memmap_entry **mmaps = memmap_response->entries;
|
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++) {
|
for (int i = 0; i < mmmap_count; i++) {
|
||||||
available += mmaps[i]->length;
|
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]);
|
// mmaps[i]->base, mmaps[i]->length, memory_types[mmaps[i]->type]);
|
||||||
if (mmaps[i]->type == LIMINE_MEMMAP_FRAMEBUFFER) {
|
if (mmaps[i]->type == LIMINE_MEMMAP_FRAMEBUFFER) {
|
||||||
fb_printf("На видеопамять BIOS/UEFI выделено: %u мегабайт + %u "
|
LOG("На видеопамять BIOS/UEFI выделено: %u мегабайт + %u "
|
||||||
"килобайт\n",
|
"килобайт\n",
|
||||||
mmaps[i]->length / 1024 / 1024,
|
mmaps[i]->length / 1024 / 1024,
|
||||||
(mmaps[i]->length / 1024) % 1024);
|
(mmaps[i]->length / 1024) % 1024);
|
||||||
}
|
}
|
||||||
if (!(mmaps[i]->type == LIMINE_MEMMAP_USABLE)) { continue; }
|
if (!(mmaps[i]->type == LIMINE_MEMMAP_USABLE)) { continue; }
|
||||||
|
|
||||||
|
@ -280,20 +279,19 @@ void mem_init( ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fb_printf("%u / %u блоков доступно\n", bitmap_available, bitmap_limit);
|
LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit);
|
||||||
fb_printf("Размер битовой карты: %u\n", bitmap_size);
|
LOG("Размер битовой карты: %u\n", bitmap_size);
|
||||||
alloc_init(mem_frame_alloc(1), BLOCK_SIZE);
|
alloc_init(mem_frame_alloc(1), BLOCK_SIZE);
|
||||||
fb_printf("%u мегабайт выделено в динамичную память\n",
|
LOG("%u мегабайт выделено в динамичную память\n",
|
||||||
(256 * 16 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024);
|
(256 * 16 * BLOCK_SIZE + BLOCK_SIZE) / 1024 / 1024);
|
||||||
for (uint64_t i = 256 * 16; i > 0; i -= BLOCK_SIZE) {
|
for (uint64_t i = 256 * 16; i > 0; i -= BLOCK_SIZE) {
|
||||||
add_block(mem_frame_alloc(1024), 1024 * BLOCK_SIZE);
|
add_block(mem_frame_alloc(1024), 1024 * BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
mem_merge_all_blocks( );
|
mem_merge_all_blocks( );
|
||||||
mem_dump_memory( );
|
mem_dump_memory( );
|
||||||
fb_printf("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n",
|
LOG("%u МБ объем доступной памяти, %u МБ объем виртуальной памяти\n",
|
||||||
(bitmap_available * BLOCK_SIZE) / 1024 / 1024,
|
(bitmap_available * BLOCK_SIZE) / 1024 / 1024, available / 1024 / 1024);
|
||||||
available / 1024 / 1024);
|
|
||||||
|
|
||||||
fb_printf("%u / %u блоков доступно\n", bitmap_available, bitmap_limit);
|
LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit);
|
||||||
fb_printf("Проверка менеджера памяти\n");
|
LOG("Проверка менеджера памяти\n");
|
||||||
}
|
}
|
46
kernel/mod.c
46
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;
|
elf64_header_t *elf_header = (elf64_header_t *)module_bin;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
fb_printf(" Класс: ELF64\n");
|
LOG(" Класс: ELF64\n");
|
||||||
fb_printf(" Версия: %u\n", elf_header->e_ident[6]);
|
LOG(" Версия: %u\n", elf_header->e_ident[6]);
|
||||||
fb_printf(" ОС/ABI: %u\n", elf_header->e_ident[7]);
|
LOG(" ОС/ABI: %u\n", elf_header->e_ident[7]);
|
||||||
fb_printf(" Тип: %u\n", elf_header->e_type);
|
LOG(" Тип: %u\n", elf_header->e_type);
|
||||||
fb_printf(" Машина: %u\n", elf_header->e_machine);
|
LOG(" Машина: %u\n", elf_header->e_machine);
|
||||||
fb_printf(" Версия: %u\n", elf_header->e_version);
|
LOG(" Версия: %u\n", elf_header->e_version);
|
||||||
fb_printf(" Точка входа: 0x%x\n", elf_header->e_entry);
|
LOG(" Точка входа: 0x%x\n", elf_header->e_entry);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Возвращаем указатель на точку входа
|
// Возвращаем указатель на точку входа
|
||||||
|
@ -71,44 +71,44 @@ void mod_init( ) {
|
||||||
|
|
||||||
for (uint64_t i = 0; i < module_count; i++) {
|
for (uint64_t i = 0; i < module_count; i++) {
|
||||||
module_ptr = module_response->modules[i];
|
module_ptr = module_response->modules[i];
|
||||||
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->cmdline, module_ptr->address);
|
module_ptr->address);
|
||||||
fb_printf("->Размер: %u, тип носителя: %u, индекс раздела: %u\n",
|
LOG("->Размер: %u, тип носителя: %u, индекс раздела: %u\n",
|
||||||
module_ptr->size, module_ptr->media_type,
|
module_ptr->size, module_ptr->media_type,
|
||||||
module_ptr->partition_index);
|
module_ptr->partition_index);
|
||||||
#if 0
|
#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);
|
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->size, module_ptr->media_type,
|
||||||
module_ptr->partition_index);
|
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->mbr_disk_id, module_ptr->tftp_ip,
|
||||||
module_ptr->tftp_port);
|
module_ptr->tftp_port);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
if (tool_starts_with(module_ptr->cmdline, "[BOOTIMG]")) {
|
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_ptr = module_ptr->address;
|
||||||
bootpng_size = module_ptr->size;
|
bootpng_size = module_ptr->size;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!tool_starts_with(module_ptr->cmdline, "[MOD]")) { continue; }
|
if (!tool_starts_with(module_ptr->cmdline, "[MOD]")) { continue; }
|
||||||
modules_count++;
|
modules_count++;
|
||||||
uint64_t (*module_init)(env_t * env) =
|
module_info_t (*module_init)(env_t * env) =
|
||||||
(module_info_t * (*)(env_t * env))
|
(module_info_t * (*)(env_t * env))
|
||||||
elf_entry(module_ptr->address, module_ptr->size);
|
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.offset = module_ptr->address;
|
||||||
main_env.info = (module_info_t *)0;
|
main_env.info = (module_info_t *)0;
|
||||||
main_env.fb_printf = &fb_printf;
|
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);
|
LOG("Инициализированно с кодом: %u\n", ret.err_code);
|
||||||
// fb_printf("Инициализированно с кодом: %u\n", ret->err_code);
|
// LOG("Инициализированно с кодом: %u\n", ret->err_code);
|
||||||
// fb_printf("Сообщение из модуля: %s\n\n", ret->message);
|
// LOG("Сообщение из модуля: %s\n\n", ret->message);
|
||||||
}
|
}
|
||||||
fb_printf("Модулей обработано: %u\n", modules_count);
|
LOG("Модулей обработано: %u\n", modules_count);
|
||||||
}
|
}
|
|
@ -22,14 +22,14 @@ void _start( ) {
|
||||||
fb_init( );
|
fb_init( );
|
||||||
arch_init( );
|
arch_init( );
|
||||||
mem_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( );
|
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( );
|
pit_init( );
|
||||||
fb_printf("Готово!\n");
|
LOG("Готово!\n");
|
||||||
for (;;) { asm volatile("hlt"); }
|
for (;;) { asm volatile("hlt"); }
|
||||||
}
|
}
|
|
@ -2,5 +2,5 @@
|
||||||
echo "Название: Hello world"
|
echo "Название: Hello world"
|
||||||
echo "Лицензия: Публичное достояние"
|
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 -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
|
gcc -mcmodel=large -Wl,--entry=init -fPIC -shared -nostdlib hello.o -o hello.ko
|
||||||
echo "Сборка завершена, файл: hello.so"
|
echo "Сборка завершена, файл: hello.ko"
|
||||||
|
|
|
@ -2,11 +2,10 @@
|
||||||
|
|
||||||
const char name[] = "Привет мир!";
|
const char name[] = "Привет мир!";
|
||||||
const char message[] = "Привет из модуля!";
|
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) {
|
module_info_t init(env_t *env) {
|
||||||
return 0;
|
return (module_info_t){ .name = (char *)&name,
|
||||||
|
.message = (char *)&message,
|
||||||
|
.err_code = 2023,
|
||||||
|
.func_count = 1 };
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
echo "Название: Мелодия из тетриса"
|
echo "Название: Мелодия из тетриса"
|
||||||
echo "Лицензия: Публичное достояние"
|
echo "Лицензия: Публичное достояние"
|
||||||
gcc -I../../modlib -O0 -finput-charset=UTF-8 -fexec-charset=cp1251 -c -fPIC -nostdlib main.c -o music.o
|
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
|
gcc -Wl,--entry=init -fPIC -shared -nostdlib music.o -o music.ko
|
||||||
echo "Сборка завершена, файл: music.so"
|
echo "Сборка завершена, файл: music.ko"
|
||||||
|
|
|
@ -18,13 +18,13 @@ static inline void play_sound(unsigned int frequency) {
|
||||||
uint32_t div;
|
uint32_t div;
|
||||||
uint8_t tmp;
|
uint8_t tmp;
|
||||||
|
|
||||||
// Set the PIT to the desired frequency
|
// Устанавливаем частоту таймера
|
||||||
div = 1193180 / frequency;
|
div = 1193180 / frequency;
|
||||||
outb(0x43, 0xb6);
|
outb(0x43, 0xB6);
|
||||||
outb(0x42, (uint8_t)(div));
|
outb(0x42, (uint8_t)(div));
|
||||||
outb(0x42, (uint8_t)(div >> 8));
|
outb(0x42, (uint8_t)(div >> 8));
|
||||||
|
|
||||||
// And play the sound using the PC speaker
|
// Воспроизводим мелодию
|
||||||
tmp = inb(0x61);
|
tmp = inb(0x61);
|
||||||
if (tmp != (tmp | 3)) { outb(0x61, tmp | 3); }
|
if (tmp != (tmp | 3)) { outb(0x61, tmp | 3); }
|
||||||
}
|
}
|
||||||
|
@ -35,21 +35,26 @@ static void nosound( ) {
|
||||||
outb(0x61, tmp);
|
outb(0x61, tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
int init(env_t *env) {
|
module_info_t init(env_t *env) {
|
||||||
init_env(env);
|
init_env(env);
|
||||||
env->fb_printf("Программа инициализирована!\n");
|
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 };
|
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 секунда
|
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]);
|
play_sound(tetris_notes[i]);
|
||||||
usleep(note_duration);
|
usleep(note_duration);
|
||||||
|
@ -57,6 +62,4 @@ int init(env_t *env) {
|
||||||
// Уменьшение времени для следующей ноты
|
// Уменьшение времени для следующей ноты
|
||||||
note_duration -= note_duration / 24; // Уменьшение на 1/24 каждый раз
|
note_duration -= note_duration / 24; // Уменьшение на 1/24 каждый раз
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
62
pbuild.py
62
pbuild.py
|
@ -126,44 +126,33 @@ def check_tools():
|
||||||
|
|
||||||
|
|
||||||
def create_hdd(IMAGE_NAME):
|
def create_hdd(IMAGE_NAME):
|
||||||
subprocess.run(["rm", "-f", IMAGE_NAME+".hdd"])
|
os.system("rm -f {}.hdd".format(IMAGE_NAME))
|
||||||
subprocess.run(["dd", "if=/dev/zero", "bs=1M", "count=0", "seek=4", "of="+IMAGE_NAME+".hdd"])
|
os.system("dd if=/dev/zero bs=1M count=0 seek=4 of={}.hdd".format(IMAGE_NAME))
|
||||||
subprocess.run(["sgdisk", IMAGE_NAME+".hdd", "-n", "1:2048", "-t", "1:ef00"])
|
os.system("sgdisk {}.hdd -n 1:2048 -t 1:ef00".format(IMAGE_NAME))
|
||||||
subprocess.run(["./limine/limine", "bios-install", IMAGE_NAME+".hdd"])
|
os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME))
|
||||||
subprocess.run(["mformat", "-i", IMAGE_NAME+".hdd@@1M"])
|
os.system("mformat -i {}.hdd@@1M".format(IMAGE_NAME))
|
||||||
subprocess.run(["mmd", "-i", IMAGE_NAME+".hdd@@1M", "::/mod", "::/EFI", "::/EFI/BOOT", "::/user"])
|
os.system("mmd -i {}.hdd@@1M ::/mod ::/EFI ::/EFI/BOOT ::/user".format(IMAGE_NAME))
|
||||||
subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M",
|
os.system("mcopy -i {}.hdd@@1M kernel.elf configs/limine.cfg limine/limine-bios.sys ::/".format(IMAGE_NAME))
|
||||||
"kernel.elf", "configs/limine.cfg", "limine/limine-bios.sys", "::/"])
|
os.system("mcopy -i {}.hdd@@1M modules/music/music.ko modules/helloworld/hello.ko ::/mod".format(IMAGE_NAME))
|
||||||
subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M",
|
os.system("mcopy -i {}.hdd@@1M limine/BOOTX64.EFI limine/BOOTIA32.EFI ::/EFI/BOOT".format(IMAGE_NAME))
|
||||||
"modules/music/music.so", "modules/helloworld/hello.so", "::/mod"])
|
os.system("mcopy -i {}.hdd@@1M boot.tga ::/".format(IMAGE_NAME))
|
||||||
subprocess.run(["mcopy", "-i", IMAGE_NAME+".hdd@@1M",
|
os.system("./limine/limine bios-install {}.hdd".format(IMAGE_NAME))
|
||||||
"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"])
|
|
||||||
|
|
||||||
|
|
||||||
def create_iso(IMAGE_NAME):
|
def create_iso(IMAGE_NAME):
|
||||||
subprocess.run(["rm", "-f", IMAGE_NAME+".iso"])
|
os.system("rm -f {}.iso".format(IMAGE_NAME))
|
||||||
subprocess.run(["rm", "-rf", "iso_root"])
|
os.system("rm -rf iso_root")
|
||||||
subprocess.run(["mkdir", "-p", "iso_root"])
|
os.system("mkdir -p iso_root")
|
||||||
subprocess.run(["cp", "-v", "iso_root/"])
|
os.system("cp -v iso_root/")
|
||||||
subprocess.run(["cp", "-v", "kernel.elf", "boot.tga",
|
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/")
|
||||||
"configs/limine.cfg", "limine/limine-bios.sys",
|
os.system("mkdir -p iso_root/EFI/BOOT")
|
||||||
"limine/limine-bios-cd.bin", "limine/limine-uefi-cd.bin",
|
os.system("mkdir -p iso_root/mod")
|
||||||
"iso_root/"])
|
os.system("cp -v modules/helloworld/hello.ko iso_root/mod/")
|
||||||
subprocess.run(["mkdir", "-p", "iso_root/EFI/BOOT"])
|
os.system("cp -v modules/music/music.ko iso_root/mod/")
|
||||||
subprocess.run(["mkdir", "-p", "iso_root/mod"])
|
os.system("cp -v limine/BOOTX64.EFI iso_root/EFI/BOOT/")
|
||||||
subprocess.run(["cp", "-v", "modules/helloworld/hello.so", "iso_root/mod/"])
|
os.system("cp -v limine/BOOTIA32.EFI iso_root/EFI/BOOT/")
|
||||||
subprocess.run(["cp", "-v", "modules/music/music.so", "iso_root/mod/"])
|
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))
|
||||||
subprocess.run(["cp", "-v", "limine/BOOTX64.EFI", "iso_root/EFI/BOOT/"])
|
os.system("./limine/limine bios-install {}.iso".format(IMAGE_NAME))
|
||||||
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"])
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
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""")
|
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"])
|
subprocess.run(["curl", "-Lo", "OVMF.fd", "https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd"])
|
||||||
os.chdir("..")
|
os.chdir("..")
|
||||||
|
|
||||||
check_limine()
|
if not os.path.isdir("limine"):
|
||||||
|
check_limine()
|
||||||
check_tools()
|
check_tools()
|
||||||
major, minor, build = version_build()
|
major, minor, build = version_build()
|
||||||
compile_all()
|
compile_all()
|
||||||
|
|
Loading…
Reference in New Issue