|
本帖最后由 不点 于 2015-12-7 21:38 编辑
这是 grub4dos 内核对 32 位程序格式支持进行变动的代码。旧的 32 位可执行程序不能在这个版本下运行。新的 32 位程序也请不要在以前的 grub4dos 之下运行。
稍后会上载修改之后的 FAT 外部命令,供测试。
其它外部命令需要参照 FAT 的源代码进行相应的修改。
grub4dos 内核的进程加载代码,进行了如下修改:
1、把 PSP 移动到进程空间结束之后,即,在 __BSS_END 之后。
2、把 main 加载在进程空间的最开头,而且 main 的地址是 4K 对齐的。
32 位可执行程序的结构进行了如下更改:
1、尾部 8 字节签名保持不变。
2、紧接着尾部 8 字节签名(向前),是 16 字节的信息空间,可以存放任意信息,例如版本号或者编译日期。
3、紧接着 16 字节信息空间(向前),是 8 字节的 “main_end” 签名,表示是新格式。
4、紧接着 8 字节 main_end 签名(向前),是 32 字节的进程结构信息空间(8 个 4 字节整数)。参见 FAT 命令的源代码。其中紧接 main_end 签名的四个字节,是 end 变量相对于 main 的偏移值,也就是进程的长度。这个 “进程长度” 域会被 grub4dos 内核的进程处理代码使用,用来确定 PSP 的位置。32 字节进程结构信息空间中的其他 28 个字节的信息,暂未使用,保留给将来使用。
另外,在 fat.c 开头的注释中,修改了 gcc 编译时所需要的命令行参数,以便适应新格式的要求。而且,由于担心 gcc 编译器在编译多个 c 语言文件时出现意想不到的(隐蔽)错误,因此,在 fat.c 的尾部添加 #include "ff.c" 指令,让 gcc 只编译一个 c 语言文件。
新的 fat.c 代码,在 Debian 的 gcc 4.9 之下编译通过。colinux 以及其他编译环境之下能否编译,还不知道。
更新:grub4dos 的源代码在检测 main_end 签名的时候把字节顺序搞错了,导致签名检测失败,现在已经纠正,请重新下载。
|
-
-
grub4dos-0.4.5c-2015-09-20.7z.zip
261.13 KB, 下载次数: 43, 下载积分: 无忧币 -2
修正了 main_end 签名检测的错误,请重新下载测试
-
-
fat_src.zip
8.35 KB, 下载次数: 29, 下载积分: 无忧币 -2
这是改动后的 fat 源代码
-
-
fat-2015-12-07.zip
16.42 KB, 下载次数: 22, 下载积分: 无忧币 -2
这是重新编译的 fat 命令,可以在旧版 grub4dos 下运行。
-
-
chkpci-2015-09-21.zip
3.66 KB, 下载次数: 24, 下载积分: 无忧币 -2
这是改动后的 chkpci 命令
-
-
chkpci_src.zip
8.31 KB, 下载次数: 21, 下载积分: 无忧币 -2
这是改动后的 chkpci 的源代码
|