diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-17 16:43:28 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-04-17 16:43:28 +0200 |
| commit | 3259715b0ed510ededeeb8240cc3bbdcdfc362a3 (patch) | |
| tree | 4dadcb81f7e15c9e6d4d2f0a371734f3341484dc | |
| parent | dcadede2d4d6f7b94e38412dfbb924ed8abea709 (diff) | |
Improve task stack management
| -rw-r--r-- | src/bringelle.c | 13 | ||||
| -rw-r--r-- | src/core/scheduler.c | 11 | ||||
| -rw-r--r-- | src/core/scheduler.h | 2 |
3 files changed, 17 insertions, 9 deletions
diff --git a/src/bringelle.c b/src/bringelle.c index 17d3845..22791f3 100644 --- a/src/bringelle.c +++ b/src/bringelle.c @@ -5,6 +5,8 @@ #include "core/paging.h" #include "core/scheduler.h" +#define TASK_WAIT 50000000 + extern void interrupt_enable(); void utask(){ @@ -13,7 +15,7 @@ void utask(){ msg[1]='\0'; while(1){ asm("mov $0x1, %%eax;int $0x30"::"b"(msg)); - for(int i=0;i<5000;i++){ + for(int i=0;i<TASK_WAIT;i++){ } } @@ -25,7 +27,7 @@ void utask2(){ msg[1]='\0'; while(1){ asm("mov $0x1, %%eax;int $0x30"::"b"(msg)); - for(int i=0;i<5000;i++){ + for(int i=0;i<TASK_WAIT;i++){ } } @@ -51,10 +53,9 @@ void bringelle(){ // Utask print("Launch user tasks \n"); - int* page_dir=paging_allocate(2); - task_create(page_dir, utask,100, 0xFF); - int* page_dir2=paging_allocate(2); - task_create(page_dir2, utask2,100,0xFF); + task_create(utask,100); + task_create(utask2,100); + scheduler_start(); diff --git a/src/core/scheduler.c b/src/core/scheduler.c index 224c20d..59f3b9d 100644 --- a/src/core/scheduler.c +++ b/src/core/scheduler.c @@ -80,11 +80,16 @@ void clock(){ schedule(stack); } -void task_create(int *page_dir, void *task, int task_size, int stack_offset){ +void task_create(void *task, int task_size){ if(nproc<=MAX_PROC){ + // Allocate at least 1 page and 1 page for the user stack + int allocated=1+task_size/4096+1; + int* page_dir=paging_allocate(allocated); + // Compute various addresses void *entry_point=PAGING_ENTRY_POINT_VIRT; - void *ustack=(void*)(PAGING_ENTRY_POINT_VIRT+stack_offset); + // User stack start at the end of last allocated page (since addresses are going down) + void *ustack=(void*)(PAGING_ENTRY_POINT_VIRT+allocated*4096); // Load the task into memory memcpy(task,PAGING_ENTRY_POINT_PHY(page_dir), task_size); @@ -119,6 +124,8 @@ void task_create(int *page_dir, void *task, int task_size, int stack_offset){ p->page_dir=page_dir; nproc++; } + else + print("Could not create more task!"); } void scheduler_start(){ diff --git a/src/core/scheduler.h b/src/core/scheduler.h index 62d6561..3410ba1 100644 --- a/src/core/scheduler.h +++ b/src/core/scheduler.h @@ -47,7 +47,7 @@ void schedule(u32 *stack); /** * Create a new task to be schedule */ -void task_create(int *page_dir, void *task, int task_size, int stack_offset); +void task_create(void *task, int task_size); /** * Stack the scheduler starting by task with PID 0 |
