/*======================================================================* cstart *======================================================================*/ PUBLIC void cstart() { disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----\"cstart\" begins-----\n"); /* 将 LOADER 中的 GDT 复制到新的 GDT 中 */ memcpy( &gdt, /* New GDT */ (void*)(*((u32*)(&gdt_ptr[2]))), /* Base of Old GDT */ *((u16*)(&gdt_ptr[0])) + 1 /* Limit of Old GDT */ ); /* gdt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sgdt 以及 lgdt 的参数。 */ u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(struct descriptor) - 1; *p_gdt_base = (u32)&gdt; /* idt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sidt 以及 lidt 的参数。 */ u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(struct gate) - 1; *p_idt_base = (u32)&idt; init_prot(); disp_str("-----\"cstart\" finished-----\n"); }
/*======================================================================* cstart *======================================================================*/ PUBLIC void cstart() { k_disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----\"cstart\" begins-----\n"); // 将 LOADER 中的 GDT 复制到新的 GDT 中 memcpy( &gdt, // New GDT (void*)(*((u32*)(&gdt_ptr[2]))), // Base of Old GDT *((u16*)(&gdt_ptr[0])) + 1 // Limit of Old GDT ); // gdt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sgdt 以及 lgdt 的参数。 u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *p_gdt_base = (u32)&gdt; // idt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sidt 以及 lidt 的参数。 u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(GATE) - 1; *p_idt_base = (u32)&idt; init_prot(); k_disp_str("-----\"cstart\" finished-----\n"); }
/*======================================================================* cstart *======================================================================*/ PUBLIC void cstart() { disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "-----\"cstart\" begins-----\n"); /* 将 LOADER 中的 GDT 复制到新的 GDT 中 */ memcpy(&gdt, /* New GDT */ (void*)(*((u32*)(&gdt_ptr[2]))), /* Base of Old GDT */ *((u16*)(&gdt_ptr[0])) + 1 /* Limit of Old GDT */ ); /* gdt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sgdt/lgdt 的参数。*/ u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *p_gdt_base = (u32)&gdt; /* idt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sidt/lidt 的参数。*/ u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(GATE) - 1; *p_idt_base = (u32)&idt; init_prot(); disp_str("-----\"cstart\" ends-----\n"); }
/** * Do some preparation before `lgdt' and `lidt', then call init_prot(). * *****************************************************************************/ PUBLIC void cstart() { /** * Prepare the new GDT. */ memcpy( &gdt, /* New GDT */ (void*)(*((u32*)(&gdt_ptr[2]))), /* Base of Old GDT */ *((u16*)(&gdt_ptr[0])) + 1 /* Limit of Old GDT */ ); /** * gdt_ptr[6] is used as the operand of `sgdt' and `lgdt', it * contains 6 bytes (48 bits): * - bit 0~15: Limit * - bit 16~47: Base */ u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_base = (u32)&gdt; *p_gdt_limit = GDT_SIZE * sizeof(struct descriptor) - 1; /* WHY `- 1': ~~~ The limit value for the GDT is expressed in bytes. As with segments, the limit value is added to the base ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ address to get the address of the last valid byte. A ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ limit value of 0 results in exactly one valid byte. Because segment descriptors are always 8 bytes long, the GDT limit should always be one less than an integral multiple of eight (that is, 8N – 1). */ /** * idt_ptr[6] is used as the operand of `sidt' and `lidt', it * contains 6 bytes (48 bits): * - bit 0~15: Limit * - bit 16~47: Base */ u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(struct gate) - 1; *p_idt_base = (u32)&idt; /* kernel code/data base address (phys) */ k_code_base = seg2linear(SELECTOR_KERNEL_CS); k_data_base = seg2linear(SELECTOR_KERNEL_DS); init_prot(); }
PUBLIC void cstart() { showMsg();//set gs first, or you will get error when you show msg disp_str("\ncstart-start"); disp_str("\n"); set_gdt(0, 0x0000, 0x0000, 0x0000, 0x0000); set_gdt(1, 0x0FFF, 0x0000, 0x9A00, 0x00C0); // code set_gdt(2, 0x0FFF, 0x0000, 0x9200, 0x00C0); // data segment set_gdt(3, 0xFFFF, 0x8000, 0x920B|0x6000, 0x00C0); // GS, SET DPL = 3 disp_int(0x67AB); init_gptr(); init_iptr(); init_prot(); disp_str("\ncse"); }
/* int disp_pos; u8 gdt_ptr[8]; DESCRIPTOR gdt[GDT_SIZE]; */ void cstart() { print_str("\n\n" "----------" "cstart" "----------\n"); memcpy(&gdt, (void*)(*((u32*)(&gdt_ptr[2]))), *((u16*)(&gdt_ptr[0]))+1); *((u16*)(&gdt_ptr[0])) = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *((u32*)(&gdt_ptr[2])) = (u32)&gdt; *((u16*)(&idt_ptr[0])) = IDT_SIZE * sizeof(GATE) - 1; *((u32*)(&idt_ptr[2])) = (u32)&idt; init_prot(); print_str("----------" "cstart" "----------\n"); }
PUBLIC void cstart() { disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n--------\"cstart\" begins--------"); memcpy(&gdt, (void*)(*((u32*)(&gdt_ptr[2]))), *((u16*)(&gdt_ptr[0]))+1); u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *p_gdt_base = (u32)&gdt; u32* p_idt_base = (u32*)(&idt_ptr[2]); u16* p_idt_limit = (u16*)(&idt_ptr[0]); *p_idt_base = (u32)&idt; *p_idt_limit = IDT_SIZE * sizeof(GATE) - 1; init_prot(); disp_str("\n--------\"cstart\" ends--------\n"); }
void cstart() { disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n--cstart-begins--\n"); //将 LOADER 中的 GDT 复制到新的 GDT 中 memcpy(&gdt, (void*)(*((u32*)(&gdt_ptr[2]))), *((u16*)(&gdt_ptr[0])) + 1); u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *p_gdt_base = (u32)&gdt; u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(GATE) - 1; *p_idt_base = (u32)&idt; init_prot(); disp_str("--cstart-ends--\n"); }
/* * 下面函数的功能是将原来的gdt复制到新的位置 * 然后同步将gdt_ptr中的长度与基址同时也进行更新 */ void cstart(void) { display_string("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "-- cstart begins --\n"); /* 将gdt复制到新的地方 */ memcpy(&gdt, (void *)(*((u32*)(&gdt_ptr[2]))), *((u16*)(&gdt_ptr[0]))+1); u16* p_gdt_limit = (u16*)(&gdt_ptr[0]); u32* p_gdt_base = (u32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(struct DESCRIPTOR) -1; *p_gdt_base = (u32)&gdt; u16* p_idt_limit = (u16*)(&idt_ptr[0]); u32* p_idt_base = (u32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(struct GATE); *p_idt_base = (u32)&idt; init_prot(); display_string("-- cstart ends --\n"); }
/*======================================================================* cstart *======================================================================*/ PUBLIC void cstart() { //disp_str("\n\n\n\n\n\n\n\n\n\n\n"); disp_str("------------------------------\"cstart\" begins-----------------------\n"); disp_str("======================================================================\n"); disp_str(" ********** ****** *** ** ****** ** ** \n"); disp_str(" ** ** **** ** ** * * \n"); disp_str(" ** ** ** ** ** ** ** \n"); disp_str(" ** ** ** ** ** ** ** \n"); disp_str(" ** ** ** ** ** ** ** \n"); disp_str(" ** ** ** ** ** ** ** \n"); disp_str(" ** ** ** **** ** * * \n"); disp_str(" ** ****** ** *** ****** ** ** \n"); disp_str("======================================================================\n"); disp_str(" *////////////////////////////////////////////*/\n"); disp_str(" design by Kang Huilin && Huang Anna \n"); disp_str(" 2015.7.20-2015.7.24 \n"); disp_str(" *////////////////////////////////////////////*/\n"); disp_str(" ********** ****** *** ** ****** ** ** \n"); delay(20); disp_str(" ** ** **** ** ** * * \n"); delay(20); disp_str(" ** ** ** ** ** ** ** \n"); delay(20); disp_str(" ** ** ** ** ** ** ** \n"); delay(20); disp_str(" ** ** ** ** ** ** ** \n"); delay(20); disp_str(" ** ** ** ** ** ** ** \n"); delay(20); disp_str(" ** ** ** **** ** * * \n"); delay(20); disp_str(" ** ****** ** *** ****** ** ** \n"); delay(20); disp_str("======================================================================\n"); disp_str("---------------------------\"cstart\" finished------------------------\n"); delay(100); // 将 LOADER 中的 GDT 复制到新的 GDT 中 memcpy( &gdt, // New GDT (void*)(*((t_32*)(&gdt_ptr[2]))), // Base of Old GDT *((t_16*)(&gdt_ptr[0])) + 1 // Limit of Old GDT ); // gdt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sgdt 以及 lgdt 的参数。 t_16* p_gdt_limit = (t_16*)(&gdt_ptr[0]); t_32* p_gdt_base = (t_32*)(&gdt_ptr[2]); *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; *p_gdt_base = (t_32)&gdt; // idt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sidt 以及 lidt 的参数。 t_16* p_idt_limit = (t_16*)(&idt_ptr[0]); t_32* p_idt_base = (t_32*)(&idt_ptr[2]); *p_idt_limit = IDT_SIZE * sizeof(GATE) - 1; *p_idt_base = (t_32)&idt; init_prot(); }