diff --git a/grubshit/aaa b/grubshit/aaa index 7bcfafb..c0cf1d3 100755 Binary files a/grubshit/aaa and b/grubshit/aaa differ diff --git a/grubshit/aaa.asm b/grubshit/aaa.asm index 6301d3a..89f914a 100644 --- a/grubshit/aaa.asm +++ b/grubshit/aaa.asm @@ -6,10 +6,24 @@ _start: ;tell linker entry point mov ebx, 1 ;file descriptor (stdout) mov eax, 4 ;system call number (sys_write) int 0x80 ;call kernel + mov eax, 1 ;system call number (sys_exit) int 0x80 ;call kernel + mov eax, 4 + mov ebx, 1 + mov ecx, msg2 + mov edx, len2 + int 0x80 + + mov eax, 1 + int 0x80 + + jmp $ + section .data msg db 'Hello, world!',0x0 ;our dear string len equ $ - msg ;length of our dear string +msg2 db 'seems like KatauOS just executed this ELF-file!!',0x0 +len2 equ $ - msg2 diff --git a/grubshit/aaa.o b/grubshit/aaa.o index 62feea2..eb00557 100644 Binary files a/grubshit/aaa.o and b/grubshit/aaa.o differ diff --git a/include/stdio.h b/include/stdio.h index 7d90f68..0f762d2 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -10,4 +10,16 @@ int printf(const char* __restrict, ...); int putchar(int); int puts(const char*); +//#define KATAU_DEBUG + +#ifdef KATAU_DEBUG +#define debug_log printf +#else + +static int debug_log(const char* restrict format, ...) +{ +} + +#endif + #endif diff --git a/include/task.h b/include/task.h index 14899dd..a05d8af 100644 --- a/include/task.h +++ b/include/task.h @@ -38,7 +38,7 @@ typedef struct __attribute__((packed)) TrapFrame { uint32_t gs,fs,es,ds; uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; - //uint32_t interrupt, error; + uint32_t interrupt, error; uint32_t eip, cs, eflags, usermode_esp, usermode_ss; diff --git a/src/tasking/exec_from_file.c b/src/tasking/exec_from_file.c index ba74826..855a97c 100644 --- a/src/tasking/exec_from_file.c +++ b/src/tasking/exec_from_file.c @@ -28,16 +28,16 @@ int read_file(const char* path, uint8_t** buffer) return err; uint32_t file_size = fat_fsize(&file); - printf("file_size: %X\n", file_size); + debug_log("file_size: %X\n", file_size); uint8_t buf[512]; //memset(buf, 0, 512); - printf("heh\n"); + debug_log("heh\n"); *buffer = (uint8_t*)malloc(file_size); //memset(*buffer, 0, file_size); uint8_t* current = *buffer; - printf("eeee\n"); + debug_log("eeee\n"); int cnt = fat_fread(&file, *buffer, file_size); @@ -68,21 +68,21 @@ void exec_from_file(const char* filename) uint8_t* file; - int result = read_file("/ebalo/aaa", &file); - printf("result: %X\n", result); - printf("buffer: %s\n", file); + int result = read_file("/ebalo/testfile", &file); + debug_log("result: %X\n", result); + debug_log("buffer: %s\n", file); Elf32_Ehdr *elf_ehdr = (Elf32_Ehdr*)file; int program_header_table_entry_count = elf_ehdr->e_phnum; int program_header_table_entry_size = elf_ehdr->e_phentsize; - printf("magic: %X, type: %X, entry: 0x%X\n", elf_ehdr->e_ident, elf_ehdr->e_type, elf_ehdr->e_entry); - printf("PHNUM: %X\n", program_header_table_entry_count); - printf("PHENTSIZE: %X\n\n", program_header_table_entry_size); + debug_log("magic: %X, type: %X, entry: 0x%X\n", elf_ehdr->e_ident, elf_ehdr->e_type, elf_ehdr->e_entry); + debug_log("PHNUM: %X\n", program_header_table_entry_count); + debug_log("PHENTSIZE: %X\n\n", program_header_table_entry_size); uint32_t* proc_pd = create_page_dir(); uint32_t proc_pd_phys = (uint32_t)get_physaddr((void*)proc_pd); - printf("proc_pd_phys: 0x%X\n", proc_pd_phys); + debug_log("proc_pd_phys: 0x%X\n", proc_pd_phys); uint32_t* curr_pd_virt = get_page_dir(); // CR3 содержит физический адрес, но get_page_dir возвращает его как uint32_t* uint32_t curr_pd_phys = (uint32_t)curr_pd_virt; // Просто приводим к uint32_t, так как CR3 содержит физический адрес @@ -93,22 +93,22 @@ void exec_from_file(const char* filename) Elf32_Phdr *elf_phdr = (Elf32_Phdr *)((uint32_t)file + elf_ehdr->e_phoff + i * elf_ehdr->e_phentsize); - printf("HEADER %X, type: 0x%X, vaddr: 0x%X, paddr: 0x%X, memsz: 0x%X\n", i, elf_phdr->p_type, elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz); + debug_log("HEADER %X, type: 0x%X, vaddr: 0x%X, paddr: 0x%X, memsz: 0x%X\n", i, elf_phdr->p_type, elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz); if(elf_phdr->p_type != PT_LOAD) { - printf("not PT_LOAD, skipping...\n"); + debug_log("not PT_LOAD, skipping...\n"); continue; } int pages_needed = DivRoundUp(elf_phdr->p_memsz, 0x1000);//(elf_phdr->p_memsz / 0x1000) + 1; - printf("pages needed: %X\n", pages_needed); + debug_log("pages needed: %X\n", pages_needed); for(int j = 0; j < pages_needed; j++) { uint32_t vaddr = (elf_phdr->p_vaddr & ~0xFFF) + j * 0x1000; void* phys_addr = alloc_page(); - printf("mapping 0x%X -> 0x%X\n", phys_addr, vaddr); + debug_log("mapping 0x%X -> 0x%X\n", phys_addr, vaddr); map_page(phys_addr, (void*)vaddr, PAGE_PRESENT | PAGE_RW | PAGE_USER); } @@ -120,11 +120,11 @@ void exec_from_file(const char* filename) memset((void*)bss_start, 0, bss_end - bss_start); } - printf("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz); - printf("================================\n\n\n\n"); + debug_log("p_filesz: 0x%X (%X)\n", elf_phdr->p_filesz, elf_phdr->p_filesz); + debug_log("================================\n\n\n\n"); } - printf("setting up the user stack...\n"); + debug_log("setting up the user stack...\n"); //TODO: i think this thing allocates more pages than needed for (uint32_t vaddr = USER_STACK_BOTTOM; vaddr <= USER_STACK_TOP; vaddr += PAGE_SIZE) { @@ -137,7 +137,7 @@ void exec_from_file(const char* filename) return; } map_page(phys_addr, (void*)(vaddr & ~0xFFF), PAGE_PRESENT | PAGE_RW | PAGE_USER); - printf("mapping stack 0x%X -> 0x%X (0x%X)\n", (uint32_t)phys_addr, vaddr, (vaddr & ~0xFFF)); + debug_log("mapping stack 0x%X -> 0x%X (0x%X)\n", (uint32_t)phys_addr, vaddr, (vaddr & ~0xFFF)); memset((void*)(vaddr & ~0xFFF), 0, PAGE_SIZE); // Add this } /* diff --git a/src/tasking/sys_exit.asm b/src/tasking/sys_exit.asm index df61e26..e001beb 100644 --- a/src/tasking/sys_exit.asm +++ b/src/tasking/sys_exit.asm @@ -19,7 +19,7 @@ sys_exit_handler: push esp call handle_syscall - add esp, 0x44 + add esp, 4 ; Восстанавливаем сегменты Ring 3 pop gs @@ -31,20 +31,5 @@ sys_exit_handler: ; Возвращаемся в Ring 3 iret -global test_user_function -test_user_function: -nigg: - mov eax, 0xB00B1E5 ; 0xDEADBEEF - int 0x80 - jmp nigg - -global second_user_function -second_user_function: -heh: - mov eax, 0xFACE5EA7 - int 0x80 - jmp heh - section .data -sys_exit_msg: db "Returned from Ring 3", 0 -syscall_debug_fmt: db "Syscall #%x, args: 0x%x 0x%x 0x%x 0x%x 0x%x", 10, 0 \ No newline at end of file +sys_exit_msg: db "Returned from Ring 3", 0 \ No newline at end of file diff --git a/src/tasking/task.c b/src/tasking/task.c index 504a0c1..ca63be7 100644 --- a/src/tasking/task.c +++ b/src/tasking/task.c @@ -36,7 +36,7 @@ Process* task_create(uint32_t func, uint32_t user_esp, uint32_t ring, uint32_t* void *kstack_physical = alloc_page(); p->kstack = (char*)((uint32_t)kstack_physical+0xC0000000); map_page(kstack_physical, p->kstack, PAGE_PRESENT | PAGE_RW); - printf("kstack: %X!!!!!!!!!!!!\n", p->kstack); + debug_log("kstack: %X!!!!!!!!!!!!\n", p->kstack); uint8_t* sp = (uint8_t*)(p->kstack + KSTACKSIZE); @@ -147,22 +147,12 @@ void scheduler_init() uint32_t* kernel_tasks_pagedir = (uint32_t*)create_page_dir(); task_create((uint32_t)idle, 0, 0, kernel_tasks_pagedir); - - /*void* args1[] = {(void*)42, (void*)"ebalo"}; - task_create((uint32_t)task1, args1, 2, 0, kernel_tasks_pagedir); - void* args2[] = {(void*)69, (void*)420}; - task_create((uint32_t)task2, args2, 2, 0, kernel_tasks_pagedir); - jump_usermode2();*/ } void handle_syscall(TrapFrame *tf) { - printf("========SYSCALL========\n"); - printf("EAX: %X\n", tf->eax); - printf("EBX: %X\n", tf->ebx); - printf("ECX: %s\n", tf->ecx); - printf("EDX: %X\n", tf->edx); - printf("======== END SYSCALL========\n"); - printf("SIZEOF TRAPFRAME: %X\n", sizeof(tf)); - printf("SIZEOF *TRAPFRAME: %X\n", sizeof(*tf)); + debug_log("EAX: %X ", tf->eax); + debug_log("EBX: %X ", tf->ebx); + debug_log("ECX: %s ", tf->ecx); + debug_log("EDX: %X\n", tf->edx); } \ No newline at end of file diff --git a/src/utils/stdio.c b/src/utils/stdio.c index e609211..d93be35 100644 --- a/src/utils/stdio.c +++ b/src/utils/stdio.c @@ -157,4 +157,4 @@ int printf(const char* restrict format, ...) { va_end(parameters); return written; -} +} \ No newline at end of file