无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
31#
发表于 2020-11-18 19:46:04 | 显示全部楼层
2011yaya2007777 发表于 2020-11-18 10:48
chenall,我把源代码上传到这里,建立分支的事情有劳你了。
     批处理增加 esle 函数。增加 {脚本集} 表示法。
     如:
     if 条件
     {
       脚本集
       if 条件 {
         脚本集 }
       else {
         脚本集 }
     }
     esle if 条件
     {
       脚本集
     }
     esle
     {
       脚本集
     }


是不是打错了? "esle" -> "else"
回复

使用道具 举报

32#
发表于 2020-11-18 20:32:39 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-18 20:36 编辑


你源码里面带的grub-mkimage是不是原版grub2的?
32位的程序在64位系统里面跑不了。如果是原版,那执行系统里面带的grub-mkimage是不是好一些。

-------------------
原版不行。。。


-------------------
用grub-mkimage是把elf转成pe吗?
回复

使用道具 举报

33#
发表于 2020-11-18 21:55:58 | 显示全部楼层
2011yaya2007777 发表于 2020-11-18 20:44
是grub2原版,64位。在linux环境编译。使用它转换为pe。

你的这个明明是32位grub-mkimage。64位grub-mkimage弄不了。

回复

使用道具 举报

34#
发表于 2020-11-19 11:24:41 | 显示全部楼层
2011yaya2007777 发表于 2020-11-19 09:46
我是把 grub-2.03 配置了一个 32 位的 grub-32,又配置了一个 64 位的  grub-64。
编译 bootia32.efi 时 ...

grub-mkimage的位数是和系统保持一致的,与./configure --target=i386 ./configure --target=x86_64无关。


我又自己编译了一个64位的grub-mkimage,改了一下build脚本弄成检测系统位数然后自动选择的。
https://github.com/a1ive/grub4do ... 8da911321a5c557b90a

现在正在研究把 kernel 命令加载linux内核的功能加回来,等研究好了一并合并到你那边。

回复

使用道具 举报

35#
发表于 2020-11-19 19:37:52 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-19 19:46 编辑

测试:增加启动linux的功能。
grub4dos-0.4.6a_for_UEFI-2020-11-19.7z (131.17 KB, 下载次数: 48)
使用 kernel 和 initrd 命令启动 linux。
测试 Linux:Porteus 5.0 x86_64 openbox
下载 http://dl.porteus.org/x86_64/Por ... -v5.0rc1-x86_64.iso
把 porteus 文件夹解压到 U 盘根目录。
提取 /boot/syslinux/vmlinuz 和 /boot/syslinux/initrd.xz 到 /porteus 下。
命令:
  1. kernel /porteus/vmlinuz copy2ram
  2. initrd /porteus/initrd.xz
复制代码



目前是通过 EFI handover protocol 启动 linux 的,要求版本 >= 3.6 且开启 EFI stub。
以下功能未实现:
  • 支持加载多个 initrd
  • 支持 wimboot @file:path
  • 点评

    好象我这里kernel 不成功 [attachimg]468832[/attachimg]  详情 回复 发表于 2020-11-20 00:44
    回复

    使用道具 举报

    36#
    发表于 2020-11-19 20:10:30 | 显示全部楼层
    map --mem 这里处理得应该不太对。
    1. status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES, GRUB_EFI_LOADER_CODE,
    2.                               (grub_efi_uintn_t)bytes_needed >> 12, (void **)&alloc);
    复制代码

    GRUB_EFI_LOADER_CODE 是不是应该改成 GRUB_EFI_RUNTIME_SERVICES_DATA
    还有 (grub_efi_uintn_t)bytes_needed >> 12 , 这个处理我不清楚对不对,是不是改成
    (grub_efi_uintn_t)(bytes_needed + 0xfff) >> 12 更好一些。
    回复

    使用道具 举报

    37#
    发表于 2020-11-19 20:45:48 | 显示全部楼层
    2011yaya2007777 发表于 2020-11-19 20:39
    关于第一个问题:不知道我理解的对不对,如果加载到内存的镜像是准备启动的,使用那一种内存类型都可以。如 ...

    这个地方是给map --mem的内存盘分配内存的吧。如果希望svbus能够认这块内存盘,那就得是RUNTIME DATA。
    回复

    使用道具 举报

    38#
    发表于 2020-11-20 09:15:49 | 显示全部楼层
    hilsonma 发表于 2020-11-20 00:44
    好象我这里kernel 不成功


    你用的是老版本

    点评

    重新下载后能引导了,porteus 启动中途出错,不懂怎么搞 [attachimg]468844[/attachimg]  详情 回复 发表于 2020-11-20 10:10
    回复

    使用道具 举报

    39#
    发表于 2020-11-20 09:58:02 | 显示全部楼层
    chenall 发表于 2020-11-20 08:48
    支持linux 启动的pr已经合并

    大佬 把 0.4.6a 或者 efi 分支设成主分支吧。
    回复

    使用道具 举报

    40#
    发表于 2020-11-20 10:18:34 | 显示全部楼层
    hilsonma 发表于 2020-11-20 10:10
    重新下载后能引导了,porteus 启动中途出错,不懂怎么搞

    说明porteus不认你的硬盘/U盘。porteus带的驱动太少了。

    点评

    是这个porteus版本的问题,换了grub2引导也是一样的。 我试了另一个porteus版本,这个版本可以用grub2引导成功,但用g4e引导提示如下: [attachimg]468848[/attachimg]  详情 回复 发表于 2020-11-20 10:30
    回复

    使用道具 举报

    41#
    发表于 2020-11-20 10:45:17 | 显示全部楼层
    2011yaya2007777 发表于 2020-11-20 10:39
    wintoflash:
    实体机测试成功。
    qemu虚拟机失败。

    Not enough memory to copy ...
    内存不足了。
    我给的这个kernel命令行是全部加载到内存的,去掉 copy2ram 应该就可以了。
    kernel /porteus/vmlinuz
    initrd /porteus/initrd.xz



    回复

    使用道具 举报

    42#
    发表于 2020-11-20 10:49:54 | 显示全部楼层
    hilsonma 发表于 2020-11-20 10:30
    是这个porteus版本的问题,换了grub2引导也是一样的。

    我试了另一个porteus版本,这个版本可以用grub2 ...

    因为g4e上用的是 EFI handover protocol,相当于 grub2下的 linuxefi 和 initrdefi 命令。
    对于没开启 EFI stub 或者非 64 位 linux 是不支持的。
    主流的 linux (比如 Ubuntu, Fedora) 都支持,你可以试一下。你用的 "另一个porteus版本" 应该是我几年前做的。当时 UEFI 还没那么普遍。



    点评

    晕。卡死,搞得我按了几次提交。  发表于 2020-11-20 11:03
    刚才又重新检查了一次,发现是我没有按要求先提取porteus文件夹,只提取了 vmlinuz 和initrd.xz 两个文件,所以启动失败。 再次按照你441楼的操作,启动成功了。 不过还是你之前做那个版本方便,进去就能用,  详情 回复 发表于 2020-11-20 11:00
    刚才又重新检查了一次,发现是我没有按要求先提取porteus文件夹,只提取了 vmlinuz 和initrd.xz 两个文件,所以启动失败。 再次按照你441楼的操作,启动成功了。 不过还是你之前做那个版本方便,进去就能用,  详情 回复 发表于 2020-11-20 10:59
    刚才又重新检查了一次,发现是我没有按要求先提取porteus文件夹,只提取了 vmlinuz 和initrd.xz 两个文件,所以启动失败。 再次按照你441楼的操作,启动成功了。 不过还是你之前做那个版本方便,进去就能用,  详情 回复 发表于 2020-11-20 10:59
    刚才又重新检查了一次,发现是我没有按要求先提取porteus文件夹,只提取了 vmlinuz 和initrd.xz 两个文件,所以启动失败。 再次按照你441楼的操作,启动成功了。 不过还是你之前做那个版本方便,进去就能用,  详情 回复 发表于 2020-11-20 10:58
    回复

    使用道具 举报

    43#
    发表于 2020-11-22 10:18:09 | 显示全部楼层
    2011yaya2007777 发表于 2020-11-22 09:03
    wintoflash:
    chenall 合并你的补丁后,编译出现以下问题
    /mnt/.31/home/dev/grub4dos/grub-mkimage64: li ...

    好,我研究一下。
    我觉得用 grub-mkimage 生成最终文件只是权宜之计,还是要想办法自己写个 elf2pe 这样的程序转格式。


    回复

    使用道具 举报

    44#
    发表于 2020-11-22 15:11:57 | 显示全部楼层
    本帖最后由 wintoflash 于 2020-11-22 15:13 编辑
    2011yaya2007777 发表于 2020-11-22 09:03
    wintoflash:
    chenall 合并你的补丁后,编译出现以下问题
    /mnt/.31/home/dev/grub4dos/grub-mkimage64: li ...

    少了俩空格。我又提交了一个pr。现在我这边测试release ok了
    https://github.com/grub4dos/grub ... /2020-11-22-086638b
    回复

    使用道具 举报

    45#
    发表于 2020-11-23 12:55:40 | 显示全部楼层
    求道者 发表于 2020-11-22 19:24
    yaya,我滴超人!
    但是能不能用grub2的mod?
    文件系统支持的相当多。

    你需要grub2的哪个功能?

    grub2的mod肯定不能直接用,这个在设计上就没有这种考虑。

    点评

    btrfs hfs xfs,蛮多文件系统我都用 然后就是支持带碎片的iso启动。  详情 回复 发表于 2020-11-23 21:49
    回复

    使用道具 举报

    46#
    发表于 2020-11-23 14:05:29 | 显示全部楼层
    2011whp 发表于 2020-11-23 13:49
    2020-11-19版   深度livecd实机成功     简易测试器,读initrd.img后不动了。
    deepin-live-system-2.0-amd ...

    qemu测试就别说了。内存不够,就算内存够了也慢得要死。
    回复

    使用道具 举报

    47#
    发表于 2020-11-23 22:21:51 | 显示全部楼层
    求道者 发表于 2020-11-23 21:49
    btrfs hfs xfs,蛮多文件系统我都用
    然后就是支持带碎片的iso启动。
    然后就是在BIOS上工作的grub4dos和 ...

    hfs你肯定用不到。

    然后就是支持带碎片的iso启动。

    efi下无所谓碎片不碎片了。都可以直接map。
    然后就是在BIOS上工作的grub4dos和wee,附属组件,他们能用最新的gcc编译了吗?

    这个不现实。

    点评

    不是说gcc5开始对汇编是有所改动的,但并没有把支持扬了啊,起码grub2是能编译。  详情 回复 发表于 2020-11-24 12:08
    hfs用得到的,实际上hfs模组支持hfs和hfs+。 我有时候需要整hfs,虽然少。 但就算只有btrfs的移植几乎是天量的工作量了吧  详情 回复 发表于 2020-11-24 11:58
    回复

    使用道具 举报

    48#
    发表于 2020-11-23 22:23:30 | 显示全部楼层
    @yaya:
    i386版本好像没法编译,报错。
    char_io.c:444:18: error: ‘dataptr’ undeclared (first use in this function)
               lo = *(dataptr++);
                      ^
    回复

    使用道具 举报

    49#
    发表于 2020-11-24 13:14:12 | 显示全部楼层
    求道者 发表于 2020-11-24 11:57
    BIOS版启动manjaro镜像,报错碎片过多。然后今天我更新了镜像版本,就没报错了。
    估计是生产镜像时整理 ...

    bios下有碎片数限制,好像是最多32个
    回复

    使用道具 举报

    50#
    发表于 2020-11-24 18:12:16 | 显示全部楼层
    wuwuzz 发表于 2020-11-24 15:42
    考虑到G4E map和grub2 map同源,又回溯追查了grub2 map的情况,以获取更多的提示信息。

    1.在AMI UEFI下 ...

    跟"[0:]"没什么关系。我觉得主要还是Eltorito软盘镜像的问题。
    CD(1,12b,5a0) 是grub2通过解析ISO文件数据得到的软盘镜像位置和大小。
    这个在 AMI UEFI 上和 UEFI 自己算出来的一样,被认定为有效。
    但是在 Insyde UEFI 上,UEFI 算出来的是 CD(1,12b,75245) ,不认可 CD(1,12b,5a0)。
    你用7-ZIP或者其他软件,把软盘镜像从ISO里面提取出来,看看软盘镜像的大小是多少?

    点评

    ISO就是本坛这个帖子中的win10PE V17763 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414556 (WinPE10 x64、x86 17763 [分享] 【经典 P10】Win10PEx64、x86,含常规工具+制作个性(PE)工具,网络、BIOS  详情 回复 发表于 2020-11-24 18:56
    回复

    使用道具 举报

    51#
    发表于 2020-11-24 18:23:46 | 显示全部楼层
    求道者 发表于 2020-11-24 11:58
    hfs用得到的,实际上hfs模组支持hfs和hfs+。
    我有时候需要整hfs,虽然少。
    主要反而是查看文件。

    grub2 下 hfs 和 hfsplus 是分开的。
    现在新版 macOS 都默认用 APFS 了吧,移植 hfsplus 的意义不大。
    btrfs 太复杂,grub2 下的 btrfs 性能好像也不太行。

    点评

    有时候你就是要引导起来硬盘里的系统然后再修复引导…… 不支持就挺麻烦的…… 所以就很烦 我不太想自己去修正ISO  详情 回复 发表于 2020-11-24 20:29
    回复

    使用道具 举报

    52#
    发表于 2020-11-24 19:00:45 | 显示全部楼层
    wuwuzz 发表于 2020-11-24 18:56
    ISO就是本坛这个帖子中的win10PE V17763
    http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414556
    ...

    2880*1024/2048 = 1440 = 0x5a0
    所以 CD(1,12b,5a0) 是正确的,Insyde UEFI 确实有毛病。
    但是,一个img,后面加上一堆无用数据,也是应该能正常启动的。
    我怀疑是 GCC 把代码优化错了。

    点评

    可能还是Insyde UEFI的问题居多。 GCC编译我用的不多,不太了解。  详情 回复 发表于 2020-11-24 19:10
    回复

    使用道具 举报

    53#
    发表于 2020-11-24 19:31:28 | 显示全部楼层
    wuwuzz 发表于 2020-11-24 19:10
    可能还是Insyde UEFI的问题居多。
    GCC编译我用的不多,不太了解。

    在这个帖子下讨论grub2好像不太合适。我到grub2的帖子里面给你发个测试版本。

    点评

    好的,谢谢您的关注。 我现在在办公室,Insyde UEFI机在宿舍,我这就赶回去。 请等一会。  详情 回复 发表于 2020-11-24 19:35
    回复

    使用道具 举报

    54#
    发表于 2020-11-27 10:02:40 | 显示全部楼层
    本帖最后由 wintoflash 于 2020-11-27 10:05 编辑
    2011yaya2007777 发表于 2020-11-26 09:21
    我已经把 i386 及 x86_64 源代码合并了,上传官网。
    根目录下有一个 build 及 build-i386,stage2 目录 ...
    根目录下有一个 build 及 build-i386,stage2 目录下有一个 Makefile.in 及 Makefile.in-i386,shared.h 文件里有一个编译开关 #define i386 0            //系统类型  0: x86_64;  1: i386。

    我没有看到 build-i386 文件啊。
    https://github.com/chenall/grub4dos/tree/efi
    1. 编译 i386 需要手工处理,转换开关,重命名文件,不太方便。如何修改,你比我有经验。
    复制代码

    这个好办。
    gcc -Di386=1,等于在头文件中写 #define i386 1
    https://www.rapidtables.com/code/linux/gcc/gcc-d.html
    坛友反馈不能启动 bootmgfw.efi。
    我这里实机测试,1129kb 那个可以启动,1522kb 那个不能启动。执行
        status = efi_call_3 (b->start_image, image_handle, 0, NULL);
    后返回状态码 0x8000000000000011,没有映像?

    1522kb的在哪下载的?是不是从非 FAT 分区启动了?
    回复

    使用道具 举报

    55#
    发表于 2020-11-27 14:02:50 | 显示全部楼层
    本帖最后由 wintoflash 于 2020-11-27 14:23 编辑

    看 grub4dos chainloader 和 boot 的代码,好像没看出有什么问题。
    启不了那个 bootmgfw.efi,但是 grub2 可以,奇怪。

    点评

    g4e环境 跳至 intel shellx64.efi 环境,能启动bootmgfw.efi  详情 回复 发表于 2020-11-27 19:02
    回复

    使用道具 举报

    56#
    发表于 2020-11-27 18:39:00 | 显示全部楼层
    本帖最后由 wintoflash 于 2020-11-27 18:48 编辑

    32位还是编译错误。
    1. char_io.c: Assembler messages:
    2. char_io.c:2244: Error: unsupported instruction `mov'
    3. char_io.c:2244: Error: unsupported instruction `mov'
    4. char_io.c:2255: Error: unsupported instruction `mov'
    5. char_io.c:2255: Error: unsupported instruction `mov'
    6. char_io.c:2258: Error: unsupported instruction `mov'
    7. char_io.c:2259: Error: unsupported instruction `mov'
    8. char_io.c:2260: Error: unsupported instruction `mov'
    9. char_io.c:2261: Error: unsupported instruction `ljmp'
    10. char_io.c:2263: Error: unsupported instruction `mov'
    11. char_io.c:2278: Error: unsupported instruction `mov'
    12. char_io.c:2278: Error: unsupported instruction `mov'
    13. char_io.c:2279: Error: unsupported instruction `ljmp'
    14. char_io.c:2280: Error: unsupported instruction `mov'
    15. char_io.c:2280: Error: unsupported instruction `mov'
    16. char_io.c:2281: Error: unsupported instruction `mov'
    17. Makefile:718: recipe for target 'pre_stage2_exec-char_io.o' failed
    复制代码

    asm.S 和 char_io.c 里面是不是一些汇编语句该用 .code32 的地方用了 .code64 ?
    回复

    使用道具 举报

    57#
    发表于 2020-11-27 19:23:54 | 显示全部楼层
    2011yaya2007777 发表于 2020-11-27 19:09
    char_io.c 里是有汇编语句,没有定义 .code64 或者 .code32。
    asm.S 里分别之明 .code64 或者 .code32。数 ...

    我的环境是 Win10 (64位),wsl Ubuntu 18.04 gcc 4.8
    stage2/Makefile.in 和 build 都替换为你附件中的 i386 版本了。
    #define i386 0 也改为 #define i386 1 了。


    回复

    使用道具 举报

    58#
    发表于 2020-11-27 19:59:10 | 显示全部楼层
    ko20010214 发表于 2020-11-27 19:51
    是在这讨论还是要另开一贴?

    我在VM里用这个中文菜单,无法正常显示,就改成英文菜单了……可还是有问题 ...

    MicroPE.iso 是否支持 UEFI 启动?
    cdudos.img 看名字应该是个 DOS。DOS 不支持 UEFI。

    点评

    不支持……都不支持…… boot_image_handle not found 还没有用过支持UEFI的光盘映像来试验。 但中文界面要字库支持,我没字库就没用中文,可英文它也有显示不正常。连选项箭头也没看见,高亮选择项也没有,  详情 回复 发表于 2020-11-27 20:17
    回复

    使用道具 举报

    59#
    发表于 2020-11-28 08:43:12 | 显示全部楼层
    sunsea 发表于 2020-11-28 08:39
    真奇怪,map和map --mem后
    chainloader (0xff)就可以读到bcd文件,(虽然卡在winload.efi那,提示找不到 ...

    前面说过,光盘上的bootmgfw.efi屁事多。必须启动软盘镜像里的bootmgfw.efi。

    点评

    我直接在硬盘格式带EFI分区上的U盘上这样做,也是如此的错误,似乎与软盘镜像无关——我发现只要插上U盘,并有启动文件的时候,都可以 chainloader bootmgfw.efi,但是 BCD 菜单会出问题;而不手上U盘的话,会回到命  详情 回复 发表于 2020-11-28 10:33
    也是一样,行为非常怪异·,chainloader (hd1)就能成功读bcd,直接加载XXX.efi就会报bcd损坏,不知这两者有何区别?  详情 回复 发表于 2020-11-28 08:59
    那我转成硬盘版的PE继续测试好了……希望能避雷  详情 回复 发表于 2020-11-28 08:45
    回复

    使用道具 举报

    60#
    发表于 2020-11-29 13:27:20 | 显示全部楼层
    ko20010214 发表于 2020-11-29 13:07
    有个想法,为什么不能让G4E符合windows的启动规范,让WBM能象启动winload.efi一样把G4E启动起来呢?
    这样 ...

    不要一拍脑袋就给开发者乱提建议。
    为什么不能让G4E符合windows的启动规范,让WBM能象启动winload.efi一样把G4E启动起来呢?

    这个"规范"在哪看?
    另外,你仔细考虑下,winload.efi到底是不是一般的 EFI 应用程序。
    另外,在EFI时代,即使你在BCD里添加了Grldr的入口,也会启动不了,(因为Grldr不支持EFI),那能不能给它虚拟一个BIOS环境让它启动呢?
    也就是说,在EFI环境下,启动到Grldr的时候,当要把控制权交给Grldr之前,先将Grldr需要的启动环境准备好,看看需要传递哪些参数给Grldr才能让它正常启动。研究BIOS下启动Grldr的大神们应该很清楚GRLDR的启动环境,那怎么把这个环境虚拟出来,让GRLDR能象在BIOS环境下一样启动不就好了?
    不知道这个难度高不高。

    建议你在提建议之前先看看论坛里有没有人提过类似的想法。

    点评

    哈哈,我就是随便问问。因为我自己不懂这样具体的问题。  详情 回复 发表于 2020-11-29 13:31
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

    闽公网安备 35020302032614号

    GMT+8, 2024-5-1 06:28

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表