fix: a bunch of stuff related to multitasking

This commit is contained in:
0x35c 2025-01-23 14:12:38 +01:00
parent 2ba4037af2
commit 2d6b24842e
6 changed files with 15 additions and 12 deletions

View File

@ -3,7 +3,7 @@ NAME := bozOS
AS := i386-elf-as AS := i386-elf-as
ASFLAGS := -g ASFLAGS := -g
CC := i386-elf-gcc CC := i386-elf-gcc
CFLAGS := -std=gnu99 -ffreestanding -Wall -Wextra -iquotelibbozo/headers -iquoteheaders -MMD -fno-omit-frame-pointer -fstack-protector-all -g CFLAGS := -std=gnu99 -ffreestanding -Wall -Wextra -iquotelibbozo/headers -iquoteheaders -MMD -fno-omit-frame-pointer -fstack-protector-all -g3
LD := $(CC) LD := $(CC)
LDFLAGS := -T boot/linker.ld -ffreestanding -nostdlib LDFLAGS := -T boot/linker.ld -ffreestanding -nostdlib
LIBS := -L libbozo/build/ -lbozo -lgcc LIBS := -L libbozo/build/ -lbozo -lgcc
@ -33,9 +33,7 @@ $(NAME): $(OBJ)
run: $(NAME) run: $(NAME)
qemu-system-i386 -kernel build/$(NAME).bin -vga std qemu-system-i386 -kernel build/$(NAME).bin -vga std
iso: $(NAME) iso: $(NAME) mkdir -p isodir/boot/grub cp build/$(NAME).bin isodir/boot/$(NAME).bin
mkdir -p isodir/boot/grub
cp build/$(NAME).bin isodir/boot/$(NAME).bin
cp config/grub.cfg isodir/boot/grub/grub.cfg cp config/grub.cfg isodir/boot/grub/grub.cfg
grub-mkrescue -o build/$(NAME).iso --compress=xz --locales=en@quot --themes= isodir grub-mkrescue -o build/$(NAME).iso --compress=xz --locales=en@quot --themes= isodir
rm -rf isodir rm -rf isodir

View File

@ -38,8 +38,10 @@ void clock_init(struct registers *regs)
static void clock_handler(struct registers *regs) static void clock_handler(struct registers *regs)
{ {
(void)regs; (void)regs;
if (scheduler_counter % 10) if (scheduler_counter % 10 == 0) {
cli();
scheduler(); scheduler();
}
scheduler_counter++; scheduler_counter++;
sleep_counter--; sleep_counter--;
} }

View File

@ -61,7 +61,6 @@ void kernel_main(multiboot_info_t *mbd, uint32_t magic)
*/ */
/* "Martin 03:50, 22 March 2009 (UTC)\n"); */ /* "Martin 03:50, 22 March 2009 (UTC)\n"); */
create_kernel_task(); create_kernel_task();
exec_fn(owo); exec_fn(awa);
// exec_fn(owo);
shell_init(); shell_init();
} }

View File

@ -10,7 +10,7 @@ void scheduler(void)
if (!current_task) if (!current_task)
return; return;
struct task *it = current_task->next; struct task *it = current_task->next;
while (it->status != RUN) while (it && it->status != RUN)
it = it->next; it = it->next;
switch_to_task(it); switch_to_task(it);
} }

View File

@ -23,6 +23,8 @@ switch_to_task:
mov esp, [current_task] // esp mov esp, [current_task] // esp
mov eax, [current_task+4] // esp0 mov eax, [current_task+4] // esp0
mov ebx, [current_task+8] // cr3 mov ebx, [current_task+8] // cr3
mov edi, [current_task+12] // page_directory
mov [page_directory], edi
mov [TSS+4], eax // tss.esp0 mov [TSS+4], eax // tss.esp0
mov ecx, cr3 mov ecx, cr3
@ -41,4 +43,6 @@ switch_to_task:
pop ebp pop ebp
pop ebx pop ebx
sti
ret ret

View File

@ -15,6 +15,9 @@ static struct task *create_task(uint8_t owner_id)
struct task *new_task = vmalloc(sizeof(struct task)); struct task *new_task = vmalloc(sizeof(struct task));
if (!new_task) if (!new_task)
return NULL; return NULL;
new_task->next = current_task->next;
new_task->prev = current_task;
current_task->next = new_task;
new_task->owner_id = owner_id; new_task->owner_id = owner_id;
new_task->pid = pid++; new_task->pid = pid++;
new_task->heap = alloc_pages(4096, (void **)&new_task->cr3); new_task->heap = alloc_pages(4096, (void **)&new_task->cr3);
@ -29,7 +32,7 @@ int create_kernel_task(void)
{ {
struct task *new_task = vmalloc(sizeof(struct task)); struct task *new_task = vmalloc(sizeof(struct task));
if (!new_task) if (!new_task)
return 1; return -1;
new_task->owner_id = 0; new_task->owner_id = 0;
new_task->pid = 0; new_task->pid = 0;
new_task->heap = page_directory; new_task->heap = page_directory;
@ -46,9 +49,6 @@ void exec_fn(void (*fn)(void))
kpanic("failed to create new task"); kpanic("failed to create new task");
new_task->status = RUN; new_task->status = RUN;
new_task->eip = (uint32_t *)fn; new_task->eip = (uint32_t *)fn;
new_task->prev = current_task;
new_task->next = current_task->next;
current_task->next = new_task;
} }
/* /*