无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
1681#
发表于 2021-6-16 20:24:27 | 只看该作者
2011whp 发表于 2021-6-16 19:16
2011yaya2007777  有什么办法看这个变量的 二进制呢
试了下,  grub2   可能是 gbk码( 因为 英文是  ...

不是,我前面说过了,是 grub2 的 chainloader 自己的问题。它的转码代码只适用于 ASCII 码。

uefi cmdline 是 UTF-16 LE 编码的,且只支持 UCS-2 部分。(U+0000 ~ U+FFFF, 两个字节)
grub2/grub4dos 内部字符串都是 UTF-8 编码的。
grub2 的 chainloader 的转码实现得比较简单粗暴,就是把每一个字节后面加上 0x00。
这样只有 ASCII 码部分转成了正确的 UTF-16 LE 码。
回复

使用道具 举报

1682#
发表于 2021-6-16 21:51:58 | 只看该作者
菜鸟想请问下,imac,默认是不能从网络启动的。能不能把imac的默认引导改成grub4dos uefi 然后让其从网络启动呢。
如果行的话,mune.lst 里面的菜单要怎么写呢。

如果不行的话。我想远程设置imac的启动菜单(启动进mac还是win,或者pe),能实现么
回复

使用道具 举报

1683#
发表于 2021-6-16 22:23:02 | 只看该作者
获取 uefi 环境变量的外部命令 getenv
getenv.zip (6.73 KB, 下载次数: 7)
可能还有点bug,不过懒得改了。图一乐。


图1:utf-16 字符串
图2:utf-8 字符串
回复

使用道具 举报

1684#
发表于 2021-6-17 11:42:28 | 只看该作者
号外号外

grub4dos-for_UEFI里面,menu.lst的demo版本里面很多是中文啊,两位大神不考虑下国际友人吗?

点评

全球有二百多个国家和地区,目前有超过六千种语言。 近八十亿人口中,使用英语作为母语或第二语言的仅有不到十五亿人。 剩下的六十多亿人,包括我和yaya在内的大多数中国人都需要用翻译软件才能看懂英语。 我没有  详情 回复 发表于 2021-6-17 12:35
回复

使用道具 举报

1685#
发表于 2021-6-17 12:35:29 | 只看该作者
liuzhaoyzz 发表于 2021-6-17 11:42
号外号外

grub4dos-for_UEFI里面,menu.lst的demo版本里面很多是中文啊,两位大神不考虑下国际友人吗?
...

全球有二百多个国家和地区,目前有超过六千种语言。
近八十亿人口中,使用英语作为母语或第二语言的仅有不到十五亿人。
剩下的六十多亿人,包括我和yaya在内的大多数中国人都需要用翻译软件才能看懂英语。
我没有看出用英语的必要性。
回复

使用道具 举报

1686#
 楼主| 发表于 2021-6-17 15:23:09 | 只看该作者
赞成wintoflash的说法。
现在翻译软件使用也方便,国际友人自行翻译好了。
如果我事先把中文使用百度翻译了,意思差不多,但比较生硬,缺少介词。
回复

使用道具 举报

1687#
发表于 2021-6-17 18:59:33 | 只看该作者
弄不弄32位版的外部命令的?如果不弄其他的,最好把hotkey弄一下。

点评

又有人要等米下锅了~~~~~~  发表于 2021-6-17 21:26
回复

使用道具 举报

1688#
发表于 2021-6-17 19:52:17 | 只看该作者
2011yaya2007777 发表于 2021-6-17 15:23
赞成wintoflash的说法。
现在翻译软件使用也方便,国际友人自行翻译好了。
如果我事先把中文使用百度翻译 ...


@2011yaya2007777 你确定 grub_efi_system_table 和 grub_efi_image_handle 应该用 SYSVAR 而不是 SYSVAR_2 吗?
你改完之后 ver, cmdline, date, time 等要用 efi 系统表的外部命令就坏了。
另外
#if defined(__i386__)
  #define extent long
#else
  #define extent quad
#endif

        .extent        ABS(EXT_C(grub_efi_image_handle))   //14  void *
//VARIABLE(map_start_sector)
        .extent        ABS(EXT_C(grub_efi_system_table))   //15  struct grub_efi_system_table

#define        SYSVAR(x)        (*(unsigned long long *)((*(unsigned long long *)IMG(0x8308)) + (x<<3)))
所以 在外部命令里面应该用 unsigned long 吧。
编译器也会报警:warning: initialization makes pointer from integer without a cast
回复

使用道具 举报

1689#
发表于 2021-6-18 19:57:06 | 只看该作者
如果进入G4E之后直接出一行
FAULT: <<<<<<<<<<SYSTEM STATCK RUNOUT>>>>>>>>>>
然后就停在命令行了,不管是输入什么指令都是反一行这个,外加Error 30
会是什么原因呢。
我从我自己机器上运行就没问题,但是在其他两台机器上都这样。
回复

使用道具 举报

1690#
 楼主| 发表于 2021-6-18 20:37:51 来自手机 | 只看该作者
g4e版本多少?是不是最新版本?
回复

使用道具 举报

1691#
发表于 2021-6-18 21:07:14 | 只看该作者
2011yaya2007777 发表于 2021-6-18 20:37
g4e版本多少?是不是最新版本?



版本是2021-05-19
附图是通过grub2加载和通过uefi shell加载时的输出。
回复

使用道具 举报

1692#
发表于 2021-6-18 21:10:16 | 只看该作者
2011yaya2007777 发表于 2021-6-18 20:37
g4e版本多少?是不是最新版本?



版本是2021-05-19
附图是通过grub2加载和通过uefi shell加载时的输出。
回复

使用道具 举报

1693#
发表于 2021-6-18 21:15:54 | 只看该作者
感觉论坛出故障了?页面各种打不开呢。
回复

使用道具 举报

1694#
 楼主| 发表于 2021-6-18 21:36:26 来自手机 | 只看该作者
使用最新版本试一试。华为浏览器无法登录了。真是的。
回复

使用道具 举报

1695#
 楼主| 发表于 2021-6-19 11:39:55 | 只看该作者
@2011yaya2007777 你确定 grub_efi_system_table 和 grub_efi_image_handle 应该用 SYSVAR 而不是 SYSVAR_2 吗?
你改完之后 ver, cmdline, date, time 等要用 efi 系统表的外部命令就坏了。

已经修正,提交官网。

另外,在外部命令里,增加
#define ADDR_RET_STR ((char *)(SYSVAR_2(31)))
/* If the variable is a string, then:  ADDR_RET_STR = var;
   If the variable is a numeric value, then:  sprintf (ADDR_RET_STR,"0x%lx",var); */
这样,使用 echo %?% 可以显示变量。
回复

使用道具 举报

1696#
发表于 2021-6-19 12:41:30 | 只看该作者
本帖最后由 2011whp 于 2021-6-19 13:09 编辑

读文件 到内存

文件长度:
cat --length=0 /p  | set  len=
echo %len:~12%

回复

使用道具 举报

1697#
发表于 2021-6-19 15:11:03 | 只看该作者
2011yaya2007777 发表于 2021-6-16 09:09
手动回车后,是进入命令行?还是你的菜单界面?

他说的应该是这种情况(见下图)。20210426及以前版本的g4e可以自动连接EFI\gurb\menu.lst引导文件,新版本的g4e不能自动引导菜单,必须要手动才行,请修正
回复

使用道具 举报

1698#
发表于 2021-6-19 15:23:39 | 只看该作者
2011yaya2007777 发表于 2021-6-18 21:36
使用最新版本试一试。华为浏览器无法登录了。真是的。

换用了2021-06-02版本,在昨天出问题的机器上试了一下,顺利启动了。
不过在使用flash大的cmdline获取参数之后,如果紧接着直接使用find,有大概75%的概率会卡死。

点评

真找到 一个 用UEFISHELL环境能下载 文件的 办法了? 你是 从什么地方引导g4e的  详情 回复 发表于 2021-6-19 16:11
回复

使用道具 举报

1699#
发表于 2021-6-19 15:39:52 | 只看该作者
ksafei 发表于 2021-6-19 15:11
他说的应该是这种情况(见下图)。20210426及以前版本的g4e可以自动连接EFI\gurb\menu.lst引导文件,新版 ...

这个应该可以用内建菜单来解决吧。

点评

感谢指点!  发表于 2021-6-20 11:53
回复

使用道具 举报

1700#
发表于 2021-6-19 15:56:15 | 只看该作者
本帖最后由 2011whp 于 2021-6-20 14:31 编辑
ksafei 发表于 2021-6-19 15:11
他说的应该是这种情况(见下图)。20210426及以前版本的g4e可以自动连接EFI\gurb\menu.lst引导文件,新版 ...

default 0
timeout 1
configfile

把 标准 位置的 菜单启动 configfile 放到后面
定制   时  -p 参数 现在 好像是  个形式参数,不起作用

回复

使用道具 举报

1701#
发表于 2021-6-19 16:11:25 | 只看该作者
fmwqsn 发表于 2021-6-19 15:23
换用了2021-06-02版本,在昨天出问题的机器上试了一下,顺利启动了。
不过在使用flash大的cmdline获取参 ...

真找到 一个 用UEFISHELL环境能下载  文件的 办法了?

你是 从什么地方引导g4e的
回复

使用道具 举报

1702#
发表于 2021-6-19 16:36:28 | 只看该作者
2011whp 发表于 2021-6-19 16:11
真找到 一个 用UEFISHELL环境能下载  文件的 办法了?

你是 从什么地方引导g4e的

UEFI shell直接下载文件还有些较劲,受文件系统影响太大了。现有能找到的文件系统驱动大都只能读,写都不太友好,特别是NTFS的,没脾气,搞不懂为啥,写了就出问题。现在是尝试事先写好盘,然后做个快照,直接DD进去这种感觉。不然就是起一个内核。还在尝试中。

点评

现在主流是: ipxe 网启PE ,然后 ,利用 PE下的 CMD 自动化工具 自动安装 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=425473&extra=page%3D1 你现在的想法: 整个流程上 生态不 全,难办 问  详情 回复 发表于 2021-6-19 18:03
回复

使用道具 举报

1703#
发表于 2021-6-19 18:03:56 | 只看该作者
本帖最后由 2011whp 于 2021-6-19 18:21 编辑
fmwqsn 发表于 2021-6-19 16:36
UEFI shell直接下载文件还有些较劲,受文件系统影响太大了。现有能找到的文件系统驱动大都只能读,写都不 ...

现在主流是: ipxe 网启PE  ,然后 ,利用  PE下的 CMD  自动化工具  自动安装
http://bbs.wuyou.net/forum.php?m ... 5473&extra=page%3D1


你现在的想法: 整个流程上  生态不 全,难办
问题:   UEFI shell 从哪里来 呢(不是每个主板都有) 但网启  是普及的
         g4e 从哪里来



要是  能不脱离 启动阶段  能下载个  镜像  到内存块  ,这个估计g4e给你 挂载成设备
  (改造 ISO 有 svbus驱动 ,有无人值守 有分区办法) 此情此境,微软没有方案?(有个 pxeboot.n12,也是没发展出什么 用法)
回复

使用道具 举报

1704#
发表于 2021-6-19 19:27:51 | 只看该作者
本帖最后由 wintoflash 于 2021-6-19 19:34 编辑
2011yaya2007777 发表于 2021-6-19 11:39
已经修正,提交官网。

另外,在外部命令里,增加

ADDR_RET_STR 有点问题啊。
  1. char uefi_ver[11];
  2.   efi_system_table_t *st = grub_efi_system_table;
  3.   grub_uint16_t uefi_major_rev = st->hdr.revision >> 16;
  4.   grub_uint16_t uefi_minor_rev = st->hdr.revision & 0xffff;
  5.   grub_uint8_t uefi_minor_1 = uefi_minor_rev / 10;
  6.   grub_uint8_t uefi_minor_2 = uefi_minor_rev % 10;
  7.   sprintf (uefi_ver, "%u.%u", uefi_major_rev, uefi_minor_1);
  8.   if (uefi_minor_2)
  9.     sprintf (uefi_ver, "%s.%u", uefi_ver, uefi_minor_2);
  10.   printf ("%s\n", uefi_ver);
  11.   ADDR_RET_STR = uefi_ver;
  12.   return 1;
复制代码

报错:
ver.c:42:16: error: lvalue required as left operand of assignment
   ADDR_RET_STR = uefi_ver;
                ^

-------------------
这个东西是怎么用的?没效果啊?
  1. static int main(char *arg,int key)
  2. {
  3.   get_G4E_image();
  4.   if (! g4e_data)
  5.     return 0;
  6.   unsigned long var = 0x12345678;
  7.   return sprintf (ADDR_RET_STR, "0x%lx", var);
  8. }
复制代码

回复

使用道具 举报

1705#
 楼主| 发表于 2021-6-19 19:48:52 来自手机 | 只看该作者
对不起,g4e更改后没有上传。你把asm.s的变量31设定一下。
回复

使用道具 举报

1706#
发表于 2021-6-19 21:28:10 | 只看该作者
本帖最后由 2011whp 于 2021-7-3 18:17 编辑

echo不出,在前几楼,读文件到内存  遇到过,
我是这么理解的, 人机shell的输出 总是按字符的编码处理的
这个估计不好改,是人机shell的一种精神(目前发现,只有引用内存时,按机内 数值处理)


echo 显示人类字符,如果,%?%里的字节都是超2的7次方,又不符合utf8,那输出是空的

办法是:写到内存计算一下, (起码32位以内的数可以)
如  前几楼,读文件到内存 那个贴  计算文件的起始位置

回复

使用道具 举报

1707#
 楼主| 发表于 2021-6-20 10:40:26 | 只看该作者
关于ADDR_RET_STR的使用问题。

1. 当变量是字符串时:(或者说变量是一个指针)
使用BCD编码,如 a 表示为 36 31 或者 0011 0110 0011 0001
例如:
char uefi_ver[]={Windows 10};
set uefi_ver=Windows 10;
set uefi_ver=0x11223344;
执行
ADDR_RET_STR = uefi_ver;

2 当变量是数值时:
使用16进制编码,如 a 表示为 61 或者 0110 0001
例如:
int uefi_ver=0x11223344;
执行
sprintf (ADDR_RET_STR,"0x%lx",uefi_ver);
sprintf (ADDR_RET_STR,"0x%lx",0x11223344);
回复

使用道具 举报

1708#
发表于 2021-6-20 19:57:19 | 只看该作者
2011whp 发表于 2021-6-19 18:03
现在主流是: ipxe 网启PE  ,然后 ,利用  PE下的 CMD  自动化工具  自动安装
http://bbs.wuyou.net/f ...

我自己编译了一套UEFI shell来用的。
目前试的几个设备,支持UEFI的都能跑起来。
g4e直接网起会随机卡死,所以我才从UEFI shell来启动的。网络启动直接走PXE加载IPXE,然后sanhook挂一个iso来读文件倒是可行。这样理论上能解决文件来源的问题。

点评

怎么获取到 Ipxe 留下的信息呢, g4e内 有tftp的驱动 不过现在 没有 (pd)盘, 具体不太清楚  详情 回复 发表于 2021-6-21 14:00
回复

使用道具 举报

1709#
发表于 2021-6-21 14:00:40 | 只看该作者
本帖最后由 2011whp 于 2021-6-21 14:07 编辑
fmwqsn 发表于 2021-6-20 19:57
我自己编译了一套UEFI shell来用的。
目前试的几个设备,支持UEFI的都能跑起来。
g4e直接网起会随机卡 ...

怎么获取到 Ipxe 留下的信息呢, g4e内 有tftp的驱动

不过现在  没有 (pd)盘,  具体不太清楚


如果能得到,next-servce,   能够 tftp 请求文件,  估计 大神 们  又能折腾 一下


回复

使用道具 举报

1710#
发表于 2021-6-21 17:16:33 | 只看该作者
台式机实机,SSD 120GB MBR盘为 (hd0),HDD 4TB GPT盘为 (hd1),两个硬盘均在最后分有 EFI 分区和一样的引导文件;G4E 的 BOOTX64.EFI 和 MENU.LST 均存放在 EFI 分区 /EFI/GRUB 目录下,/EFI/BOOT/BOOTX64.EFI 为 Windows 启动文件;硬盘和 BIOS 中的 UEFI 启动顺序均是 Windows Boot Manager、G4E、GRUB2。一直以来,这样的环境下在 G4E 中 chainloader (hd0) 都是失败(输入这个命令回车后只有一横的光标没下文),但是 map 出来的虚拟光驱之类,可以 chainloader (0xff) 启动成功。今天心血来潮,分别试了下 map --mem winpe.iso (0xff) 和  map --mem win10.vhd (hd) 后,再  chainloader (hd0) 或  chainloader (hd1) 就正常,但是 输入 boot 之后,引导的却是 map 出来的 ISO 和 VHD 里面的引导文件——换句话说, chainloader (hd0)  或  chainloader (hd1) 的结果是  chainloader (hd-1) 和  chainloader (0xff)。

说起来很乱,不知道大家能不能看明白?


回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-4 14:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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