|
在 google 中输入 realmode_run,碰巧找到了一个例子 vfont.c ,你可以仿照它来编程:
http://code.google.com/p/grubuti ... e/trunk/src/vfont.c
该函数的详细介绍在时空论坛的“MBR 嵌入微型grub,有问题一起讨论”中。时空论坛现在正被攻击,无法访问。
-----------------找到了,干脆复制过来,以免时空论坛再次被攻击时无法访问--------------
初步这么设计:函数调用方法是 int realmode_run ( struct realmode_regs * regs_ptr )
函数名称是 realmode_run,有一个参数 regs_ptr。函数成功执行后,返回 1。失败时,返回 0。
regs_ptr ------ 32位线性地址空间指针,指向用户提供的寄存器数据包,该数据包可以存放在用户的32位保护模式的空间中(不必放在实模式可访问的常规内存空间中),具有如下结构:
struct realmode_regs {
unsigned long edi; // as input and output
unsigned long esi; // as input and output
unsigned long ebp; // as input and output
unsigned long esp; // stack pointer, as input
unsigned long ebx; // as input and output
unsigned long edx; // as input and output
unsigned long ecx; // as input and output
unsigned long eax;// as input and output
unsigned long gs; // as input and output
unsigned long fs; // as input and output
unsigned long es; // as input and output
unsigned long ds; // as input and output
unsigned long ss; // stack segment, as input
unsigned long eip; // instruction pointer, as input,
unsigned long cs; // code segment, as input
unsigned long eflags; // as input and output
}
用这个接口,用户可以方便地定制自己所希望运行的实模式代码。调用前,用户必须把实模式代码拷贝到目的地。目的地应该位于实模式可访问的空间以内(即,通常是在常规内存中)。CS:EIP 应该指向这个位于实模式内存空间中的代码。EIP 的高字应该是0。用户提供的实模式代码,将会被 grub4dos 的实模式代码用一条 far jmp 指令跳转到。用户代码执行完之后,用户必须用一条 far jmp 返回到 grub4dos 中。返回的地址是 0000:8200。建议用户把实模式的代码放在 0000:7C00 至 0000:7FFF 之间的 1024 字节空间中,也可以放在 0000:0580 至 0000:05FF 的 128 字节空间中。用户应该保证不破坏 grub4dos 的代码、堆栈。grub4dos 的实模式代码位于 0000:8200 至 0000:FFFF,堆栈位于 0000:7000(向下扩展,大约至 0000:2000)都不应该被破坏。以上提到的空间,都在第一个 64K 以内。64K 以外的实模式空间(至常规内存的结尾处,位于0000:0413 的一个字表示了常规内存的 KB 数),可以被用户程序任意使用,但使用前应该备份,使用后应该恢复。64K 以内的 0000:7000 至 0000:7BFF 这段空间也是同样的处理,如果要使用,首先应该备份,使用后再恢复。
如果用户不提供自己的代码,而只是希望运行一条简单的 int 软中断指令,则用户应该设置 CS=0xFFFFFFFF, EIP=0xFFFFXXCD。其中 XX 表示中断号。
如果不需要设置 SS 和 SP,请将 SS 和 ESP 都设置为 0xFFFFFFFF。
如果不需要设置 EFLAGS,请将其设置为 0xFFFFFFFF。
如果不需要设置 DS,请将其设置为 0xFFFFFFFF。
如果不需要设置 ES,请将其设置为 0xFFFFFFFF。
如果不需要设置 FS,请将其设置为 0xFFFFFFFF。
如果不需要设置 GS,请将其设置为 0xFFFFFFFF。
成功返回时,所有标明为 as output 的域都更新,即使它们在输入时标明为“不需要设置”,也要在输出时被更新。
如上所说,如果实模式程序的执行破坏了某些实模式的内存,那么,成功返回之后应该及时恢复原来的内存。
[ 本帖最后由 不点 于 2011-7-9 11:50 编辑 ] |
|