|
pxe unload,有点意思.........
看了 bean 的 fsys_pxe.c 的代码,发现如下的一个片段:
- i = 0;
- while (code[i])
- {
- grub_memset (&unload, 0, sizeof(unload));
- pxe_call (code[i], &unload);
- if (unload.Status)
- {
- grub_printf ("PXE unload fails: %d\n", unload.Status);
- goto quit;
- }
- i++;
- }
- if (*((unsigned short *)0x413) == pxe_basemem)
- *((unsigned short *)0x413) = pxe_freemem;
- pxe_entry = 0;
- ROM_int15 = *((unsigned long *)0x54);
- grub_printf ("PXE stack unloaded\n");
复制代码
意思就是说,把 pxe bios 所占用的内存释放掉。释放掉之后呢?.....
因为 pxe bios 很有可能把 int15 接管了,所以,pxe 的 bios 在卸载时会恢复原先的 ROM int15。因此此时确实应该把 GRUB4DOS 所记录的 ROM_int15 进行更新。
但是由此我们也能想到,会不会某个 PXE BIOS 连 int13 也更改了呢?如果它曾经接管了 int13,那么,在卸载它自己的时候,它应该也会恢复原先的 ROM int13。因此此时我们也应该把 GRUB4DOS 所记录的 ROM_int13 和 ROM_int13_dup 进行更新:
- extern unsigned long ROM_int13;
- extern unsigned long ROM_int13_dup;
- i = 0;
- while (code[i])
- {
- grub_memset (&unload, 0, sizeof(unload));
- pxe_call (code[i], &unload);
- if (unload.Status)
- {
- grub_printf ("PXE unload fails: %d\n", unload.Status);
- goto quit;
- }
- i++;
- }
- if (*((unsigned short *)0x413) == pxe_basemem)
- *((unsigned short *)0x413) = pxe_freemem;
- pxe_entry = 0;
- ROM_int15 = *((unsigned long *)0x54);
- ROM_int13_dup = ROM_int13 = *((unsigned long *)0x4C);
- grub_printf ("PXE stack unloaded\n");
复制代码
同时需要把 asm.S 中的
ROM_int13:
改成
VARIABLE(ROM_int13)
而把
ROM_int13_dup:
改成
VARIABLE(ROM_int13_dup)
[ 本帖最后由 不点 于 2009-12-25 14:09 编辑 ] |
|