検索まずは、検索! Index人気の20件
最新の20件2018-12-02
|
ブート・プロセス目次ブート・プロセスGDT・IDTの設定GDTは、32bitモードになったときに必ず必要なので、プロテクトモード移行前に設定しておきます。 あらかじめデータセクションに、(仮)GDTのデータ・(仮)GDTRのデータ・(仮)IDTRのデータを用意しておきます。 ORIGIN = 0x30000 #GDT/IDT GDT_BASE = 0x10000 GDT_LIMIT = 0xffff IDT_BASE = 0xf800 IDT_LIMIT = 0x07ff /*■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ データ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/ .section .data /******************************************************************************* GDTR・GDT *******************************************************************************/ /*------------------------------------------------------------------------------ GDTR_TEMP ------------------------------------------------------------------------------*/ .align 16 _GDTR_TEMP: _GDTR_TEMP_Limit: .word _GDT_END - _GDT - 1 _GDTR_TEMP_Base: .long _GDT + ORIGIN /*------------------------------------------------------------------------------ GDTR ------------------------------------------------------------------------------*/ .align 16 _GDTR: _GDTR_Limit: .word GDT_LIMIT _GDTR_Base: .long GDT_BASE /*------------------------------------------------------------------------------ GDT ------------------------------------------------------------------------------*/ .align 16 _GDT: _GDT_NULL: #0x0000 .word 0x0000 .word 0x0000 .byte 0x00 .byte 0x00 .byte 0x00 .byte 0x00 _GDT_KernelCS: #0x0008 Base:0x00000000, Limit:0xfffff(単位:Page), SegmentType:Code(Exe/Read) .word 0xffff .word 0x0000 .byte 0x00 .byte 0x9a .byte 0xcf .byte 0x00 _GDT_KernelDS: #0x0010 Base:0x00000000, Limit:0xfffff(単位:Page), SegmentType:Data(Read/Write) .word 0xffff .word 0x0000 .byte 0x00 .byte 0x92 .byte 0xcf .byte 0x00 _GDT_BootLoaderCS: #0x0018 Base:0x00030000, Limit:0xfffff(単位:Page), SegmentType:Code(Exe/Read) .word 0xffff .word 0x0000 .byte 0x03 .byte 0x9a .byte 0xcf .byte 0x00 _GDT_END: /******************************************************************************* IDTR *******************************************************************************/ /*------------------------------------------------------------------------------ IDTR ------------------------------------------------------------------------------*/ .align 16 _IDTR: _IDTR_Limit: .word IDT_LIMIT _IDTR_Base: .long IDT_BASE GDTRとIDTRを設定します。 /*------------------------------------------------------------------------------ GDTRとIDTRの仮設定 ------------------------------------------------------------------------------*/ lgdt _GDTR_TEMP lidt _IDTR A20ゲートの開放A20を参照。 プロテクトモードへの移行プロテクトモードへの移行は、CR0?のPEフラグを1にするだけなのでとても簡単です。 CR0_PE = 0x00000001 #プロテクト・イネーブル・フラグ /*------------------------------------------------------------------------------ プロテクトモード移行 ------------------------------------------------------------------------------*/ movl %cr0, %eax orl $CR0_PE, %eax #プロテクト・イネーブル・フラグ movl %eax, %cr0 jmp _PipelineFlush #パイプラインを流れているデータを消す。 _PipelineFlush: 32ビットへの移行コード・セグメントに、Dbit?が1のセグメント・ディスクリプタを指すセグメント・セレクタをセットすることで、32ビットモードで動作します。 #ここから32bitです。 .code32 .byte 0x66 ljmp $0x0018, $_SetCodeSegment #far jmpでCSをセットする。(CSにDbit=1のディスクリプタを指すセレクタを読み込むことによって、32bitになる。) _SetCodeSegment: |