先来看看是如何切换的:
108 mov esp, StackTop ; 堆栈在 bss 段中 109 110 mov dword [disp_pos], 0 111 112 sgdt [gdt_ptr] ; cstart() 中将会用到 gdt_ptr 113 call cstart ; 在此函数中改变了gdt_ptr,让它指向新的GDT 114 lgdt [gdt_ptr] ; 使用新的GDT 115 116 lidt [idt_ptr] 117 118 jmp SELECTOR_KERNEL_CS:csinit 119 csinit: ; “这个跳转指令强制使用刚刚初始化的结构”——<<OS:D&I 2nd>> P90. 120 121 ;jmp 0x40:0 122 ;ud2 123 124 sti 125 126 hlt
22 PUBLIC void cstart() 23 { 24 disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----\"cstart\" begins-----\n"); 25 26 // 将 LOADER 中的 GDT 复制到新的 GDT 中 27 memcpy( &gdt, // New GDT 28 (void*)(*((t_32*)(&gdt_ptr[2]))), // Base of Old GDT 29 *((t_16*)(&gdt_ptr[0])) + 1 // Limit of Old GDT 30 ); 31 // gdt_ptr[6] 共 6 个字节:0~15:Limit 16~47:Base。用作 sgdt 以及 lgdt 的参数。 32 t_16* p_gdt_limit = (t_16*)(&gdt_ptr[0]); 33 t_32* p_gdt_base = (t_32*)(&gdt_ptr[2]); 34 *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1; 35 *p_gdt_base = (t_32)&gdt; 36 }
makefile的语法我们不打算在本文讲解,你可以参考这里:makefile快速入门
《自己动手写操作系统》第五章:扩充内核,布布扣,bubuko.com
原文:http://blog.csdn.net/trochiluses/article/details/21400231