shrl $2,%ecx /* ecx 右移两位 256 字节变成 64 个双字
rep
movsl 循环执行 esi->edi 真到 ecx==0
movl SP_ARG1(%esp),%ebx 把 esp+ SP_ARG1 偏移处的值赋予 ebx 寄存器
jmp warm /* jump to warm */
.ascii "Copyright 1984-2002 Wind River Systems, Inc."
.balign 16,0x90
cold: //cold 处
.byte 0x67, 0x66 与 blign16 功能相同
lidt %cs:(romIdtr - romInit) 将中断和量表加载到 cs:(romIdtr - romInit)处
.byte 0x67, 0x66 与 blign16 功能相同
lgdt %cs:(romGdtr - romInit) 将断描述表加载到 cs:( romGdtr - romInit)处
mov %cr0,%eax /* move CR0 to EAX */
.byte 0x66 /* next inst has 32bit operand */
or $0x00000001,%eax /* set the PE bit */
mov %eax,%cr0 /* move EAX to CR0 */
//以上代码的作用是将控制寄存器 cr0 的 PE 位 置 1
jmp romInit1 /*跳转到 rominit1 处。
Rominit1:进入 rominit1 处
.byte 0x66 /* next inst has 32bit operand */
mov $0x0010,%eax /* set data segment 0x10 is 3rd one */
mov %ax,%ds /* set DS */
mov %ax,%es /* set ES */
mov %ax,%fs /* set FS */
mov %ax,%gs /* set GS */
mov %ax,%ss /* set SS */
.byte 0x66 /* next inst has 32bit operand */
mov $ ROM_STACK,%esp /* set lower mem stack pointer */
.byte 0x67, 0x66 /* next inst has 32bit operand */
ljmp $0x08, $ ROM_TEXT_ADRS + romInit2 - romInit
现在已进入保护模式。然而各个段寄存器的值,以及它们的高速缓存寄存器中
的值还是实模式下的。把 DS, ES, FS, GS, SS 寄存器设为 0x0010,即指向 GDT
的第 2 项(从 0 开始),DPL=0。它们都指向一个段。把堆栈指针 esp 设为
ROM_STACK,由于 CS 还是以前的值,意味着目前代码段的属性还是 16-bit 代
码。所以使用指令前缀以执行 32-bit 代码。执行一个远程段间跳转修改 CS。CS
的新值为 0x08,即 GDT 的第 1 项,DPL=0。修改 CS 时它的高速缓存寄存器也
会自动更新。
评论0
最新资源