无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
121#
发表于 2021-1-22 16:57:24 | 显示全部楼层
2011yaya2007777 发表于 2021-1-22 16:27
我提交补丁以后等了一会,见没有编译。
我是想下载官网编译的版本进行测试,成功后再放出其他补丁。
我 ...

更新头文件之后没问题了。
你将来还会改外部命令的格式吗?如果不改了的话,我就把外部命令头文件传到 grubutils 源码仓库里面。
回复

使用道具 举报

122#
发表于 2021-1-22 17:08:14 | 显示全部楼层
2011yaya2007777 发表于 2021-1-22 17:01
wintoflash 可以发一个你编译的版本吗?

如果64位环境编译成功的话,外部命令的格式就不会更改了。

g4eext-src.7z (18.57 KB, 下载次数: 12)
g4eext-2021-01-22.zip (2.79 KB, 下载次数: 11)
回复

使用道具 举报

123#
发表于 2021-1-22 17:19:00 | 显示全部楼层
2011yaya2007777 发表于 2021-1-22 17:13
我是想要一个64位环境编译的 grub4dos for uefi,即 bootx64.efi

grub4dos-for_UEFI-2021-01-22.7z (241.25 KB, 下载次数: 14)
回复

使用道具 举报

124#
发表于 2021-1-22 17:34:24 | 显示全部楼层
2011yaya2007777 发表于 2021-1-22 17:24
我修改了两个外部命令。

WENV 编译报错。
gcc -Wl,--build-id=none -m64 -mno-sse -nostdlib -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE -Iinclude/ wenv.c -o wenv.o
wenv.c: In function ‘main’:
wenv.c:173:37: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define VAR ((char (*)[MAX_VAR_LEN])BASE_ADDR)
                                     ^
wenv.c:195:43: note: in definition of macro ‘strcmp_ex’
#define strcmp_ex(arg,string) grub_memcmp(arg,string,0)
                                           ^
wenv.c:304:21: note: in expansion of macro ‘VAR’
  if( 0 != strcmp_ex(VAR[_WENV_], "?_WENV") )// 检查默认变量
                     ^
wenv.c:173:37: note: each undeclared identifier is reported only once for each function it appears in
#define VAR ((char (*)[MAX_VAR_LEN])BASE_ADDR)
                                     ^
wenv.c:195:43: note: in definition of macro ‘strcmp_ex’
#define strcmp_ex(arg,string) grub_memcmp(arg,string,0)
                                           ^
wenv.c:304:21: note: in expansion of macro ‘VAR’
  if( 0 != strcmp_ex(VAR[_WENV_], "?_WENV") )// 检查默认变量
                     ^
wenv.c: In function ‘check_Brackets’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:321:18: note: in expansion of macro ‘QUOTE_CHAR’
   else if (*p == QUOTE_CHAR)
                  ^
wenv.c: In function ‘skip_next’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:359:15: note: in expansion of macro ‘QUOTE_CHAR’
   if (*arg == QUOTE_CHAR)
               ^
wenv.c: In function ‘call_func’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:623:10: note: in expansion of macro ‘ENVI’
  sprintf(ENVI[_WENV_], "0x%X", ret);
          ^
wenv.c: In function ‘reset_func’:
wenv.c:173:37: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define VAR ((char (*)[MAX_VAR_LEN])BASE_ADDR)
                                     ^
wenv.c:650:33: note: in expansion of macro ‘VAR’
   for(j=0; j < MAX_USER_VARS && VAR[j][0] != '\0'; j++)
                                 ^
wenv.c: In function ‘check_func’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:682:14: note: in expansion of macro ‘QUOTE_CHAR’
   if (*p2 == QUOTE_CHAR)
              ^
wenv.c: In function ‘trim_p’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:837:12: note: in expansion of macro ‘QUOTE_CHAR’
  if (*p != QUOTE_CHAR || **p_str != QUOTE_CHAR)
            ^
wenv.c: In function ‘replace_str’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:1379:45: note: in expansion of macro ‘QUOTE_CHAR’
  if ((flags & REPLACE_TRIM_QUOTE) && *in == QUOTE_CHAR)
                                             ^
In file included from wenv.c:161:0:
wenv.c: In function ‘show_config’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
include/grub4dos.h:234:35: note: in definition of macro ‘printf’
#define printf(...) sprintf(NULL, __VA_ARGS__)
                                   ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:2041:30: note: in expansion of macro ‘QUOTE_CHAR’
   printf("QUOTE_CHAR:\t%c\n",QUOTE_CHAR);
                              ^
wenv.c: In function ‘config_func’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:178:40: note: in expansion of macro ‘ENVI’
#define QUOTE_CHAR (*(unsigned long *)(ENVI[_WENV_]+0x30))
                                        ^
wenv.c:2054:4: note: in expansion of macro ‘QUOTE_CHAR’
    QUOTE_CHAR = *arg;
    ^
wenv.c: In function ‘exec_func’:
wenv.c:175:39: error: ‘BASE_ADDR’ undeclared (first use in this function)
#define ENVI ((char (*)[MAX_ENV_LEN])(BASE_ADDR + MAX_VARS * MAX_VAR_LEN))
                                       ^
wenv.c:2161:10: note: in expansion of macro ‘ENVI’
  sprintf(ENVI[_WENV_], "0x%X", ret);
          ^
Makefile:21: recipe for target 'wenv.o' failed
make: *** [wenv.o] Error 1

回复

使用道具 举报

125#
发表于 2021-1-22 19:03:56 | 显示全部楼层
2011yaya2007777 发表于 2021-1-22 18:29
不好意思,搞乱了,重新上传。

wenv 测试 ok。
fat 测试死机。
  1. fat dir /
复制代码



我已经把wenv和我之前写的几个外部命令的源码传到 https://github.com/chenall/grubutils 了。
执行以下命令即可编译:
  1. cd g4eext
  2. make
复制代码


测试 gcc4.8, gcc-5, gcc-8 均可正常编译,且正常运行。
回复

使用道具 举报

126#
发表于 2021-1-23 10:28:09 | 显示全部楼层
2011yaya2007777 发表于 2021-1-23 09:46
外部命令 fat 比较难搞定。我这里测试 fat dir / 不是死机,而是显示帮助。
使用 fat 内部给出的

fat外部命令用的是老版本的 FatFs。
新版本的还支持 exFAT。
我以前把它移植到了 GRUB2:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=418985
https://github.com/a1ive/grub/tree/master/grub-core/lib/fatfs


回复

使用道具 举报

127#
发表于 2021-1-28 09:08:24 | 显示全部楼层
2011whp 发表于 2021-1-27 19:27
试了  boot.wim   

find --set-root
1.  vbox  启动   8K屏
2.  实机   最大屏

这个已经在 grub2 ntboot 的帖子里面讨论过了,不同人有不同的想法。
vhd  没素材,只有内部是PE的vhd  
因为 是bootmgfw 前置技术,没winload 肯定不行

这个当然是用来启动安装了 Windows NT6+ 的 VHD 和 WIM,与一般所说的磁盘仿真启动 VHD 无关。
回复

使用道具 举报

128#
发表于 2021-1-29 19:24:55 | 显示全部楼层
2011whp 发表于 2021-1-29 18:20
折腾下 http://bbs.wuyou.net/forum.php?m ... 7170&fromuid=413782

有个明确的结果,告知 wintoflash  ...

就是wimboot。grub2的ntboot也是基于wimboot,都是一回事。
只不过我想把它弄得更 "通用",让更多的引导器也能用它,所以要通过 uuid 确定分区。如果用 (hdx,y) 表示分区,那 grub4dos 和 grub2 下表示方法不一样,会造成混乱。

点评

2021-1-30版 http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=423423&pid=4229023&fromuid=413782mod=redirect&goto=findpost&ptid=423423&pid=4229023&fromuid=413782 可以启动 本机分区上的  详情 回复 发表于 2021-1-30 15:11
回复

使用道具 举报

129#
发表于 2021-1-30 18:27:34 | 显示全部楼层
测试: SLIC 外部命令
slic.7z (1.58 KB, 下载次数: 20)
slic /xxx/slic.bin

由于我没有相关系统,而且 SLICToolkit 似乎用不了,所以没有办法测试。
警告:此命令会修改 ACPI 表,可能会对硬件或软件造成损坏,后果自负。

点评

G4D里的这个命令,不是只修改内存的相关变量虚拟的吗,怎么会对硬件或者软件造成损坏?  详情 回复 发表于 2021-1-31 10:22
回复

使用道具 举报

130#
发表于 2021-1-31 11:15:06 | 显示全部楼层
xianglang 发表于 2021-1-31 10:22
G4D里的这个命令,不是只修改内存的相关变量虚拟的吗,怎么会对硬件或者软件造成损坏?

SLIC就是ACPI里面的一个表。
操作系统会根据 ACPI 管理电源,配置硬件。
如果我的程序里面有bug,或者加载了有问题的SLIC,操作系统如果处理不当,就有可能毁坏硬件、软件。
回复

使用道具 举报

131#
发表于 2021-1-31 15:25:08 | 显示全部楼层
回复

使用道具 举报

132#
发表于 2021-1-31 16:13:47 | 显示全部楼层
2011whp 发表于 2021-1-31 15:25
能用  建了个目录
/wb/fat mkdir  /new

是不是编码不对。要 UTF-8 编码。
回复

使用道具 举报

133#
发表于 2021-2-5 19:54:21 | 显示全部楼层
再发个外部命令:fwsetup
fwsetup.zip (716 Bytes, 下载次数: 27)
执行之后,启动到 UEFI 固件设置界面。

回复

使用道具 举报

134#
发表于 2021-2-9 16:24:58 | 显示全部楼层
2011whp 发表于 2021-2-9 12:28
挑毛病:halt关机问题

一、vbox虚拟机:

@xianglang @2011whp

试一下用 acpi 关机的外部命令: acpihalt.zip (2.24 KB, 下载次数: 8)
回复

使用道具 举报

135#
发表于 2021-2-9 19:38:57 | 显示全部楼层
2011whp 发表于 2021-2-9 19:16
以前 排查 bootmgfw.efi 问题的实践  说明,g4e 确实丢掉了 一部分 grub2 对主板的 抽象 部分

说 ...

你先执行一下 ver 这个外部命令,看看 uefi 版本,顺便确保外部命令能正常运行,再执行 acpihalt debug
acpihalt.zip (2.67 KB, 下载次数: 5)

回复

使用道具 举报

136#
发表于 2021-2-9 20:08:37 | 显示全部楼层
2011whp 发表于 2021-2-9 20:01
外部命令  死机 (ver 和 fat)

那就和这个没有关系了,请yaya解决吧。
回复

使用道具 举报

137#
发表于 2021-2-10 10:43:00 | 显示全部楼层
2011whp 发表于 2021-2-9 21:41
@2011yaya2007777
@wintoflash

那还是别弄成外部命令。
grub4dos-for_UEFI-2021-02-10.7z (248.44 KB, 下载次数: 27)
现在 halt 命令优先使用 ACPI 功能关机。
回复

使用道具 举报

138#
发表于 2021-2-10 14:51:27 | 显示全部楼层
本帖最后由 wintoflash 于 2021-2-10 15:00 编辑
2011yaya2007777 发表于 2021-2-10 11:55
现在外部命令随新版本发布,可能是 chenall 设置的。有劳 wintoflash 帮忙,把外部命令更新一下,因为修改 ...

外部命令头文件已经更新过了啊,就是2021-1-31更新的。而且我这边编译的外部命令是可以正常执行的。随grub4dos附带的外部命令确实不能执行。
g4eext-2021-02-10.zip (26.11 KB, 下载次数: 19)
回复

使用道具 举报

139#
发表于 2021-2-10 18:40:28 | 显示全部楼层
2011yaya2007777 发表于 2021-2-10 15:49
哪就奇怪了。随官网发布的外部命令,是你编译提供上去的,还是官网自动编译的?

自动编译的。不过现在自动编译的环境是tinycore,你调试以下看看?
回复

使用道具 举报

140#
发表于 2021-4-16 14:26:49 | 显示全部楼层
是由于使用 int 10 从BIOS内部复制了英文字库。而现在的UEFI模式,没有相关指令可以复制。

HII Font Protocol 应该可以吧。如果 yaya 没空研究的话,等我哪天有空试试。









回复

使用道具 举报

141#
发表于 2021-4-16 21:59:48 | 显示全部楼层
本帖最后由 wintoflash 于 2021-4-16 22:01 编辑
2011yaya2007777 发表于 2021-4-16 16:22
wintoflash 学识渊博,我还不知道有这个协议。使用这个协议实现的话,可能更简单。
现在我是内置了mini字 ...

你是怎么内置的,直接 include 吗?
我感觉可以用 grub-mkimage 生成 bootx64.efi 的时候,把内置菜单和字库插进去,发布的时候给用户提供 kernel.img,这样就能让用户自定义内置菜单了。
grub-mkimage64 -d $GRUB4DOS_TEMP -p /GRUB2 -o BOOTX64.EFI -O x86_64-efi -c menu.lst

GRUB2 里面是这样实现读取内置菜单的:

  1. enum
  2. {
  3.   OBJ_TYPE_ELF,
  4.   OBJ_TYPE_MEMDISK,
  5.   OBJ_TYPE_CONFIG,
  6.   OBJ_TYPE_PREFIX,
  7.   OBJ_TYPE_PUBKEY,
  8.   OBJ_TYPE_DTB
  9. };

  10. /* The module header.  */
  11. struct grub_module_header
  12. {
  13.   /* The type of object.  */
  14.   grub_uint32_t type;
  15.   /* The size of object (including this header).  */
  16.   grub_uint32_t size;
  17. };

  18. /* "gmim" (GRUB Module Info Magic).  */
  19. #define GRUB_MODULE_MAGIC 0x676d696d

  20. struct grub_module_info32
  21. {
  22.   /* Magic number so we know we have modules present.  */
  23.   grub_uint32_t magic;
  24.   /* The offset of the modules.  */
  25.   grub_uint32_t offset;
  26.   /* The size of all modules plus this header.  */
  27.   grub_uint32_t size;
  28. };

  29. struct grub_module_info64
  30. {
  31.   /* Magic number so we know we have modules present.  */
  32.   grub_uint32_t magic;
  33.   grub_uint32_t padding;
  34.   /* The offset of the modules.  */
  35.   grub_uint64_t offset;
  36.   /* The size of all modules plus this header.  */
  37.   grub_uint64_t size;
  38. };

  39. #if GRUB_TARGET_SIZEOF_VOID_P == 8
  40. #define grub_module_info grub_module_info64
  41. #else
  42. #define grub_module_info grub_module_info32
  43. #endif

  44. #define FOR_MODULES(var)  for (\
  45.   var = (grub_modbase && ((((struct grub_module_info *) grub_modbase)->magic) == GRUB_MODULE_MAGIC)) ? (struct grub_module_header *) \
  46.     (grub_modbase + (((struct grub_module_info *) grub_modbase)->offset)) : 0;\
  47.   var && (grub_addr_t) var \
  48.     < (grub_modbase + (((struct grub_module_info *) grub_modbase)->size));    \
  49.   var = (struct grub_module_header *)                                        \
  50.     (((grub_uint32_t *) var) + ((((struct grub_module_header *) var)->size + sizeof (grub_addr_t) - 1) / sizeof (grub_addr_t)) * (sizeof (grub_addr_t) / sizeof (grub_uint32_t))))

  51. /* Search the mods section from the PE32/PE32+ image. This code uses
  52.    a PE32 header, but should work with PE32+ as well.  */
  53. grub_addr_t
  54. grub_efi_modules_addr (void)
  55. {
  56.   grub_efi_loaded_image_t *image;
  57.   struct grub_pe32_header *header;
  58.   struct grub_pe32_coff_header *coff_header;
  59.   struct grub_pe32_section_table *sections;
  60.   struct grub_pe32_section_table *section;
  61.   struct grub_module_info *info;
  62.   grub_uint16_t i;

  63.   image = grub_efi_get_loaded_image (grub_efi_image_handle);
  64.   if (! image)
  65.     return 0;

  66.   header = image->image_base;
  67.   coff_header = &(header->coff_header);
  68.   sections
  69.     = (struct grub_pe32_section_table *) ((char *) coff_header
  70.                                           + sizeof (*coff_header)
  71.                                           + coff_header->optional_header_size);

  72.   for (i = 0, section = sections;
  73.        i < coff_header->num_sections;
  74.        i++, section++)
  75.     {
  76.       if (grub_strcmp (section->name, "mods") == 0)
  77.         break;
  78.     }

  79.   if (i == coff_header->num_sections)
  80.     {
  81.       grub_dprintf("sections", "section %d is last section; invalid.\n", i);
  82.       return 0;
  83.     }

  84.   info = (struct grub_module_info *) ((char *) image->image_base
  85.                                       + section->virtual_address);
  86.   if (section->name[0] != '.' && info->magic != GRUB_MODULE_MAGIC)
  87.     {
  88.       grub_dprintf("sections",
  89.                    "section %d has bad magic %08x, should be %08x\n",
  90.                    i, info->magic, GRUB_MODULE_MAGIC);
  91.       return 0;
  92.     }

  93.   grub_dprintf("sections", "returning section info for section %d: "%s"\n",
  94.                i, section->name);
  95.   return (grub_addr_t) info;
  96. }

  97. grub_addr_t grub_modbase = grub_efi_modules_addr ();

  98. static char *load_config;

  99. struct grub_module_header *header;
  100. FOR_MODULES (header)
  101. {
  102.   /* Not an embedded config, skip.  */
  103.   if (header->type != OBJ_TYPE_CONFIG)
  104.     continue;

  105.   load_config = grub_malloc (header->size - sizeof (struct grub_module_header) + 1);
  106.   if (!load_config)
  107.   {
  108.     grub_print_error ();
  109.     break;
  110.   }
  111.   grub_memcpy (load_config, (char *) header + sizeof (struct grub_module_header),
  112.                         header->size - sizeof (struct grub_module_header));
  113.   load_config[header->size - sizeof (struct grub_module_header)] = 0;
  114.   break;
  115. }
复制代码

回复

使用道具 举报

142#
发表于 2021-4-22 13:38:45 | 显示全部楼层
liuzhaoyzz 发表于 2021-4-21 21:04
源代码这个帖子里面有,http://bbs.wuyou.net/forum.php?mod=viewthread&tid=375992&highlight= ...

firadisk太老了吧,能在win10上正常工作吗?
我以前看过 firadisk 代码,它好像不像 SVBus 那样会搜索什么 GRUB4DOS 信息。改 firadisk 让它来适配 grub 更合适。
另外,和 SVBus 相比,它有什么优势?没有任何优势的话那就没有意义。
回复

使用道具 举报

143#
发表于 2021-4-22 14:18:26 | 显示全部楼层
liuzhaoyzz 发表于 2021-4-22 14:06
在WIN10X64工作正常啊,如果说改firadisk最合适的话,那最好还是给原作者Karyonix发个帖子合适, ...

你跟他说,让他看svbus的代码就行了。
或者让他自己想个uefi下能与bootloader传递信息的方法,就行了。
通过uefi环境变量也好,通过acpi/smbios也行。只要他写出来了,这边就能对接。
回复

使用道具 举报

144#
发表于 2021-4-24 12:53:50 | 显示全部楼层
2011yaya2007777 发表于 2021-4-24 10:57
在wintoflash的帮助下,实现了尾续菜单的支持。把 kernel.img 与 grub-mkimage.exe 放在同一目录。
    gr ...

6666
实现了尾续菜单的支持。把 kernel.img 与 grub-mkimage.exe 放在同一目录。
    grub-mkimage.exe -d 目录 -p /efi/grub -o BOOTX64.EFI -O x86_64-efi -c 尾续菜单
    grub-mkimage.exe -d 目录 -p /efi/grub -o BOOTIA32.EFI -O i386-efi -c 尾续菜单

grub-mkimage 还可以通过 -m 参数嵌入memdisk,grub4efi 是否准备添加类似的功能,比如嵌入背景图片/字库?
回复

使用道具 举报

145#
发表于 2021-4-26 18:32:22 | 显示全部楼层
本帖最后由 wintoflash 于 2021-4-26 18:55 编辑

新版本 (2021-04-24) 外部命令又不能用了。
是不是头文件需要更新?还是chenall的编译环境没弄好?
-----------------------------------------
已确认,是自动编译的外部命令有问题。
回复

使用道具 举报

146#
发表于 2021-4-26 19:04:26 | 显示全部楼层
hhh333 发表于 2021-4-26 18:18
用g4e调用shellx64.efi,想shellx64.efi直接执行startup.nsh而不用等待5秒或按任意键
chainloader /EFI/ ...

chainloader /path/to/shell.efi -delay 0 -nomap
回复

使用道具 举报

147#
发表于 2021-4-26 19:34:26 | 显示全部楼层

我不知道你是怎么试的。反正我这里可以。
回复

使用道具 举报

148#
发表于 2021-4-26 20:50:37 | 显示全部楼层
本帖最后由 wintoflash 于 2021-4-26 20:51 编辑

你用的shell版本太低了。
Shell.zip (303.6 KB, 下载次数: 26)
回复

使用道具 举报

149#
发表于 2021-4-26 22:31:41 | 显示全部楼层
hhh333 发表于 2021-4-26 22:16
同样格式grub2中似乎不管用

我这可以。哪个版本的grub2都可以。
回复

使用道具 举报

150#
发表于 2021-4-26 22:32:00 | 显示全部楼层
hhh333 发表于 2021-4-26 21:26
哦,32位有不有最新的

你自己想办法编译吧
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 13:36

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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