VX启动代码romInits文件注释.docx
《VX启动代码romInits文件注释.docx》由会员分享,可在线阅读,更多相关《VX启动代码romInits文件注释.docx(13页珍藏版)》请在冰豆网上搜索。
![VX启动代码romInits文件注释.docx](https://file1.bdocx.com/fileroot1/2023-1/6/dc2a51a4-51ac-48c8-831c-29bd50112995/dc2a51a4-51ac-48c8-831c-29bd501129951.gif)
VX启动代码romInits文件注释
/*romInit.s-PC-386ROMinitializationmodule*/
/*Copyright1984-2002WindRiverSystems,Inc.*/
/*
modificationhistory
--------------------
01t,12nov02,hdnmadeCR4initializationonlyforP5orlater(spr83992)
01s,19jun02,hdnupdatedthecopyrightyear
01r,22may02,hdnsaved/restoredvalueat0x0and0x100000
01q,03apr02,hdnaddedMP_N_CPUincrementwithbuslocked
01p,26mar02,paiLegacyROM-residentbuildsrequireasymbolnamed'_sdata'
(SPR74537).
01o,19nov01,hdnaddedWINDMLsupport
01n,30aug01,hdnaddedFUNC/FUNC_LABELGTEXT/GDATAmacro.
removedROM_XXXmacro(spr69891).addedromEaxShow.
01m,03may00,msdonotcallromA20onifbootedthoughSFL.
01l,03sep96,hdnaddedthecompressionsupport.
01k,21oct94,hdncleanedup.
01j,23sep94,hdndeleted_sysBootTypeandusesstack.
01i,06apr94,hdnmovedaprocessorcheckingroutinetosysALib.s.
createdthesystemGDTatGDT_BASE_OFFSET.
01h,17feb94,hdndeletedapieceofcodewhichcopyitselftouppermemory.
01g,27oct93,hdnadded_sysBootType.
01f,25aug93,hdnchangedawaytoenableA20.
01e,12aug93,hdnaddedcodestoloadauserdefinedglobaldescriptortable.
01d,09aug93,hdnaddedcodestorecognizeatypeofcpu.
01c,17jun93,hdnupdatedto5.1.
01b,26mar93,hdnaddedsomecodestoswitchtotheprotectedmode
01a,19mar92,hdnwrittenbymodifyingv01cofh32/romInit.s
*/
/*
DESCRIPTION
ThismodulecontainstheentrycodefortheVxWorksbootrom.
TheroutinesysToMonitor
(2)jumpstothelocationXXXbytes
passedthebeginningofromInit,toperforma"warmboot".
Thiscodeisintendedtobegenericaccrossi80x86boards.
Hardwarethatrequiresspecialregistersettingormemory
mappingtobedoneimmediately,maydosohere.
*/
#define_ASMLANGUAGE//定义_ASMLANGUAGE。
GNU汇编器GAS看到这个定义后,会按照C的语法进行预处理,所以GAS预处理器能够认识C头文件中定义的类型和宏。
如果不定义_ASMLANGUAGE,以下的#include语句将无法编译。
#include"vxWorks.h"//系统头文件
#include"sysLib.h"//系统提供给BSP的头文件
#include"asm.h"//汇编头
#include"config.h"//BSP的头文件
.data//定义数据段
.globlFUNC(copyright_wind_river)//申明全局变量_copyright_wind_river并使用它定义一个新变量
.longFUNC(copyright_wind_river)//定义一个32-bit的全局变量,变量的初始值为_copyright_wind_river的地址。
由于在Makefile中规定了romInit.o为第一个链接的模块,所以这个无名变量将出现在数据段的最开始(没有变量名)
/*internals*/
.globlromInit/*startofsystemcode*/
.globl_romInit/*startofsystemcode*/
.globlGTEXT(romWait)/*waitroutine*/
.globlGTEXT(romA20on)/*turnonA20*/
.globlsdata/*startofdata*/
.globl_sdata/*startofdata*/
sdata:
_sdata:
.asciz"startofdata"//定义一个以0结尾的字符串”startofdata”。
这个串出现在数据段的第一个无名变量之后。
.text//程序入口
.balign16//.balign是意思是:
以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。
如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存
/*******************************************************************************
*
*romInit-entrypointforVxWorksinROM
*
*romInit(startType)
*intstartType;/@onlyusedby2ndentrypoint@/
*/
/*coldstartentrypointinREALMODE(16bits)*/
romInit:
//romInit()函数,其功能是对CPU进行初始化
_romInit:
//同时定义_romInit和romInit的原因是,有些编译器产生的对外部符号的调用不加下划线,而有些加。
cli/*LOCKINTERRUPT关中断*/
jmpcold/*offsetmustbelessthan128跳转到cold偏移量必须小于128跳转指令完成了切换为保护模式32位指令代码转换*/
/*warmstartentrypointinPROTECTEDMODE(32bits)在保护模式下热启动入口点(32位)*/
.balign16,0x90
romWarmHigh:
/*ROM_WARM_HIGH(0x10)isoffset*/
cli/*LOCKINTERRUPT关中断*/
movlSP_ARG1(%esp),%ebx/*%ebxhasthestartType把esp+SP_ARG1的值给ebx*/
jmpwarm//段内相对跳转到warm
/*warmstartentrypointinPROTECTEDMODE(32bits)*/
.balign16,0x90
romWarmLow:
/*ROM_WARM_LOW(0x20)isoffset*/
cli/*LOCKINTERRUPT关中断*/
cld/*copyitselftoROM_TEXT_ADRS清除方向标志*/
movl$RAM_LOW_ADRS,%esi/*getsrcaddr(RAM_LOW_ADRS)赋值给esi*/
movl$ROM_TEXT_ADRS,%edi/*getdstaddr(ROM_TEXT_ADRS)赋值给edi*/
movl$ROM_SIZE,%ecx/*getnBytestocopy赋值给ecx*/
shrl$2,%ecx/*getnLongstocopy右移2位*/
rep/*repeatnextinstECXtime*/
movsl/*copynLongsfromsrctodst循环执行esi->edi至dei==0*/
movlSP_ARG1(%esp),%ebx/*%ebxhasthestartType把esp+SP_ARG1的值给ebx*/
jmpwarm/*jumptowarm跳转到warm*/
/*copyrightnoticeappearsatbeginningofROM(inTEXTsegment)*/
.ascii"Copyright1984-2002WindRiverSystems,Inc."
/*coldstartcodeinREALMODE(16bits)*/
.balign16,0x90
cold:
.byte0x67,0x66/*nextinsthas32bitoperand0X66用于反转默认的操作数大小!
0X67用于反转默认的寻址方式*/
lidt%cs:
(romIdtr-romInit)/*loadtemporaryIDT加载(romIdtr-romInit)*/
.byte0x67,0x66/*nextinsthas32bitoperand*/
lgdt%cs:
(romGdtr-romInit)/*loadtemporaryGDT加载(romGdtr-romInit)*/
/*switchtoprotectedmode切换到保护模式*/
mov%cr0,%eax/*moveCR0toEAXCR0中含有控制处理器操作模式和状态的系统控制标志*/
.byte0x66/*nextinsthas32bitoperand*/
or$0x00000001,%eax/*setthePEbit*/
mov%eax,%cr0/*moveEAXtoCR0*/
jmpromInit1/*nearjumptoflushainstqueue跳转到romInit1*/
romInit1:
.byte0x66/*nextinsthas32bitoperand*/
mov$0x0010,%eax/*setdatasegment0x10is3rdone*/
mov%ax,%ds/*setDS*/
mov%ax,%es/*setES*/
mov%ax,%fs/*setFS*/
mov%ax,%gs/*setGS*/
mov%ax,%ss/*setSS*/
.byte0x66/*nextinsthas32bitoperand*/
mov$ROM_STACK,%esp/*setlowermemstackpointer*/
/*现在已进入保护模式。
然而各个段寄存器的值,以及它们的高速缓存寄存器中的值还是老的。
把DS,ES,FS,GS,SS寄存器
*设为0x0010,即指向GDT的第2项(从0开始),DPL=0。
它们都指向一个段。
把堆栈指针esp设为ROM_STACK。
.byte0x67,0x66/*nextinsthas32bitoperand*/
ljmp$0x08,$ROM_TEXT_ADRS+romInit2-romInit//执行一个远程段间跳转修改CS。
CS的新值为0x08,即GDT的第1项,DPL=0。
修改CS时它的高速缓存寄存器也会自动更新。
以下将进入到32-bit代码模式。
/*temporaryIDTRstoredincodesegmentinROM*/
romIdtr:
.word0x0000/*size:
0*/
.long0x00000000/*address:
0*/
/*temporaryGDTRstoredincodesegmentinROM*/
romGdtr:
.word0x0027/*size:
39(8*5-1)bytes*/
.long(romGdt-romInit+ROM_TEXT_ADRS)/*address:
romGdt*/
/*temporaryGDTstoredincodesegmentinROM*/
.balign16,0x90
romGdt:
//段描述表
/*0(selector=0x0000):
Nulldescriptor*/
.word0x0000
.word0x0000
.byte0x00
.byte0x00
.byte0x00
.byte0x00
/*1(selector=0x0008):
Codedescriptor*/
.word0xffff/*limit:
xffff段接线低16位*/
.word0x0000/*base:
xxxx0000基地址低16位*/
.byte0x00/*base:
xx00xxxx基地址中间8位*/
.byte0x9a/*Codee/r,Present,DPL0段属性*/
.byte0xcf/*limit:
fxxxx,PageGra,32bit段属性含段地址高4位*/
.byte0x00/*base:
00xxxxxx基地址搞8位*/
/*2(selector=0x0010):
Datadescriptor*/
.word0xffff/*limit:
xffff*/
.word0x0000/*base:
xxxx0000*/
.byte0x00/*base:
xx00xxxx*/
.byte0x92/*Datar/w,Present,DPL0*/
.byte0xcf/*limit:
fxxxx,PageGra,32bit*/
.byte0x00/*base:
00xxxxxx*/
/*3(selector=0x0018):
Codedescriptor,forthenestinginterrupt*/
.word0xffff/*limit:
xffff*/
.word0x0000/*base:
xxxx0000*/
.byte0x00/*base:
xx00xxxx*/
.byte0x9a/*Codee/r,Present,DPL0*/
.byte0xcf/*limit:
fxxxx,PageGra,32bit*/
.byte0x00/*base:
00xxxxxx*/
/*4(selector=0x0020):
Codedescriptor,forthenestinginterrupt*/
.word0xffff/*limit:
xffff*/
.word0x0000/*base:
xxxx0000*/
.byte0x00/*base:
xx00xxxx*/
.byte0x9a/*Codee/r,Present,DPL0*/
.byte0xcf/*limit:
fxxxx,PageGra,32bit*/
.byte0x00/*base:
00xxxxxx*/
/*coldstartcodeinPROTECTEDMODE(32bits)*/
.balign16,0x90
romInit2:
cli/*LOCKINTERRUPT关中断*/
movl$ROM_STACK,%esp/*setastackpointer设置esp*/
#ifdefined(TGT_CPU)&&defined(SYMMETRIC_IO_MODE)
movl$MP_N_CPU,%eax
lock
incl(%eax)
#endif/*defined(TGT_CPU)&&defined(SYMMETRIC_IO_MODE)*/
/*WindML+VesaBIOSinitialization*/
#ifdefINCLUDE_WINDML
movl$VESA_BIOS_DATA_PREFIX,%ebx/*moveBIOSprefixaddrtoEBX*/
movl$VESA_BIOS_KEY_1,(%ebx)/*store"BIOS"*/
addl$4,%ebx/*incrementEBX*/
movl$VESA_BIOS_KEY_2,(%ebx)/*store"DATA"*/
movl$VESA_BIOS_DATA_SIZE,%ecx/*loadECXwithnBytestocopy*/
shrl$2,%ecx/*getnLongstocopy*/
movl$0,%esi/*loadESIwithsourceaddr*/
movl$VESA_BIOS_DATA_ADDRESS,%edi/*loadEDIwithdestaddr*/
rep
movsl/*copyBIOSdatatoVRAM*/
#endif/*INCLUDE_WINDML*///定义INCLUDE_WINDML,并初始化VesaBIOS
/*
*Don'tcallromA20onifbootedthroughSFL.romA20ondoesISA
*I/OportaccessestoturnA20on.IncaseofSFLboot,ISA
*I/Oaddressspacewillnotbeinitializedbyproperlybythe
*timethiscodegetsexecuted.Also,A20comesONwhenbooted
*throughSFL.
*/
#ifndefINCLUDE_IACSFL
callFUNC(romA20on)/*enableA20*/
cmpl$0,%eax/*isA20enabled?
*/
jneromInitHlt/*no:
jumpromInitHlt*/
#endif/*INCLUDE_IACSFL*/
movl$BOOT_COLD,%ebx/*%ebxhasthestartType*/
/*copybootromimagetodstaddrif(romInit!
=ROM_TEXT_ADRS)*/
warm:
ARCH_REGS_INIT/*initializeDR[0-7]CR0EFLAGS初始化DR标志位寄存器*/
#if(CPU==PENTIUM)||(CPU==PENTIUM2)||(CPU==PENTIUM3)||\
(CPU==PENTIUM4)
/*ARCH_CR4_INIT/@initializeCR4forP5,6,7*/
xorl%eax,%eax/*zeroEAX*/
movl%eax,%cr4/*initializeCR4*/
#endif/*(CPU==PENTIUM)||(CPU==PENTIUM[234])如果是奔腾系列初清零CR4*/
movl$romGdtr,%eax/*loadtheoriginalGDT加载前面段描述表romGdtr*/
subl$FUNC(romInit),%eax
addl$ROM_TEXT_ADRS,%eax
pushl%eax
callFUNC(romLoadGdt)
movl$STACK_ADRS,%esp/*initialisethestackpointer*/
movl$ROM_TEXT_ADRS,%esi/*getsrcaddr(ROM_TEXT_ADRS)*/
movl$romInit,%edi/*getdstaddr(romInit)*/
cmpl%esi,%edi/*issrcanddstsame?
*/
jeromInit4/*yes:
skipcopying比较ROM_TEXT_ADRS和romInit相同则跳转romInit4*/
movl$FUNC(end),%ecx/*get"end"addr*/
subl%edi,%ecx/*getnBytestocopy*/
shrl$2,%ecx/*getnLongstocopy*/
cld/*clearthedirection