From: vosystems Date: Sun, 26 Oct 2014 12:44:28 +0000 (+0900) Subject: Start to make Task Switch System X-Git-Url: http://git.osdn.net/view?p=vaneos%2Fvaneosmain.git;a=commitdiff_plain;h=30d621b0fbbb69440e5ffcffe430953471b70b16 Start to make Task Switch System --- diff --git a/BIN_HISTORY/2014.10.26.vsb b/BIN_HISTORY/2014.10.26.vsb new file mode 100755 index 0000000..331f893 Binary files /dev/null and b/BIN_HISTORY/2014.10.26.vsb differ diff --git a/Kernel/GDT_IDT.c b/Kernel/GDT_IDT.c index f8fc78d..0619c33 100644 --- a/Kernel/GDT_IDT.c +++ b/Kernel/GDT_IDT.c @@ -6,15 +6,6 @@ GATE_DESCRIPTOR idt[ NUM_IDT ]; SEGMENT_DESCRIPTOR gdt[ NUM_GDT ]; GDTR gdtr; -void setupSegmentDescriptor(int num,unsigned short limit,unsigned int base,unsigned short flags) -{ - gdt[num].limitLo=limit; - gdt[num].baseLo= base & 0xffff; - gdt[num].baseMid=(base >> 16) & 0xff; - gdt[num].flags=flags; - gdt[num].baseHi=(base >> 24) & 0xff; -} - void setupInterruptGate( int int_num, void *interrupt_handler ) { setupGateDescriptor( int_num, diff --git a/Kernel/Vane.S b/Kernel/Vane.S index a79b568..a9b1991 100644 --- a/Kernel/Vane.S +++ b/Kernel/Vane.S @@ -7,7 +7,11 @@ .global io_hlt,io_cli,io_sti,io_stihlt .global io_in8,io_in16,io_in32,io_out8,io_out16,io_out32 .global io_load_eflags,io_store_eflags,load_cr0,store_cr0,load_tr -.global farjmp,taskswitch,load_gdtr,load_idtr +.global farjmp,taskswitch + +taskswitch: + JMP 4*8:0 + RET farjmp: JMP FAR [ESP+4] @@ -88,17 +92,41 @@ store_cr0: load_tr: LTR [ESP+4] RET - -taskswitch: - JMP 4*8:0 - RET - + + write_mem8: MOV ECX,[ESP+4] MOV AL,[ESP+8] MOV [ECX],AL RET +scrn320: + MOV AL,0x13 + MOV AH,0x00 + INT 0x10 + + RET + +VESA_Check: + MOV AX,0x9000 + MOV ES,AX + MOV DI,0 + MOV AX,0x004F + INT 0x10 + + CMP AX,0x004F + MOV EAX,0x01 + JNE scrn320 + MOV EAX,0x00 + RET + +VESA_640_480_SET: + MOV BX,0x0101 + MOV AX,0x4F02 + INT 0x10 + + RET + clear_state: jmp 0x08:_flush_seg RET @@ -127,14 +155,3 @@ asm_move_cursol: RET -load_gdtr: - MOV AX,[ESP+4] - MOV [ESP+6],AX - LGDT [ESP+6] - RET - -load_idtr: - MOV AX,[ESP+4] - MOV [ESP+6],AX - LIDT [ESP+6] - RET diff --git a/Kernel/boot.c b/Kernel/boot.c index 18ebb7d..9ea45d5 100644 --- a/Kernel/boot.c +++ b/Kernel/boot.c @@ -10,9 +10,7 @@ MIT License http://opensource.org/licenses/mit-license.php - Copyright (C) 2013-2014 VaneOS Project. All rights reserved. Copyright (C) 2013-2014 VOSystems. All rights reserved. - Copyright (C) 2013 odeeeen. All rights reserved. */ #include @@ -29,7 +27,6 @@ #include #include #include -#include /*PROTOTYPE*/ void outPortByte( unsigned short address, unsigned char value ); @@ -55,7 +52,7 @@ void cstart(unsigned long magic, unsigned long addr) char cmd[100]={0}; struct MEMMAN *memman=(struct MEMMAN*)MEMMAN_ADDR; multiboot_info_t *mbi; - int aaa; + mbi = (multiboot_info_t *) addr; vga_text_init(); @@ -67,7 +64,17 @@ void cstart(unsigned long magic, unsigned long addr) /*Start Set Main Code*/ printVersion(); - cr(); + putchar('\n'); + + /*Setting IDT*/ + printTASK("Setting IDT....."); + setupInterruptGate(DEF_IDT_INT_NUM_IRQ1,KeyBoard_Interrupt_asm);//Register Keyboard interrupt handler + setupInterruptGate(DEF_IDT_INT_NUM_IRQ0,Timer_Interrupt_asm);//Register Timer interrupt handler + idtr.size = NUM_IDT * sizeof( GATE_DESCRIPTOR ); + idtr.base = ( GATE_DESCRIPTOR *)idt; + + load_idt(); + printOK("Setting IDT....."); /*Setting GDT*/ printTASK("Setting GDT....."); @@ -95,19 +102,8 @@ void cstart(unsigned long magic, unsigned long addr) load_gdt(); printOK("Setting GDT....."); - while(1); - /*Setting IDT*/ - printTASK("Setting IDT....."); - setupInterruptGate(DEF_IDT_INT_NUM_IRQ1,KeyBoard_Interrupt_asm);//Register Keyboard interrupt handler - setupInterruptGate(DEF_IDT_INT_NUM_IRQ0,Timer_Interrupt_asm);//Register Timer interrupt handler - idtr.size = NUM_IDT * sizeof( GATE_DESCRIPTOR ); - idtr.base = ( GATE_DESCRIPTOR *)idt; - - load_idt(); - printOK("Setting IDT....."); printTASK("Init PIC....."); - initPIC(); printOK("Init PIC....."); @@ -146,14 +142,8 @@ void cstart(unsigned long magic, unsigned long addr) printtime(); cr();cr(); - ShowPrompt();getchar(); - scan_str(cmd,sizeof(cmd)/sizeof(cmd[0])); - printf("SSS-%s",cmd); - while(1); - task_switch(memman); - do{ - ShowPrompt(); + ShowPrompt();//puts("\nKernelShell/Root/>"); scan_str(cmd,sizeof(cmd)/sizeof(cmd[0])); if(strcmp("time",cmd)==0){ @@ -162,7 +152,11 @@ void cstart(unsigned long magic, unsigned long addr) putchar('\r'); printtime(); if(kbhit()=='q')break; - Sleep(50); + io_hlt(); + io_hlt(); + io_hlt(); + io_hlt(); + io_hlt(); } cr();cr(); @@ -181,13 +175,16 @@ void cstart(unsigned long magic, unsigned long addr) }else if(strcmp("cls",cmd)==0 || strcmp("clear",cmd)==0){ ClearScreen(); + }else if(strcmp("switch",cmd)==0){ + task_switch(memman); + }else{ if(strcmp("exit",cmd)==0)break; printFAIL("Unknown this command"); cr(); } - + //init_char_arrey(cmd,100); }while(strcmp(cmd,"exit")!=0); while(1)io_hlt(); return; @@ -210,7 +207,6 @@ unsigned char inPortByte( unsigned short address ) void initPIC( void ) { - disable(); outPortByte( PORT_MASTER_PIC_COMMAND, PIC_ICW1 ); @@ -228,27 +224,11 @@ void initPIC( void ) outPortByte( PORT_MASTER_PIC_IMR, (~PIC_IMR_MASK_IRQ0) & (~PIC_IMR_MASK_IRQ2 ) ); outPortByte( PORT_SLAVE_PIC_IMR, PIC_IMR_MASK_IRQ_ALL ); - outPortByte( PORT_MASTER_PIC_IMR, ( ~PIC_IMR_MASK_IRQ0 ) + outPortByte( PORT_MASTER_PIC_IMR, ( ~PIC_IMR_MASK_IRQ0 ) & ( ~PIC_IMR_MASK_IRQ1 ) & ( ~PIC_IMR_MASK_IRQ2 ) ); - outPortByte( PORT_SLAVE_PIC_IMR, PIC_IMR_MASK_IRQ_ALL ); + outPortByte( PORT_SLAVE_PIC_IMR, PIC_IMR_MASK_IRQ_ALL ); - enable();/* - io_out8(PIC0_IMR,0xff); - io_out8(PIC1_IMR,0xff); - - io_out8(PIC0_ICW1,0x11); - io_out8(PIC0_ICW2,0x20); - io_out8(PIC0_ICW3,1<<2); - io_out8(PIC0_ICW4,0x01); - - io_out8(PIC1_ICW1,0x11); - io_out8(PIC1_ICW2,0x28); - io_out8(PIC1_ICW3,2); - io_out8(PIC1_ICW4,0x01); - - io_out8(PIC0_IMR,0xfb); - io_out8(PIC1_IMR,0xff);*/ - return; + enable(); } int setPitCounter( int freq, unsigned char counter, unsigned char mode ) diff --git a/Kernel/task.c b/Kernel/task.c index 85993fc..20b63d9 100644 --- a/Kernel/task.c +++ b/Kernel/task.c @@ -16,6 +16,16 @@ void task_b_main(void) while(1)io_hlt(); } +void setupSegmentDescriptor(int num,unsigned short limit,unsigned int base,unsigned short flags) +{ + if(num==1 || num==2 || num==3 || num>=NUM_GDT)return; + gdt[num].limitLo=limit; + gdt[num].baseLo=base & 0xffff; + gdt[num].baseMid=(base >> 16) & 0xff; + gdt[num].flags=flags; + gdt[num].baseHi=(base >> 24) & 0xff; +} + void task_switch(struct MEMMAN* memman) { struct tss a,b; @@ -24,8 +34,8 @@ void task_switch(struct MEMMAN* memman) b.ldtr=0; b.iomap=0x40000000; - setupSegmentDescriptor(3,103,(int)&a,AR_TSS32); - setupSegmentDescriptor(4,103,(int)&b,AR_TSS32); + setupSegmentDescriptor(3,103,(int)&a,DEF_GDT_CODE_FLAGS); + setupSegmentDescriptor(4,103,(int)&b,DEF_GDT_CODE_FLAGS); int task_b_esp; task_b_esp=memman_alloc_4k(memman,64*1024)+64*1024; @@ -46,5 +56,6 @@ void task_switch(struct MEMMAN* memman) b.ds=1*8; b.fs=1*8; b.gs=1*8; + load_tr(3*8); taskswitch(); } diff --git a/bin/Kernel.vsb b/bin/Kernel.vsb index fbc995f..1deb703 100755 Binary files a/bin/Kernel.vsb and b/bin/Kernel.vsb differ diff --git a/include/GDT_IDT.h b/include/GDT_IDT.h index 56ce2f7..da48a08 100644 --- a/include/GDT_IDT.h +++ b/include/GDT_IDT.h @@ -5,10 +5,10 @@ void setupInterruptGate( int int_num, void *interrupt_handler ); void setupGateDescriptor( int int_num,int base,unsigned short selector,unsigned char flags ); void load_gdt(void); void load_idt(void); -void setupSegmentDescriptor(int num,unsigned short limit,unsigned int base,unsigned short flags); -/*GDT Segment Descriptor*/ +#define AR_TSS32 0x0089 +/*GDT Segment Descriptor*/ typedef struct { unsigned short limitLo; @@ -44,8 +44,6 @@ typedef struct /*DEFINES*/ /*IDT*/ -#define AR_INTGATE32 0x008e - #define NUM_IDT 256 #define DEF_IDT_FLAGS_INTGATE_16BIT 0x06 @@ -68,8 +66,7 @@ typedef struct #define DEF_IDT_INT_SELECTOR 0x08 /*GDT*/ -#define NUM_GDT 3//8192 - +#define NUM_GDT 4096 #define NULL_DESCRIPTOR 0 #define CODE_DESCRIPTOR 1 #define DATA_DESCRIPTOR 2 diff --git a/include/GDT_IDT.h~ b/include/GDT_IDT.h~ index f37a9bc..092428c 100644 --- a/include/GDT_IDT.h~ +++ b/include/GDT_IDT.h~ @@ -5,10 +5,9 @@ void setupInterruptGate( int int_num, void *interrupt_handler ); void setupGateDescriptor( int int_num,int base,unsigned short selector,unsigned char flags ); void load_gdt(void); void load_idt(void); -void setupSegmentDescriptor(int num,unsigned short limit,unsigned int base,unsigned short flags); -/*GDT Segment Descriptor*/ +/*GDT Segment Descriptor*/ typedef struct { unsigned short limitLo; @@ -44,8 +43,6 @@ typedef struct /*DEFINES*/ /*IDT*/ -#define AR_INTGATE32 0x008e - #define NUM_IDT 256 #define DEF_IDT_FLAGS_INTGATE_16BIT 0x06 @@ -68,8 +65,7 @@ typedef struct #define DEF_IDT_INT_SELECTOR 0x08 /*GDT*/ -#define NUM_GDT 8192 - +#define NUM_GDT 4096 #define NULL_DESCRIPTOR 0 #define CODE_DESCRIPTOR 1 #define DATA_DESCRIPTOR 2