📄 s10_05.htm
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><HTML><HEAD><TITLE>80386 Programmer's Reference Manual -- Section 10.5</TITLE></HEAD><BODY><B>up:</B> <A HREF="c10.htm">Chapter 10 -- Initialization</A><BR><B>prev:</B> <A HREF="s10_04.htm">10.4 Software Initialization for Protected Mode</A><BR><B>next:</B> <A HREF="s10_06.htm">10.6 TLB Testing</A><P><HR><P><H1>10.5 Initialization Example</H1><PRE>$TITLE ('Initial Task')NAME INITinit_stack SEGMENT RWDW 20 DUP(?)tos LABEL WORDinit_stack ENDSinit_data SEGMENT RW PUBLICDW 20 DUP(?)init_data ENDSinit_code SEGMENT ER PUBLICASSUME DS:init_datanopnopnopinit_start:; set up stackmov ax, init_stackmov ss, axmov esp, offset tosmov a1,1blink:xor a1,1out 0e4h,a1mov cx,3FFFhhere:dec cxjnz herejmp SHORT blinkhltinit_code endsEND init_start, SS:init_stack, DS:init_data$TITLE('Protected Mode Transition -- 386 initialization')NAME RESET;*****************************************************************; Upon reset the 386 starts executing at address 0FFFFFFF0H. The; upper 12 address bits remain high until a FAR call or jump is; executed.;; Assume the following:;;; - a short jump at address 0FFFFFFF0H (placed there by the; system builder) causes execution to begin at START in segment; RESET_CODE.;;; - segment RESET_CODE is based at physical address 0FFFF0000H,; i.e. at the start of the last 64K in the 4G address space.; Note that this is the base of the CS register at reset. If; you locate ROMcode above this address, you will need to; figure out an adjustment factor to address things within this; segment.;;*****************************************************************$EJECT ;; Define addresses to locate GDT and IDT in RAM.; These addresses are also used in the BLD386 file that defines; the GDT and IDT. If you change these addresses, make sure you; change the base addresses specified in the build file.GDTbase EQU 00001000H ; physical address for GDT baseIDTbase EQU 00000400H ; physical address for IDT basePUBLIC GDT_EPROMPUBLIC IDT_EPROMPUBLIC STARTDUMMY segment rw ; ONLY for ASM386 main module stack initDW 0DUMMY ends;*****************************************************************;; Note: RESET CODE must be USEl6 because the 386 initally executes; in real mode.;RESET_CODE segment er PUBLIC USE16ASSUME DS:nothing, ES:nothing;; 386 Descriptor templateDESC STRUClim_0_15 DW 0 ; limit bits (0..15)bas_0_15 DW 0 ; base bits (0..15)bas_16_23 DB 0 ; base bits (16..23)access DB 0 ; access bytegran DB 0 ; granularity bytebas_24_31 DB 0 ; base bits (24..31)DESC ENDS; The following is the layout of the real GDT created by BLD386.; It is located in EPROM and will be copied to RAM.;; GDT[O] ... NULL; GDT[1] ... Alias for RAM GDT; GDT[2] ... Alias for RAM IDT; GDT[2] ... initial task TSS; GDT[3] ... initial task TSS alias; GDT[4] ... initial task LDT; GDT[5] ... initial task LDT alias;; define entries in GDT and IDT.GDT_ENTRIES EQU 8IDT_ENTRIES EQU 32; define some constants to index into the real GDTGDT_ALIAS EQU 1*SIZE DESCIDT_ALIAS EQU 2*SIZE DESCINIT_TSS EQU 3*SIZE DESCINIT_TSS_A EQU 4*SIZE DESCINIT_LDT EQU 5*SIZE DESCINIT_LDT_A EQU 6*SIZE DESC;; location of alias in INIT_LDTINIT_LDT_ALIAS EQU 1*SIZE DESC;; access rights byte for DATA and TSS descriptorsDS_ACCESS EQU 010010010BTSS_ACCESS EQU 010001001B;; This temporary GDT will be used to set up the real GDT in RAM.Temp_GDT LABEL BYTE ; tag for begin of scratch GDTNULL_DES DESC <> ; NULL descriptor; 32-Gigabyte data segment based at 0FLAT_DES DESC <0FFFFH,0,0,92h,0CFh,0>GDT_eprom DP ? ; Builder places GDT address and limit; in this 6 byte area.IDT_eprom DP ? ; Builder places IDT address and limit; in this 6 byte area.;; Prepare operand for loadings GDTR and LDTR.TGDT_pword LABEL PWORD ; for temp GDTDW end_Temp_GDT_Temp_GDT -1DD 0GDT_pword LABEL PWORD ; for GDT in RAMDW GDT_ENTRIES * SIZE DESC -1DD GDTbaseIDT_pword LABEL PWORD ; for IDT in RAMDW IDT_ENTRIES * SIZE DESC -1DD IDTbaseend_Temp_GDT LABEL BYTE;; Define equates for addressing convenience.GDT_DES_FLAT EQU DS:GDT_ALIAS +GDTbaseIDT_DES_FLAT EQU DS:IDT_ALIAS +GDTbaseINIT_TSS_A_OFFSET EQU DS:INIT_TSS_AINIT_TSS_OFFSET EQU DS:INIT_TSSINIT_LDT_A_OFFSET EQU DS:INIT_LDT_AINIT_LDT_OFFSET EQU DS:INIT_LDT; define pointer for first task switchENTRY POINTER LABEL DWORDDW 0, INIT_TSS;******************************************************************;; Jump from reset vector to here.START:CLI ;disable interruptsCLD ;clear direction flagLIDT NULL_des ;force shutdown on errors;; move scratch GDT to RAM at physical 0XOR DI,DIMOV ES,DI ;point ES:DI to physical location 0MOV SI,OFFSET Temp_GDTMOV CX,end_Temp_GDT-Temp_GDT ;set byte countINC CX;; move tableREP MOVS BYTE PTR ES:[DI],BYTE PTR CS:[SI]LGDT tGDT_pword ;load GDTR for Temp. GDT;(located at 0); switch to protected modeMOV EAX,CR0 ;get current CROMOV EAX,1 ;set PE bitMOV CRO,EAX ;begin protected mode;; clear prefetch queueJMP SHORT flushflush:; set DS,ES,SS to address flat linear space (0 ... 4GB)MOV BX,FLAT_DES-Temp_GDTMOV US,BXMOV ES,BXMOV SS,BX;; initialize stack pointer to some (arbitrary) RAM locationMOV ESP, OFFSET end_Temp_GDT;; copy eprom GDT to RAMMOV ESI,DWORD PTR GDT_eprom +2 ; get base of eprom GDT; (put here by builder).MOV EDI,GDTbase ; point ES:EDI to GDT base in RAM.MOV CX,WORD PTR gdt_eprom +0 ; limit of eprom GDTINC CXSHR CX,1 ; easier to move wordsCLDREP MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI];; copy eprom IDT to RAM;MOV ESI,DWORD PTR IDT_eprom +2 ; get base of eprom IDT; (put here by builder)MOV EDI,IDTbase ; point ES:EDI to IDT base in RAM.MOV CX,WORD PTR idt_eprom +0 ; limit of eprom IDTINC CXSHR CX,1CLDREP MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]; switch to RAM GDT and IDT;LIDT IDT_pwordLGDT GDT_pword;MOV BX,GDT_ALIAS ; point DS to GDT aliasMOV DS,BX;; copy eprom TSS to RAM;MOV BX,INIT_TSS_A ; INIT TSS A descriptor base; has RAM location of INIT TSS.MOV ES,BX ; ES points to TSS in RAMMOV BX,INIT_TSS ; get inital task selectorLAR DX,BX ; save access byteMOV [BX].access,DS_ACCESS ; set access as data segmentMOV FS,BX ; FS points to eprom TSSXOR si,si ; FS:si points to eprom TSSXOR di,di ; ES:di points to RAM TSSMOV CX,[BX].lim_0_15 ; get count to moveINC CX;; move INIT_TSS to RAM.REP MOVS BYTE PTR ES:[di],BYTE PTR FS:[si]MOV [BX].access,DH ; restore access byte;; change base of INIT TSS descriptor to point to RAM.MOV AX,INIT_TSS_A_OFFSET.bas_0_15MOV INIT_TSS_OFFSET.bas_0_15,AXMOV AL,INIT_TSS_A_OFFSET.bas_16_23MOV INIT_TSS_OFFSET.bas_16_23,ALMOV AL,INIT_TSS_A_OFFSET.bas_24_31MOV INIT_TSS_OFFSET.bas_24_31,AL;; change INIT TSS A to form a save area for TSS on first task; switch. Use RAM at location 0.MOV BX,INIT_TSS_AMOV WORD PTR [BX].bas_0_15,0MOV [BX].bas_16_23,0MOV [BX].bas_24_31,0MOV [BX].access,TSS_ACCESSMOV [BX].gran,OLTR BX ; defines save area for TSS;; copy eprom LDT to RAMMOV BX,INIT_LDT_A ; INIT_LDT_A descriptor has; base address in RAM for INIT_LDT.MOV ES,BX ; ES points LDT location in RAM.MOV AH,[BX].bas_24_31MOV AL,[BX].bas_16_23SHL EAX,16MOV AX,[BX].bas_0_15 ; save INIT_LDT base (ram) in EAXMOV BX,INIT_LDT ; get inital LDT selectorLAR DX,BX ; save access rightsMOV [BX].access,DS_ACCESS ; set access as data segmentMOV FS,BX ; FS points to eprom LDTXOR si,si ; FS:SI points to eprom LDTXOR di,di ; ES:DI points to RAM LDTMOV CX,[BX].lim_0_15 ; get count to moveINC CX;; move initial LDT to RAMREP MOVS BYTE PTR ES:[di],BYTE PTR FS:[si]MOV [BX].access,DH ; restore access rights in; INIT_LDT descriptor;; change base of alias (of INIT_LDT) to point to location in RAM.MOV ES:[INIT_LDT_ALIAS].bas_0_15,AXSHR EAX,16MOV ES:[INIT_LDT_ALIAS].bas_16_23,ALMOV ES:[INIT_LDT_ALIAS].bas_24_31,AH;; now set the base value in INIT_LDT descriptorMOV AX,INIT_LDT_A_OFFSET.bas_0_15MOV INIT_LDT_OFFSET.bas_0_15,AXMOV AL,INIT_LDT_A_OFFSET.bas_16_23MOV INIT_LDT_OFFSET.bas_16_23,ALMOV AL,INIT_LDT_A_OFFSET.bas_24_31MOV INIT_LDT_OFFSET.bas_24_31,AL;; Now GDT, IDT, initial TSS and initial LDT are all set up.;; Start the first task!'JMP ENTRY_POINTERRESET_CODE endsEND START, SS:DUMMY,DS:DUMMY</PRE><P><HR><P><B>up:</B> <A HREF="c10.htm">Chapter 10 -- Initialization</A><BR><B>prev:</B> <A HREF="s10_04.htm">10.4 Software Initialization for Protected Mode</A><BR><B>next:</B> <A HREF="s10_06.htm">10.6 TLB Testing</A></BODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -