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
}
成功返回时,所有标明为 as output 的域都更新,即使它们在输入时标明为“不需要设置”,也要在输出时被更新。
如上所说,如果实模式程序的执行破坏了某些实模式的内存,那么,成功返回之后应该及时恢复原来的内存。
[ 本帖最后由 不点 于 2011-7-9 11:50 编辑 ]作者: 快雪时晴 时间: 2011-7-9 11:00
终于见到wee命令使用文档了,还有编程接口,对于某些人来说,很强大作者: 135956 时间: 2011-7-9 14:44
早上我在时空论坛里找到相关说明了,不过,还没看完,就访问不了了,现在又能打开了。似乎还是无忧这里稳定哦。作者: dihuo0 时间: 2011-7-9 22:04
如果没有什问题。明天我会发到wiki百科上。作者: dihuo0 时间: 2011-7-10 16:39 标题: wee资料汇总 == 历史与发展 ==
=== 缘起 === http://bbs.znpc.net/viewthread.php?tid=2461
GRLDR.MBR作为通用的引导程序的一些想法
不少的启动管理器或系统的启动部分,主要的功能是在一个启动文件里实现,而MBR或启动扇区的功能是把该文件读入内存并运行。这和GRLDR.MBR引导GRLDR的方式非常相似。不同启动文件使用时的差别在于:
1、启动文件名字不同
2、启动文件在内存里存放的地址不同
3、启动文件运行的入口参数的差异
我们可以用一个中间层的启动程序来处理这些差别,从而使GRLDR.MBR成为通用的引导程序。其启动的流程如下:
1、装载GRLDR.MBR
2、从GRLDR.MBR引导中间启动层启动程序
3、中间层启动程序选择最终的启动文件。其选择可以通过一个简单的选择菜单,或使用嵌入中间层启动程序中的值。
4、中间层启动程序把自己移动到较低的内存处,并且,把最终的启动文件的名字填入启动扇区适当的位置中。
5、中间层启动程序跳回7C00:0000,该地址是原来启动扇区的内容。
6、启动扇区第二次运行,它从分区中里装载新的启动文件(文件名字在中间层启动程序里填入的)。
7、装载成功后,启动扇区返回较低的内存处的中间层启动程序。
8、中间层启动程序把最终启动文件的内容复制到恰当的位置,然后设置入口参数,并且运行最终启动文件中的代码。
现在的GRLDR.MBR已经可以直接使用,只需要写一个处理不同启动文件的中间层的启动程序就行了。
如果要更好地配合这一方案,GRLDR.MBR的代码可以作以下修改:
1、存取分区的代码分为初始化,搜索文件和装载文件三部分。在第二次运行时可以跳过初始化的代码。
2、中间层启动程序可以调用启动扇区里的搜索文件函数。这样中间层启动程序可以对于每种支持的启动文件都测试一下,并且显示可以启动系统的列表。
使用该方案的好处是能够在不同的分区动态搜索启动文件。而且,GRLDR.MBR也能在Windows NT系列系统的启动管理器中引导。
该方案适用于GRLDR, GRUB2,NTLDR,io.sys, syslinux.bin, kernel.sys(FreeDOS)等启动文件。 http://bbs.znpc.net/viewthread.php?tid=4146
GRUB4DOS中启动代码分离的构思
这个想法我以前也曾经提过,现在把它总结一下:
1、启动代码和GRUB4DOS分离
启动代码的主要功能是把pre_stage2的代码装载到内存的某一位置,然后进行调用。除此之外,启动代码和GRUB4DOS的交互是很少的。而把文件装载到内存这一功能,可以用于启动其他一些文件,如io.sys, ntldr, kernel.sys, grub2等等。因此,启动代码可以独立于GRUB4DOS而存在,作为一个通用的启动管理器。
2、采用模块化的设计
目前启动代码比较混乱,不适合于将来的扩展。主要体现在:
a、多功能集合导致代码复杂度提高
现在grub.exe和grldr都是集合了多个功能于一身。这看上去好像很方便,但其实使得代码的复杂度大大提高,增加了修改和调试的难度。我想应该对于每种不同的启动环境使用不同的启动文件,而代码的共用通过子模块来实现。
b、存在过度优化的现象
我看过一篇名为 Optimization: Your Worst Enemy 的文章: http://www.codeproject.com/tips/optimizationenemy.asp?msg=2259746
我觉得启动代码里也存在过度优化的现象。优化的确是需要的,但是它应该局限于子模块内,不同模块间的交互应该是简单和明确的。
我想启动代码应该尽可能细分为模块,每个模块只实现单一的功能,最终把不同的模块连接起来而成为最终的启动文件。模块可以粗略分为以下几类:
1、启动模块
这相当于启动文件的头部,不同的启动方式对应于不同的头部。启动模块还可以根据具体的启动方式,导出启动设备。例如,如果从光驱里启动,则可导出光驱设备(cd),从pxe启动,则可导出设备(nd)。而通用的设备(hdN)和(fdN)在独立的模块里实现,它们用于读取硬盘和软盘。
2、分区模块
这部分模块处理不同的分区格式。它们通过读取底层的设备(hdN),分析里面存在的分区,从而生成新的设备(hdN,M)
3、文件系统模块
这部分模块处理不同的文件系统。它们使用(hdN,M)来访问底层的设备,并导出文件读取的函数。特殊设备(cd)和(nd)跳过这一步骤,直接导出文件读取的函数。
4、格式处理模块
不同的启动文件,其启动的方式略有不同,这些差异在这些模块里进行处理。
5、扩展功能模块
这部分模块提供扩展的功能。它们类似于GRUB4DOS里的命令。每个命令对应于一个模块。
6、通用函数模块
这部分模块提供公用的函数。比如说,开启/关闭A20的代码,访问扩展内存的代码,等等。
7、脚本解析模块
启动管理器可以使用配置文件的形式来设置启动选项,于是在启动时就需要解析执行。还有一个比较简单的方式,就是
利用外部程序把配置文件转化为容易使用的二进制形式,然后把它添加到启动文件中。
如果使用配置文件,其格式可以参照GRUB4DOS,例如:
timeout 10
title Windows XP
root (hd0,0)
ntldr /ntldr
title DOS
root (hd0,1)
msdos /io.sys
title Grub
root (hd0,0)
grub /boot/grub/stage2
title Grub 2
root (hd0,0)
grub2 /boot/grub2/core.img
在这里,不同的启动文件使用不同的格式处理模块进行处理。
至于这个启动管理器的名字,我本来想使用miniboot,但这名字好像已经有人使用了。我想是不是可以使用tinyboot,这和miniboot的意思差不多,而且和不点的名字有点像,呵呵。 http://bbs.znpc.net/viewthread.php?tid=3576
thanks tinybit.
I am doing a small experiment. If grldr is that small, then I can simply put it in a img file,
embedded into ROMOS. Thus I can embed grldr in a single option rom. this is eliminate
problems such as the need of writing to mbr or lossing grldr, etc.
This is the method:
the ROMOS embeded an img file, which img contain a menu.lst and grldr.
The internal boot-strapper relocate grldr.mbr to 7c00:0000,
then grldr.mbr chain-loading the grldr from that in-memory img file.
Because the img file is within the ROMOS body, which is located in c000:0000 to c000:ffff (64K).
_OR_
compress the grldr. I tried to upx the grub.exe and results ~90K grldr may be the same.
etherboot offer a upx alike program and the decompression source. this is decompression is
a 32bit sub-routine that can act as prefix.
one more thing to add. please think about vista. The sequency of boot->grldr->ntldr->grldr is clumsy, it need to modify much file. this embedded method may reduce the steps. and most importantly flashing into the nic boot rom is easier than cbrom into bios. http://bbs.znpc.net/viewthread.php?tid=3576&page=2&fromuid=12697#pid20480
GRUB2 是 GRUB1 的开发理念的继续发展。虽然开发形式上不同了,但开发者的开发理念、开发哲学、开发重点,是没有变的。这就是 GNU 的开发理念。这是和微软的所建立起来的生存发展环境不相融合的。世界上最难改变的东西,不是山水,而是人的哲学、人的理念。任何一个人,都会根据自己的理念,把自己归入不同的群体。比如说我,当初就喜欢 Mandriva:非常喜欢,非常欣赏,非常佩服。但是后来我的理念发生了变化,转到一个技术并不比 mandriva 好的 ubuntu 上了。理念第一,技术第二。
我来开发 grub4dos,一个明确的理念,就是要以事实工业标准为依据,着力打造一个良好的 PC 运行环境。我很明确不会照顾其他非 PC 的系统,甚至也不会照顾 MAC 机。这是我的侧重点,当然 GNU 不会这么做了。GNU 恰恰相反,GNU 要照顾的是“非微软”的环境(虽然GNU没有明确这么说,但我认为他们始终是这么做的)。这就是理念的差异。GNU 有一种背叛的精神,这很好。但在某些情况下,这种背叛可能容易做过了头、容易过分理想化,从而与现实发生某些脱节。
grub4dos 无论成功与否,都是与此理念相关的。如果成功,那是因为这个理念,如果会失败,那也是因为这个理念。为什么呢?因为我们的技术实力,远远不如 GNU 的技术实力,因此,如果我们成功了(当然我们现在还不算成功),你就无法解释我们为何会成功。只能从技术之外找原因──于是很容易就找到“理念”这个原因了。 http://bbs.znpc.net/viewthread.php?tid=5838&extra=&page=1
MBR 上总共有 31K,原来的 grldr.mbr 要占据 8K,所以,其实剩下的空间只有 23K 了。
当 grldr.MBR 搜索 GRLDR 失败的时候,就进入微型 grub。
虽然只有 23K,但微型 GRUB 还是有可能做一些简单的工作的。
首先,FAT 的驱动,按照 C 代码的生成结果,大概有 10K。如果用汇编,则(估计)可以减少到 2K。其它的文件系统不打算支持(也可以用外部模块来实现,放在 FAT 分区中)。
然后就是磁盘读取disk_io.c(磁盘缓冲),以及命令行的处理(键盘输入和屏幕输出)。
最后就是添加几个必要的内部命令。添加的内部命令,要求占用空间很小。像 map 这样的大命令就不能作为内部命令了。
以上这几项改用汇编也不是说就特别困难,因为整个的代码量很小。
至于说外部命令,就全部用 C 语言来写了。 http://bbs.znpc.net/viewthread.php?tid=4156&extra=&highlight=%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%
关于新一代GRUB4DOS的想法
目前0.4.*系列GRUB4DOS已经基本上稳定,功能比较完善了,除了A20的兼容问题外,其余需要改动的地方不是很多了。但在结构上而言,GRUB4DOS还是存在一定的问题,不容易进行扩展。我想在新一代的GRUB4DOS里可以作以下的改动:
1、启动管理器分离
把启动管理器的代码从GRUB4DOS里分离出去,形成软件tinyboot。而在GRUB4DOS里,生成单一的二进制代码文件stage2,在不同环境里启动GRUB4DOS是通过tinyboot里实现。
2、使用Unicode,不区分中英文版本
摒弃现在打中文补丁的方法,采用统一的代码。配置文件里使用UTF-8的编码,这样可以兼容ascii的菜单,也可以在一个菜单里同时使用不同的语言。
3、利用gettext实现多语言支持
现在显示中文帮助需要在源代码基础上进行补丁,这个方法使得修改变得困难,而且很难支持多种语言。一个较为简单的方法是使用gettext进行转换,把英文转为相应的语言。文本的映射从外部载入,这样可以节省内存空间,也使得语言的动态改变成为可能。
4、内存管理器和动态模块
使用内存管理器可以更好的利用内存空间,特别是扩展内存。动态模块是在GRUB4DOS启动后加载的模块,它们可以和GRUB4DOS的主体进行通信,实现扩展的功能。模块的设计可以参考syslinux里的comboot api: http://syslinux.zytor.com/comboot.php
5、图形界面的改进
修改目前图形显示的一些问题,实现可定制的图形界面,支持更多的图片格式。