无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 10617|回复: 27

[求助] GRUB2 下如何实现BIOS磁盘磁盘访真?

  [复制链接]
发表于 2021-3-2 17:01:30 | 显示全部楼层 |阅读模式
本帖最后由 r18nix 于 2021-3-2 17:03 编辑

参考文档:
1. GRUB2 How To (4): memdisk and loopback device
    http://lukeluo.blogspot.com/2013 ... k-and-loopback.html
2. 基于svbus驱动+grub4dos或grub2制作的UEFI-RAMOS和BIOS-RAMOS教程
    http://wuyou.net/forum.php?mod=viewthread&tid=423275

我的想法是在原grub2中BIOS与uefi下同时实现启动svbus 文件vhd(非ramos)
看教程文档2中grub2下已可以UEFI启动 svbus. 但我没有找到可用的grub2 下BIOS下的启动svbus vhd 的方法

问题:
1. 如果修改grub2 添加bios的磁盘仿真(映射), 思路怎样比较好呢? 怎样设计比较好? 基于loopback命令是否可行?
wintoflash 等大神能否给点提示或帮助, 本人小白, 还不怎么了解grub2内部原理
发表于 2021-3-2 19:15:15 | 显示全部楼层
本帖最后由 wintoflash 于 2021-3-2 19:21 编辑
启动svbus 文件vhd(非ramos)

如果文件不在内存,那必须在磁盘上是连续存放的。
如果修改grub2 添加bios的磁盘仿真(映射), 思路怎样比较好呢? 怎样设计比较好? 基于loopback命令是否可行?

先问一下你会不会汇编和 C 语言?如果不会的话那就别浪费时间研究这个了,因为 BIOS 已经快要死了。
回复

使用道具 举报

 楼主| 发表于 2021-3-2 19:37:19 | 显示全部楼层
wintoflash 发表于 2021-3-2 19:15
如果文件不在内存,那必须在磁盘上是连续存放的。

先问一下你会不会汇编和 C 语言?如果不会的话那就 ...

几年前看过一段时间汇编, 花点时间应该能看懂. 大神有没有较好的思路提供一下呢?
回复

使用道具 举报

发表于 2021-3-2 19:49:23 | 显示全部楼层
本帖最后由 wintoflash 于 2021-3-2 19:50 编辑
r18nix 发表于 2021-3-2 19:37
几年前看过一段时间汇编, 花点时间应该能看懂. 大神有没有较好的思路提供一下呢?

你可以看下 GRUB2 中 drivemap 模块的汇编部分代码 (grub-core/commands/i386/pc/drivemap_int13h.S, 在我的分支下路径为 grub-core/map/pc/drivemap_int13h.S),并基于它修改。
先获取文件的 blocklist,把它存到某个位置,以方便实模式下读取。
然后写一个实模式下根据 blocklist 读磁盘上文件的函数,让你自己写的 int13h handler 用这种方式读磁盘就可以了。
说起来简单,但是汇编下写这个东西比较困难,我的汇编水平也不行,懒得写。
要注意 GRUB2 的许可协议是 GPLv3,如果你对其进行改动,并且分发了软件,那你也要公开源码。
回复

使用道具 举报

 楼主| 发表于 2021-3-2 20:09:03 | 显示全部楼层
wintoflash 发表于 2021-3-2 19:49
你可以看下 GRUB2 中 drivemap 模块的汇编部分代码 (grub-core/commands/i386/pc/drivemap_int13h.S, 在 ...

谢谢
回复

使用道具 举报

 楼主| 发表于 2021-3-15 12:47:28 来自手机 | 显示全部楼层
各位大神有其他思路,也要不吝赐教啊
回复

使用道具 举报

发表于 2021-3-15 18:55:28 | 显示全部楼层
grub2下都是调用grub.exe(grub4dos)来实现的
回复

使用道具 举报

 楼主| 发表于 2021-4-13 10:34:11 | 显示全部楼层
本帖最后由 r18nix 于 2021-4-13 10:46 编辑
wintoflash 发表于 2021-3-2 19:49
你可以看下 GRUB2 中 drivemap 模块的汇编部分代码 (grub-core/commands/i386/pc/drivemap_int13h.S, 在 ...

我注意到你发布了一个ntloader项目, 里面有int13.c 什么的 能否基于这个项目进行? 这个项目里面是否有实现虚拟磁盘呢?
谢谢
回复

使用道具 举报

发表于 2021-4-13 11:48:09 | 显示全部楼层
本帖最后由 wintoflash 于 2021-4-20 13:12 编辑
r18nix 发表于 2021-4-13 10:34
我注意到你发布了一个ntloader项目, 里面有int13.c 什么的 能否基于这个项目进行? 这个项目里面是否有实 ...

我现在很少上论坛,如果有其它问题,可以在telegram上私聊。
---------------------------
我注意到你发布了一个ntloader项目, 里面有int13.c 什么的 能否基于这个项目进行

不一定,要看你想写什么样的磁盘仿真程序。

首先,它是实现了虚拟磁盘的功能。但是,它虚拟的磁盘只对 bootmgr.exe 有效,而且完全位于保护模式下。
你想写的应该是普适的虚拟磁盘 (对所有 BIOS 下的 bootloader 都有效),那就需要自己写一个 BIOS int13 wrapper。
BIOS 中断是只能在实模式下调用的,所以这个 int13 wrapper 也应该是实模式下的,要用汇编写。
当然,你也可以先用少量汇编,从实模式切到保护模式,这样就可以用C语言写了,之后再切回实模式 (这样好像更麻烦)。

要注意,GRUB 的内核是位于内存 0x8000 处的,bootmgr 是要加载到 0x20000 的,
所以,GRUB 启动 bootmgr 或其他 bootloader 之后,GRUB 的数据就被破坏了,即使你切到了保护模式也不能调用 GRUB 的读文件函数来读文件。
那么如何读取磁盘上的文件呢,方法是通过 blocklist 。把文件 (例如 (hd0,1)/xxx.vhd) 在磁盘上存放的位置 (lba+长度) 先保存下来,
这样再读写文件的时候只需要实现读写磁盘上指定扇区的功能就行了,不需要再实现各种文件系统的驱动。

GRUB4DOS 的磁盘仿真是完全在实模式下的,就是通过我所说的这种方式。
ipxe 的好像是先从实模式转保护模式,读完磁盘之后再转回实模式。
回复

使用道具 举报

发表于 2021-4-16 10:07:22 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-22 22:57 编辑

        看楼主的帖子,楼主有一定的编程能力,并且有一定的研究、开发新技术的钻研精神,这个是应该点赞的。

你主要是想实现grub2-BIOS下启动svbus-vhd,非RAMOS,这样子做的目的何在?BIOS下面,非RAMOS模式下,微软的引导器bootmgr不是已经可以直接引导vhd了吗?而且微软有自己的vhd驱动,根本不需要svbus驱动都可以启动vhd。

而且wintoflash的ntloader模块似乎就可以实现直接引导vhd,但我没有尝试,我一般地直接用bootmgr/bootmgfw.efi直接引导vhd,我有兴趣的是仿真到内存的RAMOS模式的vhd启动,比如搭配svbus的vhd-RAMOS。

另一方面来说,BIOS下面已经有了grub4dos这个引导神器,搭配svbus这样子的驱动,也可以直接引导vhd,非RAMOS这种,就是直接map xxx.vhd。

而grub2在BIOS下面的引导能力感觉太弱了。
(1)如果grub2通过MBR扇区引导,需要g2ldr.mbr小于31KB的样子,大小的限制,决定了g2ldr.mbr不能内置太多的模块,只能内置biosdisk part_msdos fat ntfscomp search_fs_file这样子的基本模块,连ntfs.mod都不能内置到里面,否则就会超过MBR63的扇区长度,很不方便,而grub4dos写入MBR引导只需要16个扇区就足够了,完全支持ntfs分区文件读取。grub2是多系统引导器,不能加载ntfs.mod,必须要把grub.cfg放在一个FAT32或者exfat这样子的分区,对于某些启动环境很不方便,因为有的人的MBR硬盘、优盘根本就没有FAT32分区。
(2)很多人主引导是bootmgr,如果想在BCD中添加grub2的引导,限制也很多,BCD-g2ldr引导模式,不能加linux linux16、echo、terminal gfxterm vbe vga udf gzio xzio  reboot halt,否则会出错:“The application or operating system couldn't be loaded because required  file is missing or contains errors.”。导致的问题就是,如果grub2版本号不同,模块也不同,grub2的insmod可能因为不同版本导致加载模块失败,模块化有其好处,但是也有较多弊端。

(3)grub2-BIOS如果作为iso光盘镜像的主引导,引导能力、兼容性也很差劲,一样受制于core.img的大小,限制很不爽。
(4)所以BIOS下我更加喜欢用grub4dos引导grub2的core.img,core.img里面可以打包很多很多模块。就是说用grldr作为第一引导或者第二引导去引导grub2,或者bootmgr引导grub4dos,再去引导grub2。
(5)loopback功能,似乎只能在grub2环境下失效,一般用于搭配linux.iso中的kernel加载,进入linux之后可能就会失效了。windows下面情况估计是类似的,loopback  xxxx.iso还有可能,loopback xxxx.vhd功能可是个新功能,即使成功了也只是在grub2环境有效,windows启动过程中失效后,估计windows启动会失败。
上面的话是什么意思呢?
BIOS下面的grub2引导能力太弱,或者说功能限制太多,grub2直接从MBR引导,或者bootmgr→grub2,或者grub4dos→grub2都有各种优缺点,还不如直接用grub4dos呢,而且GNU grub2似乎很久没有更新了,grub-2.04.tar.gz这个版本还是发布于2019-07-05,这都一年没有动静了。grub2的c语言代码大概100多万行,外加4万行汇编语言,这个体量是非常大的,特别是BIOS下面很多汇编语言,这个估计需要投入很多精力而且需要有很深的功底,首先要看懂他们的编程才能进一步修改,工程量很浩大,不点、bean、chenall、yaya花在grub4dos上面的时间已经很多年了,对于gnu grub leagay进行修改完善,消耗的时间精力是很多的。
https://ftp.gnu.org/gnu/grub/
grub-2.04.tar.gz        2019-07-05 05:45


grub2-BIOS下面,在底层的引导层面都有很多兼容性和诸多限制问题存在,上层的map xxx.vhd功能做得再好,又能有多大的发展前景?除非gnu grub2官方投入人力物力解决底层的问题(目前看起来遥遥无期)。wintoflash一个人魔改了grub2,但是在面对那么庞大的代码库面前,个人的精力和时间是非常有限的。我感觉BIOS下面的grub2目前没有太大的前途。






回复

使用道具 举报

发表于 2021-4-16 11:16:52 | 显示全部楼层
liuzhaoyzz 发表于 2021-4-16 10:07
看楼主的帖子,楼主有一定的编程能力,并且有一定的研究、开发新技术的钻研精神,这个是应该点赞的 ...

应该是bios没前途了
回复

使用道具 举报

发表于 2021-4-16 14:34:27 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-4-16 15:02 编辑
wintoflash 发表于 2021-4-16 14:12
开发者们一直都在开发和维护 GNU GRUB 啊,不知道你的结论从何而来。
http://alpha.gnu.org/gnu/grub/ ...

哦,我的看法看起来有很多误解,gnu grub2果然有更新了。

BIOS下面,我用的就是你魔改过的grub2,我很少用官方的grub2,core.img我记得好像限制大概在450KB左右。


关于loopback和map的根本区别,愿闻其详。loopback是不是只在grub2下面有效?

我也很奇怪和纳闷,为啥不点和你都是非计算机科班出身的,居然能够懂汇编和c,虽然大家上大学学习了计算机编程,但是投入实践感觉上还有很多差别,能够凭借兴趣爱好付出时间精力实现业余梦想,挺好的。UEFI开发,光那个UEFI标准都有2558页英文,开发需要搞懂里面很多东西,我感觉挺难的,所以我一直觉得用汇编和c开发很酷。
        

回复

使用道具 举报

 楼主| 发表于 2021-4-22 15:16:38 | 显示全部楼层
还是直接load grub4dos好用
回复

使用道具 举报

发表于 2021-4-22 19:05:16 | 显示全部楼层
r18nix 发表于 2021-4-22 15:16
还是直接load grub4dos好用

知难而退是好事。
回复

使用道具 举报

发表于 2021-4-30 11:26:31 | 显示全部楼层
wintoflash 发表于 2021-4-22 19:05
知难而退是好事。

大师慢慢来吧,休息些时间,或许哪天突发灵感就攻克了难题。。
回复

使用道具 举报

发表于 2021-5-24 16:51:05 | 显示全部楼层
r18nix 发表于 2021-4-22 15:16
还是直接load grub4dos好用

grub2在UEFI下能load grub4dos到实模式下吗?怎么实现的?
大神有入口示例吗?
回复

使用道具 举报

发表于 2021-5-31 13:22:52 | 显示全部楼层
新手学习,感谢分享。
回复

使用道具 举报

发表于 2021-6-15 09:56:46 | 显示全部楼层
楼主辛苦了,不错,支持
回复

使用道具 举报

发表于 2022-7-18 19:08:25 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-29 07:20

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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