|
其实是说明文档没能跟上开发的进度。旧版 grub4dos 使用地址 16M 以下的内存。但新版增加到 32M 了。因此,dd 的缓冲区必须设置在 32M 以上。
还要提醒一下,用户自己设置 dd 缓冲区,属于黑客行为,因此,需要用户自己来保证内存使用的合理,不要导致内存冲突。
比如说,用户可以把缓冲区设置在 32M 处,缓冲区大小也设置为 32M,即 32M - 64M 之间的空间作为 dd 缓冲区。此时,如果运行了 kernel 命令来加载 Linux 内核,那么,grub4dos 会把 Linux 的内核放在地址 32M 处。如果 dd 的缓冲区也是在 32M 处,那么,dd 命令将破坏内存中的 Linux 内核。用户运行的 32 位程序代码,也是位于 32M 处。因此,如果 dd 缓冲区设置在 32M 处,用户的 32 位进程的代码区就要遭到 dd 命令的破坏了,当然就会造成死机了。如果用户所执行的 32 位程序本身不调用 dd 命令,那是比较安全的。因为我们现在的进程都不是常驻内存的,即,活动的进程只有一个,只有在它退出时,才能执行下一个程序。因此,目前而言,只要这个活动的进程不再调用 dd 命令,那么就不会有冲突。但将来很难说。将来如果实现常驻内存程序,那就需要保证在前提条件 “没有常驻内存程序存在” 的情况下,才能安全地使用 dd 命令的用户缓冲区。
当然了,黑客们还应该保证,dd 使用的输入、输出文件,不可以与 dd 的缓冲区相互覆盖,否则,dd 自己将产生内存冲突。
map --mem=-2880 /somefile (fd127)
这个办法在理论上是对的,但是你碰巧使用了 (127) 这个盘号。你知道,(127) 就是 (0x7F) ,它刚好是 (rd) 默认的盘号。看来 grub4dos 应该把 rd 的默认盘号设置为 (0xFF7F),这样就不会与用户自己的 (fd127) 相冲突了。
目前你可以换成 (126) 这个盘号,这就没问题了。
给用户预留的内存,就是前面曾经提到的 0x50000 - 0x7FFFF 这段内存。你的 32 位进程在接管控制后,所有的剩余自由内存都属于它的管辖范围。目前我们缺乏完善的进程管理。chenall 开发了 malloc 函数和 free,可以让用户申请内存和释放内存。但是,整个进程的管理体系没有建立起来,那么用户使用 malloc 和 free 函数,也就不那么放心了。所以,需要有人做进程管理的一套完整的设计。如果你有兴趣,不妨尝试一下。我承认,这可能属于我未完成的工作。但是,我也是摸着石头过河,我也不懂进程管理,我不知道怎么做最好,所以,我也就没有做下去了。
目前来说,你的 map --mem=-2880 /somefile (126) 的思路,可以当作权宜之计。你可以以这种方式建立你自己的 “内存管理体系”,当你需要内存时,你就用 map --mem=-2880 /somefile (126);map --hook;当你不需要它时,你就用 map (126) (126);map --unhook;map --hook;来撤销它(释放它)。
(rd) 是内存设备,用户可以设置它的基地址和长度。换句话说,用户可以指定任何一个内存区域作为 (rd) 设备的内容。map 命令有一些参数是与 (rd) 设备有关的,你可以看看源代码,也可以读读 readme 文件。
|
|