无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
楼主: 2011yaya2007777

[原创] GRUB4DOS for UEFI

    [复制链接]
发表于 2020-11-2 08:36:19 | 显示全部楼层
l3429900 发表于 2020-11-1 22:40
建议efi下menu.lst改成menu.efi,新增的配置都以efi结尾,区别易懂

        efi是UEFI下面的可启动程序,用这个作为扩展名显然不合适!

点评

我只是从可读性来说,不一定是efi结尾,也可以“”efi-“开头地文件,比如 efi-menu.lst efi-grub.cfg  详情 回复 发表于 2020-11-2 11:35
回复

使用道具 举报

发表于 2020-11-2 08:46:41 | 显示全部楼层
wintoflash 发表于 2020-11-1 22:06
部分论坛上的朋友和reboot.pro那边的一些网友,想启动 RamOS 的 VHD。
但是目前的 Windows 驱动,比如 SVB ...

        如果UEFI下面能够实现map --mem xxx.vhd或者map xxx.vdf并启动,那UEFI-RAMOS就非常有意思,有前景了!现在wintoflash修改的grub2-UEFI可以实现的是map --mem xxx.vhd到内存,但是windows不认识这个磁盘,所以无法启动,已经迈出了第一步。
回复

使用道具 举报

发表于 2020-11-2 08:47:16 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

 楼主| 发表于 2020-11-2 09:52:57 来自手机 | 显示全部楼层
颜色可使用8位或64位。bios或uefi版本都一样。8位是为了兼容最古老的版本。推荐使用64位颜色。

点评

谢谢回复,明白了!  发表于 2020-11-2 10:46
回复

使用道具 举报

发表于 2020-11-2 09:57:01 | 显示全部楼层
太棒啦!好消息
回复

使用道具 举报

发表于 2020-11-2 10:12:27 | 显示全部楼层
有x86的吗?
回复

使用道具 举报

发表于 2020-11-2 10:18:16 | 显示全部楼层
回复

使用道具 举报

发表于 2020-11-2 10:28:30 | 显示全部楼层
本帖最后由 chenall 于 2020-11-2 10:33 编辑

我来迟了。

这个的工作量可不一般,太强悍了!
EFI核心的内容我不太了解帮不上忙^_^,只能在其它方面支持了。

关于代码的问题,我个人是建议直接开一个新的分支上传。

开新分支基本上的操作就是如 #61 的方法。

1. 首先备份当前代码数据(或直接生成补丁)
2. 然后清理当前代码让代码保留在github上的最后一个版本。
3. 开新分支git checkout -b efi
4. 恢复EFI版本代码(或恢复补丁)。
5. 添加所有修改的文件。 git add .
6. 提交本次改动。git commit -m "add efi support ...."
7. 上传新的分支。 git push -u origin efi

你的帐号应该是有上传的权限的。

评分

参与人数 1无忧币 +10 收起 理由
xyzxp + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2020-11-2 10:52:29 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

 楼主| 发表于 2020-11-2 11:04:00 | 显示全部楼层
如果UEFI下面能够实现map --mem xxx.vhd或者map xxx.vdf并启动,那UEFI-RAMOS就非常有意思

bios 版本就可以实现上述功能。测试了一下,uefi 版本同样可以实现。
vdf静态:map xxx.vdf (hd)
vdf动态:map --mem xxx.vhd (hd)
vdf差分:好像bios版本也不支持。

点评

我试过了直接map vdf,不带mem的这种,启动到BCD这里,如果采用NTFS单分区就会报0xc0000225错误。 如果采用激活的FAT32+NTFS双分区,则会报0xc000000f错误。 晚点我把菜单贴上来。 根据前面的微软知  详情 回复 发表于 2020-12-18 07:34
UEFI下面,map xxx.vdf (hd0)这个的确可以实现,主要问题是实现之后,windows无法从这个(hd0)上面继续启动,windows不认识这个磁盘,无法继续启动,卡在BCD那里出错了,错误代码忘记了,原因不明。  详情 回复 发表于 2020-11-2 13:32
回复

使用道具 举报

发表于 2020-11-2 11:23:49 | 显示全部楼层
这个帖子顿时让无忧老潜水员们高潮了
回复

使用道具 举报

发表于 2020-11-2 11:35:31 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-2 08:36
efi是UEFI下面的可启动程序,用这个作为扩展名显然不合适!

我只是从可读性来说,不一定是efi结尾,也可以“”efi-“开头地文件,比如 efi-menu.lst efi-grub.cfg
回复

使用道具 举报

发表于 2020-11-2 12:21:31 | 显示全部楼层
太好了,感谢YAYA
回复

使用道具 举报

发表于 2020-11-2 13:32:49 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-11-2 13:35 编辑
2011yaya2007777 发表于 2020-11-2 11:04
bios 版本就可以实现上述功能。测试了一下,uefi 版本同样可以实现。
vdf静态:map xxx.vdf (hd)
vdf动 ...

        UEFI下面,map xxx.vdf (hd0)这个的确可以实现,主要问题是实现之后,windows无法从这个(hd0)上面继续启动,windows不认识这个磁盘,无法继续启动,卡在BCD那里出错了,错误代码忘记了,原因不明。

点评

试了一下,通过UEFI环境变量传递内存盘地址是可行的。 如图,我写了个小程序,在windows下获取grub2创建的内存盘地址。直接查看内存,是可以看到内存盘数据的。 问题是,我不会写windows驱动。 [attachimg]467781  详情 回复 发表于 2020-11-2 19:18
回复

使用道具 举报

 楼主| 发表于 2020-11-2 13:48:32 来自手机 | 显示全部楼层
那增加--mem加载到内存,windows认识吗?

点评

也不认识啊。  详情 回复 发表于 2020-11-2 14:35
回复

使用道具 举报

发表于 2020-11-2 14:35:50 | 显示全部楼层
2011yaya2007777 发表于 2020-11-2 13:48
那增加--mem加载到内存,windows认识吗?

也不认识啊。
回复

使用道具 举报

发表于 2020-11-2 17:44:46 | 显示全部楼层
GRUB4DOS——难得的好东西,要是能适应UEFI启动,那就太棒了,若不能适应UEFI启动
回复

使用道具 举报

发表于 2020-11-2 19:06:52 来自手机 | 显示全部楼层
yaya威武!
回复

使用道具 举报

发表于 2020-11-2 19:08:17 | 显示全部楼层
Hello masters, while there was no problem in testing Grub4dos_UEFI with Qemu, I am also testing a real UEFI pc I get the following error please can a tell me the solution?

It appears in the upper left corner of the screen.

Hotkey for grub4dos by chenall, Oct 29 2020
Hotkey Installed!
回复

使用道具 举报

发表于 2020-11-2 19:18:35 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-2 13:32
UEFI下面,map xxx.vdf (hd0)这个的确可以实现,主要问题是实现之后,windows无法从这个(hd0)上 ...

试了一下,通过UEFI环境变量传递内存盘地址是可行的。
如图,我写了个小程序,在windows下获取grub2创建的内存盘地址。直接查看内存,是可以看到内存盘数据的。
问题是,我不会写windows驱动。
深度截图_选择区域_20201102191451.png

点评

我对底层的东西完全不懂,对于UEFI-RAMOS领域,需要的是懂得操作系统启动流程的大神们继续研究才行,现在的思路和原理似乎有两个: 1、grub4dos_UEFI或者grub2的map --mem xxx.vdf (hd0)加载vdf到内存,配  详情 回复 发表于 2020-11-3 09:20
以前稍微搞过这种东西…… 其实不仅是驱动的问题,重要的是如何让系统在第一轮驱动加载之前,让【bootmgfw.efi】正确的把【winload.efi】,【SYSTEM】读进内存。这是最麻烦的。 bootmgr时代,bootmgr是直接呼叫I  详情 回复 发表于 2020-11-2 21:28
回复

使用道具 举报

发表于 2020-11-2 19:39:56 | 显示全部楼层
支持原创
回复

使用道具 举报

发表于 2020-11-2 19:41:06 | 显示全部楼层
希望加入 exit命令
比如:shell 下引到这个 g4e 后,能用 exit 退回 shell  
(这个也是常用的)
回复

使用道具 举报

 楼主| 发表于 2020-11-2 19:59:09 来自手机 | 显示全部楼层
可以在内存某个地址写入"$INT13SFGRUB4DOS" 字符串,以及映射表。不知道那些程序的内存搜索范围,还有没有判断的关键字。

点评

firadisk和svbus都不搜索内存,直接从中断向量表读。 这个位置在uefi下可能是不让写的。  详情 回复 发表于 2020-11-2 20:20
回复

使用道具 举报

发表于 2020-11-2 20:20:47 | 显示全部楼层
2011yaya2007777 发表于 2020-11-2 19:59
可以在内存某个地址写入"$INT13SFGRUB4DOS" 字符串,以及映射表。不知道那些程序的内存搜索范围,还有没有 ...

firadisk和svbus都不搜索内存,直接从中断向量表读。
  1. intVector = ((INTERRUPT_VECTOR*)(VOID*)(virtAddr))[0x13];
复制代码

这个位置在uefi下可能是不让写的。
回复

使用道具 举报

 楼主| 发表于 2020-11-2 20:44:46 来自手机 | 显示全部楼层
有可能不让写,关键是uefi环境没有int13接口呀。在0x4c处写一个指针?我已知有一个电脑把0-0x8000占用了。

点评

如果 uefi 让写,那应该是可行的。 我看 vgashim 和 grub2 的 fakebios 在 uefi 下模拟 int10h 就是在 0x40 的地方写了个指针。  详情 回复 发表于 2020-11-2 22:12
回复

使用道具 举报

发表于 2020-11-2 21:28:25 | 显示全部楼层
本帖最后由 sunsea 于 2020-11-2 21:40 编辑
wintoflash 发表于 2020-11-2 19:18
试了一下,通过UEFI环境变量传递内存盘地址是可行的。
如图,我写了个小程序,在windows下获取grub2创建 ...

以前稍微搞过这种东西……
其实不仅是驱动的问题,重要的是如何让系统在第一轮驱动加载之前,让【bootmgfw.efi】正确的把【bcd】,【winload.efi】,【SYSTEM】读进内存。这是最麻烦的。

bootmgr时代,bootmgr是直接呼叫INT13来读第一轮的这些东西,然后由ntoskrnl.exe加载磁盘驱动,才切换进用磁盘驱动度盘。

现在不知道bootmgfw.efi怎么操作。可能需要调试确定。这一步搞定后面就比较好办了。

怀疑bootmgfw.efi可能调用了UEFI BIOS的相关功能。需要有技术的同志帮忙确定。

点评

这是最不麻烦的。 GRUB2 UEFI 的 map, wimboot, ntboot,GRUB4DOS BIOS 和 UEFI 下的 map, Syslinux BIOS 下的 memdisk 都能做到这个。  详情 回复 发表于 2020-11-2 21:57
回复

使用道具 举报

发表于 2020-11-2 21:57:15 | 显示全部楼层
sunsea 发表于 2020-11-2 21:28
以前稍微搞过这种东西……
其实不仅是驱动的问题,重要的是如何让系统在第一轮驱动加载之前,让【bootmg ...

其实不仅是驱动的问题,重要的是如何让系统在第一轮驱动加载之前,让【bootmgfw.efi】正确的把【bcd】,【winload.efi】,【SYSTEM】读进内存。这是最麻烦的。

bootmgr时代,bootmgr是直接呼叫INT13来读第一轮的这些东西

这是最不麻烦的。
GRUB2 UEFI 的 map, wimboot, ntboot,GRUB4DOS BIOS 和 UEFI 下的 map, Syslinux BIOS 下的 memdisk 都能做到这个。

点评

如果已经UEFI下做到了,那就非常好,我们只需要接着搞磁盘驱动那一层了——我觉得修改SVBus使其能够从UEFI环境变量或者其他什么可靠参数传递渠道读地址的方案。 确实大概我对这些技术进展落后了。 BIOS下grub4  详情 回复 发表于 2020-11-3 11:54
回复

使用道具 举报

发表于 2020-11-2 22:12:24 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-2 22:13 编辑
2011yaya2007777 发表于 2020-11-2 20:44
有可能不让写,关键是uefi环境没有int13接口呀。在0x4c处写一个指针?我已知有一个电脑把0-0x8000占用了。

如果 uefi 让写,那应该是可行的。
我看 vgashim 和 grub2 的 fakebios 在 uefi 下模拟 int10h 就是在 0x40 的地方写了个指针。
但是如果 uefi 有 csm,写了估计会爆炸。
回复

使用道具 举报

发表于 2020-11-2 22:56:49 | 显示全部楼层
“firadisk和svbus都不搜索内存,直接从中断向量表读”
能不能这样:改一下firadisk和svbus直接从中断向量表读的那段代码,改成不读那里,而读UEFI环境变量。重新编译firadisk和svbus。
回复

使用道具 举报

发表于 2020-11-2 23:16:42 | 显示全部楼层
要在主板里关闭安全启动吗?
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2021-3-2 05:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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