diff --git a/Makefile b/Makefile index 99cfe01acba574a71eed6eb6d572cdb6e99cd764..8ba1c362450b2550d5e1eac5bc9b0024dbad1e6e 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ linux.img : tools/build bootsect setup kernel/system tools/build : tools/build.c gcc -o $@ $< -kernel/system : kernel/head.S kernel/*.c +kernel/system : kernel/head.S kernel/*.c mm/*.c cd kernel; make system; cd .. bootsect : bootsect.o diff --git a/include/linux/sched.h b/include/linux/sched.h index cfc82a5e30b1c33356c47df3d99a8f5162a761f0..2bd53a7b7ee8b0b1cadf5866fa5df1f0baa67f11 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -56,8 +56,8 @@ struct task_struct { { \ { \ {0, 0}, \ - {0x9f, 0xc0fa00}, \ - {0x9f, 0xc0f200}, \ + {0xfff, 0xc0fa00}, \ + {0xfff, 0xc0f200}, \ }, \ {0, PAGE_SIZE + (long)&init_task, 0x10, 0, 0, 0, 0, (long)&pg_dir, \ 0, 0, 0, 0, 0, 0, 0, 0, \ diff --git a/kernel/Makefile b/kernel/Makefile index b5ac62d35ec61ca76955a28f7310c0647ecd84d5..7a092d41e9d9d25d54c8c6d8134d13911b5a63cf 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -5,7 +5,7 @@ INCDIR := ../include OBJS := head.o main.o sys_call.o asm.o sched.o printk.o vsprintf.o traps.o fork.o chr_drv/chr_drv.a ../mm/mm.o system: $(OBJS) - $(LD) $(LDFLAG) -e startup_32 -o $@ $^ + $(LD) $(LDFLAG) -M -e startup_32 -o $@ $^ > System.map head.o : head.S $(GCC) -m32 -traditional -c -o $@ $< @@ -43,6 +43,7 @@ chr_drv/chr_drv.a: chr_drv/*.c clean : rm *.o rm system + rm System.map cd chr_drv; make clean; cd .. cd ../mm; make clean; cd ../kernel diff --git a/kernel/main.c b/kernel/main.c index 4b939072a26f94edc312f800d9121dbad17c6dfc..7220d00577eb7695e8b0b3da04faf9485932f191 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -47,9 +47,9 @@ void main(void) printk("%x, %x\n\r", task[0], task[1]); move_to_user_mode(); - test_a(); + __asm__ __volatile__( "int $0x80\n\r" "loop:\n\r" diff --git a/kernel/sched.c b/kernel/sched.c index d0aed538f5d3f76efd3bf3e55db2c1273777258c..9a876b6061ab6b2b008215c5f41ab08e4bd92963 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -18,10 +18,10 @@ union task_union { }; static union task_union init_task = {INIT_TASK, }; -static union task_union second_task = {INIT_TASK,}; +//static union task_union second_task; struct task_struct * current = &(init_task.task); -struct task_struct * task[NR_TASKS] = {&(init_task.task), &(second_task.task)}; +struct task_struct * task[NR_TASKS] = {&(init_task.task), }; long user_stack[PAGE_SIZE >> 2]; @@ -33,9 +33,15 @@ struct int clock = COUNTER; +static int cnt = 0; +static int isFirst = 1; void do_timer(long cpl) { - static int isFirst = 1; + cnt++; + + if (cnt > 2) + return; + if (clock >0 && clock <= COUNTER) { clock--; } @@ -53,6 +59,7 @@ void do_timer(long cpl) { else { clock = COUNTER; } + cnt--; } void sched_init() { @@ -96,24 +103,33 @@ int create_second_process() { if (nr < 0) return -EAGAIN; - p = (struct task_struct*) &(second_task.task); + //p = (struct task_struct*) &(second_task.task); + p = (struct task_struct*) get_free_page(); + *p = *current; set_tss_desc(gdt+(nr<<1)+FIRST_TSS_ENTRY,&(p->tss)); set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY,&(p->ldt)); + p->ldt[0] = current->ldt[0]; + p->ldt[1] = current->ldt[1]; + p->ldt[2] = current->ldt[2]; + + p->tss = current->tss; + p->tss.eip = (long)test_b; p->tss.ldt = _LDT(nr); p->tss.ss0 = 0x10; - p->tss.esp0 = PAGE_SIZE + (long)&second_task; + p->tss.esp0 = PAGE_SIZE + (long)p - 8; p->tss.ss = 0x10; p->tss.ds = 0x10; p->tss.es = 0x10; - p->tss.cs = 0x08; + p->tss.cs = 0x8; p->tss.fs = 0x10; - p->tss.esp = PAGE_SIZE + (long)&second_task; + p->tss.esp = PAGE_SIZE + (long)p - 8; p->tss.eflags = 0x602; task[nr] = p; + return nr; } void test_a(void) { @@ -133,10 +149,6 @@ __asm__("movl $0, %edi\n\r" void test_b(void) { __asm__("movl $0, %edi\n\r" - "movl $0x17, %eax\n\t" - "movw %ax, %ds \n\t" - "movw %ax, %es \n\t" - "movw %ax, %fs \n\t" "movw $0x18, %ax\n\t" "movw %ax, %gs \n\t" "movb $0x0f, %ah\n\r" diff --git a/kernel/traps.c b/kernel/traps.c index 078563f486fa94bab77334fd8156efe90e8ee8e1..86cbdb5c79c92e32b0450a63118884ce49e94220 100644 --- a/kernel/traps.c +++ b/kernel/traps.c @@ -31,7 +31,8 @@ static void die(char* str, long esp_ptr, long nr) { int i = 0; long* esp = (long*)esp_ptr; - printk("\n\rEIP:\t%04x:%p\n\rEFLAGS:\t%p\n\rESP:\t%04x:%p\n\r", + printk("\n\r%s: %04x\n\r", str, nr & 0xffff); + printk("EIP:\t%04x:%p\n\rEFLAGS:\t%p\n\rESP:\t%04x:%p\n\r", esp[1],esp[0],esp[2],esp[4],esp[3]); printk("fs: %04x\n\r",_fs()); diff --git a/mm/swap.c b/mm/swap.c index 6b4ae3e580727e14874f0ea6377e5b6e36a6e78f..187cb880451a5c5799bfed21f90e2ba35b26e280 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -1,7 +1,7 @@ #include unsigned long get_free_page() { - register unsigned long __res asm("ax"); + register unsigned long __res asm("ax") = 0; repeat: __asm__("std ; repne ; scasb\n\t" @@ -12,11 +12,12 @@ __asm__("std ; repne ; scasb\n\t" "movl %%ecx, %%edx\n\t" "movl $1024, %%ecx\n\t" "leal 4092(%%edx), %%edi\n\t" + "xor %%eax, %%eax\n\t" "rep; stosl;\n\t" "movl %%edx,%%eax\n" "1:" :"=a"(__res) - :"i"(0), "i"(LOW_MEM), "c"(PAGING_PAGES), + :""(0), "i"(LOW_MEM), "c"(PAGING_PAGES), "D"(mem_map+PAGING_PAGES-1) :"dx");