µ±Ç°Î»ÖãºÊ×Ò³ > Windows NTÒýµ¼¹ý³ÌÔ´´úÂë·ÖÎö
¡ ¡
public _RealMode
_RealMode proc near
; ת»»µ½ÊµÄ£Ê½
sgdt fword ptr [_GDTregister]
sidt fword ptr [_IDTregister]
push [saveDS] ; ½«saveDSÈëÕ»,·½±ãÖ®ºóµÄÌø×ª
mov ax,SuDataSelector
mov es,ax
mov fs,ax
mov gs,ax
mov eax,cr0
and eax, not (ENABLE_PAGING + PROT_MODE)
mov cr0,eax
; Ë¢ÐÂÁ÷Ë®Ïß
jmp far ptr here
here:
; Flush TLB
; We don't know where the page directory is, since it wasallocated in the osloader.
; So we don't want to clear out cr3,but we DO want to flush the TLB....
mov eax,cr3
nop ; Fill - Ensure 13 non-page split
nop ; accesses before CR3 load
nop
nop
mov cr3,eax
; ת»»ÎªÊµÄ£Ê½µØÖ·
; ´Ë´¦ÐèÒªÒ»¸öÔ¶Ìø×ª¶ø²»ÊÇÖ¸Áîretf,ÒòΪretf²»ÄÜÕýÈ·µØÖØÖ÷ÃÎÊȨÏÞΪCS
db 0EAh ; JMP FAR PTR
dw offset _TEXT:rmode ; 2000:rmode
dw 02000h
rmode:
pop ax
mov ds,ax
mov ss,ax
; Stamp video pointers for real-mode use
mov si,offset _ScreenStart
mov word ptr [si+2],0b800h
mov si,offset _vp
mov word ptr [si+2],0b800h
lidt fword ptr [_IDTregisterZero]
sti
ret
_RealMode endp
Ntldr µÄʵģʽ´úÂëÊ×ÏÈ»ñµÃ¿ØÖÆ£¬ËüµÄÈÎÎñÊÇ£¬Íê³ÉÐèÔÚ16 λģʽÏÂÖ´Ðеijõʼ»¯¹¤×÷£¬ÀýÈçÇå³ý¼üÅÌ»º³åÇø£¬È»ºóΪÇл»µ½±£»¤Ä£Ê½×öºÃ»ù±¾µÄ»·¾³×¼±¸£¬Ö®ºó½«´¦ÀíÆ÷Çл»µ½±£»¤Ä£Ê½£¨32 λģʽ£©Ï£¬ÕâÑùËü¾Í¿ÉÒÔ·ÃÎÊÕû¸ö32 λµØÖ·¿Õ¼äÁË¡£×îºóËü½«¿ØÖÆÈ¨½»¸øos loader¡£
; _TransferToLoader ;¸Ã×Ó³ÌÐò½«¿ØÖÆÈ¨½»¸øosloader
public _TransferToLoader
_TransferToLoader proc near
mov ebx,dword ptr [esp+2] ; »ñÈ¡Èë¿Úµã²ÎÊý
xor eax,eax
mov ax,[saveDS]
; ÉèÖÃosloaderµÄ¶ÑÕ»
mov cx,KeDataSelector
mov ss,cx
mov esp,LOADER_STACK
; ¼ÓÔØdsºÍes×÷ΪÄÚºËÊý¾ÝÑ¡Ôñ×Ó
mov ds,cx
mov es,cx
; ÉèÖÃÖ¸ÏòÎļþϵͳºÍÒýµ¼ÉÏÏÂÎļǼµÄÖ¸Õë
shl eax,4
xor ecx,ecx
mov cx,offset _BootRecord
add eax,ecx
push eax
push 1010h ; ѹÈë¼ÙµÄ·µ»ØµØÖ·
; ½«Ò»¸ö48λµÄµØÖ·´«¸øloaderµÄÈë¿Úµã
db OVERRIDE
push KeCodeSelector
push ebx
; ½«¿ØÖÆÈ¨½»»¹OS loader
db OVERRIDE
retf
_TransferToLoader endp
Os loader ¸Õ½Ó»ñ¿ØÖÆÊ±£¬´¦ÀíÆ÷ËäÈ»ÒѾ¹¤×÷ÔÚ±£»¤Ä£Ê½Ï£¬µ«ÊÇËüµÄÐéÄâµØÖ·×ªÒë»úÖÆÉÐ먦Æô£¬ËùÒÔ£¬´¦ÀíÆ÷ÈÔȻֱ½ÓʹÓÃÎïÀíµØÖ·¡£Os loader Ê×ÏÈ×öµÄ¹¤×÷ÊǰÑÎïÀíÄÚ´æ¹ÜÆðÀ´£¬ÓÃÒ»¸öÄÚ´æÃèÊö·û£¨memory descriptor£©Êý×é°Ñÿһ¶ÎÄÚ´æµÄ´óСºÍÓÃ;¼Ç¼ÏÂÀ´£¬È»ºó¹¹ÔìҳĿ¼ºÍÒ³±í£¬Ê¹µÃ16 MB ÒÔϵÄÄÚ´æÄܹ»Í¨¹ýÒ³ÃæÓ³É䣨paging£©»úÖÆ½øÐзÃÎÊ£¬ÔÙÉèÖúÃҳĿ¼¼Ä´æÆ÷£¬²¢´ò¿ªÒ³ÃæÓ³Éä»úÖÆ¡£Ö®ºó£¬os loader ¼ÌÐøÖ´ÐÐÆäËûµÄ³õʼ»¯¹¤×÷£¬°üÀ¨I/O É豸µÄ³õʼ»¯µÈ¡£Èç¹ûËü»¹ÐèÒªµ÷ÓÃBIOS ÖеķþÎñ£¨±ÈÈçÖжÏ13h¡¢ÖжÏ15h µÈ£©£¬Ôò±ØÐë±£»¤ºÃ±£»¤Ä£Ê½ÏµÄÉèÖ㬲¢ÔÝʱÇл»»Øµ½ÊµÄ£Ê½£¬´ý·þÎñÍê³ÉÒÔºóÔÙÇл»µ½±£»¤Ä£Ê½£¬²¢»Ö¸´ÉèÖá£
Windows µÄÒýµ¼Ñ¡Ïî¿ÉÒÔÓÃÀ´Ö¸Ê¾µ±Ç°Õâ´ÎÒýµ¼µÄ¸÷ÖÖ²ÎÊý£¬°üÀ¨ÄÚºËÄ£¿éµÄÎļþÃû³Æ¡¢HAL µÄÎļþÃû³Æ¡¢CPU ²ÎÊý¡¢¸÷ÖÖÄÚ´æ²ÎÊý¡¢µ÷ÊÔ²ÎÊý£¬µÈµÈ¡£¹ØÓÚÕâЩÒýµ¼Ñ¡ÏîµÄÈ«ÃæÁбíºÍ½éÉÜ£¬¿É²Î¿¼[MSDN-BOOT]¡£½ÓÏÂÀ´os loader ¼ÓÔØ²¢Ö´ÐÐNTDETECT.COM ³ÌÐò£¬ÕâÊÇÒ»¸ö16 λʵģʽ³ÌÐò£¬ËüÀûÓÃϵͳµÄBIOS À´²éѯϵͳµÄ»ù±¾É豸ºÍÅäÖÃÐÅÏ¢£¬°üÀ¨ÏµÍ³µÄÈÕÆÚºÍʱ¼ä¡¢×ÜÏßµÄÀàÐÍ¡¢´ÅÅ̵ÄÐÅÏ¢¡¢ÊäÈë/Êä³öµÄ½Ó¿ÚÐÅÏ¢µÈ¡£ÕâЩÐÅÏ¢±»ÊÕ¼¯ÆðÀ´£¬ÔÚÒýµ¼¹ý³ÌµÄºóÆÚ±»´æ·Åµ½×¢²á±íHKLM\\HARDWARE\\DESCRIPTION ¼üµÄÏÂÃæ¡£
´úÂëÕª×Ô\\ntos\\boot\\startup\\i386\\main.c VOID SuMain(
INFPVOIDBtRootDir, INFPDISKBPBBtBiosBlock, INSHORTBtBootDrive ) /*++
Routine Description:
Main entrypoint of the SU module. Control is passed from the boot sector to startup.asm which does some run-time fixups on the stack and data segments and then passes control here. Arguments:
BtRootDir - Address of root directory left in memory by boot sector BtBiosBlock - Address of bios parameter block. BtBootDrive - Drive that we booted from. Returns:
Does not return. Passes control to the OS loader --*/ {
ULONGLoaderEntryPoint; ULONGEisaNumPages; USHORTIsaNumPages;
MEMORY_LIST_ENTRY_far *CurrentEntry; PIMAGE_OPTIONAL_HEADEROptionalHeader; ULONGBlockEnd; ULONGImageSize; ULONGImageBase;
// ±£´æÎļþϵͳÉÏÏÂÎÄÐÅÏ¢
FsContext.BootDrive = (ULONG)BtBootDrive;
FsContext.PointerToBPB = MAKE_FLAT_ADDRESS(BtBiosBlock);
PatchDiskBaseTable();
// »ùÓÚ×ÜÏßÀàÐÍÉèÖûúÆ÷ÀàÐÍ. if (BtIsEisaSystem()) {
MachineType = MACHINE_TYPE_EISA; } else {
if (BtIsMcaSystem()) {
MachineType = MACHINE_TYPE_MCA; } else {
MachineType = MACHINE_TYPE_ISA; }
}
// Èç¹ûϵͳÓÉÈíÅÌÒýµ¼,ÄÇô¹ØµôÈíÅÌÇý¶¯Æ÷ TurnMotorOff();
// ³õʼ»¯ÊÓÆµ×ÓϵͳÒÔʹµÃ´íÎóºÍÒì³£ÐÅÏ¢¿ÉÒÔ±»ÏÔʾ InitializeVideoSubSystem();
¹²·ÖÏí92ƪÏà¹ØÎĵµ