Example #1
0
/*======================================================================*
                            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");
}
Example #2
0
/*======================================================================*
                            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");
}
Example #3
0
/*======================================================================*
                            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");
}
Example #4
0
/**
 * 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();
}
Example #5
0
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");
}
Example #6
0
/*
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");
  
}
Example #7
0
File: start.c Project: Zach41/OS
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");
}
Example #8
0
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");
}
Example #9
0
/*
 * 下面函数的功能是将原来的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");
}
Example #10
0
File: start.c Project: aaana/os
/*======================================================================*
                            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();

	
}