OSDN Git Service

Start to make Task Switch System
authorvosystems <doradora.motochan@gmail.com>
Sun, 26 Oct 2014 12:44:28 +0000 (21:44 +0900)
committervosystems <doradora.motochan@gmail.com>
Sun, 26 Oct 2014 12:44:28 +0000 (21:44 +0900)
BIN_HISTORY/2014.10.26.vsb [new file with mode: 0755]
Kernel/GDT_IDT.c
Kernel/Vane.S
Kernel/boot.c
Kernel/task.c
bin/Kernel.vsb
include/GDT_IDT.h
include/GDT_IDT.h~

diff --git a/BIN_HISTORY/2014.10.26.vsb b/BIN_HISTORY/2014.10.26.vsb
new file mode 100755 (executable)
index 0000000..331f893
Binary files /dev/null and b/BIN_HISTORY/2014.10.26.vsb differ
index f8fc78d..0619c33 100644 (file)
@@ -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,
index a79b568..a9b1991 100644 (file)
@@ -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
index 18ebb7d..9ea45d5 100644 (file)
@@ -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<multiboot.h>
@@ -29,7 +27,6 @@
 #include<System.h>
 #include<Env.h>
 #include<tools.h>
-#include<time.h>
 
 /*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 )
index 85993fc..20b63d9 100644 (file)
@@ -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();
 }
index fbc995f..1deb703 100755 (executable)
Binary files a/bin/Kernel.vsb and b/bin/Kernel.vsb differ
index 56ce2f7..da48a08 100644 (file)
@@ -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
index f37a9bc..092428c 100644 (file)
@@ -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