无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
发表于 2021-4-14 11:41:52 | 显示全部楼层
回复

使用道具 举报

发表于 2021-4-14 19:48:37 | 显示全部楼层
菜鸟弱弱的问一句,gpt分区,隐藏分区命令不能用。有没有别的命令代替。
MBR是可以用的。
回复

使用道具 举报

 楼主| 发表于 2021-4-15 08:06:57 | 显示全部楼层
字库的问题有眉目了吗?

hhh333,你提供的精简字库,不包含英文字符及数字字符。
我想预先加载一个16*16是小字库,还没有实现。
回复

使用道具 举报

 楼主| 发表于 2021-4-15 08:24:06 | 显示全部楼层
附件已上传,大家测试看下

liuzhaoyzz,你提供的字库,包含英文字符。

16*16的字库,英文字符是全角的,也可以说是宽字符,点阵字形是16*16,占2字节。
而一般从linux网站下载的字库,英文字符是半角的,也可以说是窄字符,点阵字形是8*16,占1字节。
g4d默认英文字符是窄字符,所以不能显示。
这个问题已经解决,现在可以显示了。

40*40的字库,英文字符是半角的,也可以说是窄字符,点阵字形是20*40,占1字节。
所以他可以正常显示。
但是我这里有个奇怪的现象,英文小写字符可以显示a、b,c以后字符就不能显示了。他的英文字符是在字库尾部,这个问题正在排查。

点评

大神辛苦了!等待您的更新。 您的解释,我看得似懂非懂的,非专业人士,见笑了。 g4e能搞定就好。  详情 回复 发表于 2021-4-15 12:39
回复

使用道具 举报

发表于 2021-4-15 10:17:15 | 显示全部楼层
期待更新啊,img还是无法加载
回复

使用道具 举报

发表于 2021-4-15 12:02:36 | 显示全部楼层
好东西,支持
回复

使用道具 举报

发表于 2021-4-15 12:39:20 | 显示全部楼层
2011yaya2007777 发表于 2021-4-15 08:24
liuzhaoyzz,你提供的字库,包含英文字符。

16*16的字库,英文字符是全角的,也可以说是宽字符,点阵 ...

        大神辛苦了!等待您的更新。

您的解释,我看得似懂非懂的,非专业人士,见笑了。

g4e能搞定就好。
回复

使用道具 举报

发表于 2021-4-15 14:29:41 | 显示全部楼层
EFI下abcd字模都没办法取了吗,应该是有办法的,可能还没发现
回复

使用道具 举报

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

HII Font Protocol 应该可以吧。如果 yaya 没空研究的话,等我哪天有空试试。
1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png

回复

使用道具 举报

 楼主| 发表于 2021-4-16 16:22:04 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-4-16 16:51 编辑

wintoflash 学识渊博,我还不知道有这个协议。使用这个协议实现的话,可能更简单。
现在我是内置了mini字库,包含0x20-0x7f、0x2191及0x2193(上下箭头),压缩后820字节。
我抽空学习写学习。

点评

你是怎么内置的,直接 include 吗? 我感觉可以用 grub-mkimage 生成 bootx64.efi 的时候,把内置菜单和字库插进去,发布的时候给用户提供 kernel.img,这样就能让用户自定义内置菜单了。 grub-mkimage64 -d $GRUB  详情 回复 发表于 2021-4-16 21:59
回复

使用道具 举报

发表于 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. }
复制代码

回复

使用道具 举报

 楼主| 发表于 2021-4-17 08:14:23 | 显示全部楼层
你是怎么内置的,直接 include 吗?

我是使用最笨的办法,将字库文件压缩后,作为字符串定义在c文件里,然后加载他。

你提供的尾随文件方法,我学习研究一下。谢谢。
回复

使用道具 举报

 楼主| 发表于 2021-4-17 16:58:04 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-4-18 08:59 编辑

修复了解压缩gz文件的错误,修复了图像显示错误。其实是读偏移的问题,引出了一些奇奇怪怪的问题。

内置了0x20-0x7F英文、数字、标点符号字符,以及0x2191及0x2193上下箭头符号。
这样切换到图像模式,可以显示英文字符,不至于黑屏。
可以弥补小字库缺少英文、数字、标点符号。
现在可以使用0x20-0x7F宽字符。

下一步研究wintoflash提供的尾续文件方法。


点评

用2021-4-17日的g4e,搭配标准字库unifont.hex.gz(yaya在90楼分享的),显示正常。graphicsmode -1 800 #foreground FFFFFF #background 0000AD find --set-root /EFI/grub/unifont.hex.gz font /EFI/grub/unif  详情 回复 发表于 2021-4-17 20:25
回复

使用道具 举报

发表于 2021-4-17 20:25:10 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-17 20:30 编辑
2011yaya2007777 发表于 2021-4-17 16:58
修复了解压缩gz文件的错误,修复了图像显示错误。其实是读偏移的问题,引出了一些奇奇怪怪的问题。

内置 ...

用2021-4-17日的g4e,搭配标准字库unifont.hex.gz(yaya在90楼分享的),显示正常。

graphicsmode -1 800
#foreground FFFFFF
#background 0000AD
find --set-root /EFI/grub/unifont.hex.gz
font /EFI/grub/unifont.hex.gz
#font --font-high=40 /EFI/grub/menu40.hex.gz
#ctrl+alt+f12=ScreenShot,save in FAT32 partition
load -n /EFI/grub/CrScreenshotDxe.efi
#color white/blue blue/yellow light-red/blue 10
#color normal=0x07 highlight=0xF1 helptext=0x07 heading=0x02 standard=0x07 border=0x09
color normal=0x07 highlight=0xE1 helptext=0x07 heading=0x02
timeout 3
default 0
IMG_20210417_201756.jpg


搭配fuldho的程序制作的字库,16×16的,1355楼分享的有,字体显得很宽。
font --font-high=16 /EFI/grub/menu40.hex.gz
不知道这是正常的吗?fuldho的程序制作的字库应该是宽字符,官方的字库似乎是窄字库。
IMG_20210417_202005.jpg

等我用手机上传个截图。
load -n /EFI/grub/CrScreenshotDxe.efi截图,怎么感觉有时候不是所见即所得的,就是说截图好像不对,我找了FAT32分区里面的所有图像核对了。




回复

使用道具 举报

 楼主| 发表于 2021-4-17 20:48:29 来自手机 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2021-4-17 20:53 编辑

你给我提供的16*16字体,没有第二张图这么宽呀。是不是增加了字间距?我使用过作者的作品,没见过这个问题。

点评

我搞不懂是怎么回事,fuldho的字库,24~40点阵字库都是正常的,就是16点阵字库有问题。 g4e2121-4-17日之前,用fuldho 16字体英文完全不能显示; g4e2121-4-17日版本,用fuldho 16字体英文看起来比较宽。 字库都  详情 回复 发表于 2021-4-17 21:44
回复

使用道具 举报

发表于 2021-4-17 21:44:10 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-17 21:51 编辑
2011yaya2007777 发表于 2021-4-17 20:48
你给我提供的16*16字体,没有第二张图这么宽呀。是不是增加了字间距?我使用过作者的作品,没见过这个问题。 ...

我搞不懂是怎么回事,fuldho的字库,24~40点阵字库好像是正常的(我没有超高清显示器,看不出来倒底是否正常),就是16点阵字库有问题。
g4e2121-4-17日之前,用fuldho 16字体英文完全不能显示;
g4e2121-4-17日版本,用fuldho 16字体英文看起来比较宽。
字库都是他的程序生成的,我不知道在哪里调整字符间距。
也不是什么大事情,直接用官方的unifont.hex.gz没有任何问题。可能就是字库宽字符、窄字符的区别吧。


回复

使用道具 举报

 楼主| 发表于 2021-4-17 21:53:30 来自手机 | 显示全部楼层
是1355#的16*16字库吧,我明天再看看。感觉怪怪的。
回复

使用道具 举报

 楼主| 发表于 2021-4-18 08:58:12 | 显示全部楼层
fuldho的字库,24~40点阵

不好意思,昨天上传前优化了一下,引出了问题。已经修正,请重新下载。

BOOTX64.rar

137.99 KB, 下载次数: 27, 下载积分: 无忧币 -2

点评

妥了,UDF和标准格式都正常显示,辛苦了。32位呢?  详情 回复 发表于 2021-4-18 18:19
很棒的改进! 2021-4-18日的版本,如果不加载任何字库,英文也可以显示。 如果加载官方的font /EFI/grub/unifont.hex.gz,英文、中文显示正常。 如果加载fuldho的font --font-high=16 /EFI/grub/unifont.hex16.gz  详情 回复 发表于 2021-4-18 09:41
回复

使用道具 举报

发表于 2021-4-18 09:41:49 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-18 09:44 编辑
2011yaya2007777 发表于 2021-4-18 08:58
不好意思,昨天上传前优化了一下,引出了问题。已经修正,请重新下载。

很棒的改进!
2021-4-18日的版本,如果不加载任何字库,英文也可以显示。
如果加载官方的font /EFI/grub/unifont.hex.gz,英文、中文显示正常。
IMG_20210418_093803.jpg

如果加载fuldho的font --font-high=16 /EFI/grub/unifont.hex16.gz,英文、中文显示正常。

IMG_20210418_093557.jpg

我上传个截图,感觉宋体字体边角有锯齿,不如官方的unifont.hex16.gz显示效果好。



回复

使用道具 举报

发表于 2021-4-18 10:45:10 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2021-4-18 18:19:41 | 显示全部楼层
2011yaya2007777 发表于 2021-4-18 08:58
不好意思,昨天上传前优化了一下,引出了问题。已经修正,请重新下载。

妥了,UDF和标准格式都正常显示,辛苦了。32位呢?可以发布更新了
回复

使用道具 举报

发表于 2021-4-18 23:45:38 | 显示全部楼层

谢谢分享
回复

使用道具 举报

发表于 2021-4-19 01:37:26 | 显示全部楼层
经典收藏
回复

使用道具 举报

发表于 2021-4-21 10:10:11 | 显示全部楼层
请问楼主大致什么时候发布更新?20210210版bug应该修正得差不多了吧
回复

使用道具 举报

发表于 2021-4-21 10:12:46 | 显示全部楼层
本帖最后由 hhh333 于 2021-4-21 10:14 编辑
2011yaya2007777 发表于 2020-10-29 15:10
这就是 64 位的。

现在就是通过 UEFI 接口支持 tftp。我的虚拟机 UEFI 不支持 http、ipv4、ipv6 协议 ...

有ipxe差不多了,网启目前应该是最强的,g4e没必要现在支持EFI下的HTTP等网启,以后再慢慢搞也可以

点评

ipxe不够骚,不能网启安装微软原版iso(要外置boot.wim)  详情 回复 发表于 2021-4-21 13:23
回复

使用道具 举报

发表于 2021-4-21 13:23:57 | 显示全部楼层
hhh333 发表于 2021-4-21 10:12
有ipxe差不多了,网启目前应该是最强的,g4e没必要现在支持EFI下的HTTP等网启,以后再慢慢搞也可以

ipxe不够骚,不能网启安装微软原版iso(要外置boot.wim)
回复

使用道具 举报

发表于 2021-4-21 13:35:10 | 显示全部楼层
这是一个庞大的工程
回复

使用道具 举报

发表于 2021-4-21 18:40:48 | 显示全部楼层
支持值得点赞
回复

使用道具 举报

发表于 2021-4-21 19:19:59 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-27 14:16 编辑

@yaya @wintoflash @sunsea
各位大神,有没有兴趣修改g4e、grub2,让firadisk驱动也可以在UEFI下面像svbus一样起作用?
我试了下,firadisk在BIOS下面搭配g4d启动没问题,搭配g4e/grub2-UEFI启动的话7B蓝屏。

我提供个firadisk安装批处理。驱动签名来自朱玛,原作者Karyonix的驱动签名好像有点问题。

一个驱动可能会有bug,换另一个驱动可能就没有问题。
如果大神们没有兴趣就算了。


firadisk-driver-0.0.1.30-signed.rar

2.27 MB, 下载次数: 26, 下载积分: 无忧币 -2

回复

使用道具 举报

 楼主| 发表于 2021-4-21 19:43:16 来自手机 | 显示全部楼层
这个是firadisk源码吗?这个软件还有人更新维护吗?需要做的事情,要么g4e适应它,要么它适应g4e。

点评

源代码这个帖子里面有,http://bbs.wuyou.net/forum.php?mod=viewthread&tid=375992&highlight=firadisk 我分享的是编译后的驱动程序。 原作者Kyraonix好像很久没有更新了。  详情 回复 发表于 2021-4-21 21:04
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-19 08:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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