VX启动代码romInits文件注释.docx

上传人:b****5 文档编号:6439273 上传时间:2023-01-06 格式:DOCX 页数:13 大小:21.07KB
下载 相关 举报
VX启动代码romInits文件注释.docx_第1页
第1页 / 共13页
VX启动代码romInits文件注释.docx_第2页
第2页 / 共13页
VX启动代码romInits文件注释.docx_第3页
第3页 / 共13页
VX启动代码romInits文件注释.docx_第4页
第4页 / 共13页
VX启动代码romInits文件注释.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

VX启动代码romInits文件注释.docx

《VX启动代码romInits文件注释.docx》由会员分享,可在线阅读,更多相关《VX启动代码romInits文件注释.docx(13页珍藏版)》请在冰豆网上搜索。

VX启动代码romInits文件注释.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1