无忧启动论坛

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

[原创] GRUB4DOS for UEFI

    [复制链接]
 楼主| 发表于 2020-11-7 11:14:14 | 显示全部楼层
(其实我没看懂你这个问题……

你已经说明白了,两种情况都可以挂载。不过第二种情况比较复杂,不像BIOS环境0x80就是第一块硬盘,在UEFI环境其实没有0x80的概念,它能不能分析,分析对不对是未知数,恐怕修改代码。没有测试,只是瞎猜想,第一种情况相对简单。
我原来是想,如果不能挂载第二种情况,我复制插槽时,就把它滤除了。
回复

使用道具 举报

发表于 2020-11-7 11:16:42 | 显示全部楼层
本帖最后由 slore 于 2020-11-7 11:19 编辑
2011yaya2007777 发表于 2020-11-7 11:05
之所以没有尽快上传代码,一是还有些已知遗留问题需要处理,还要清除众多的内部调试代码。二是不知道怎么 ...

[size=36.9444px]GRUB4DOS的BIOS分支、UEFI分支在一起,即有继承性,又方便浏览下载。[size=52.6944px]

[size=52.6944px]
克隆生成一个新仓库,再新开分支提交就行了。同源,代码很容易在多仓库间合并。开发履历会保留了。
代码也都在一起,也会连接到原仓库。
回复

使用道具 举报

发表于 2020-11-7 11:36:07 | 显示全部楼层
本帖最后由 wintoflash 于 2020-11-7 11:54 编辑
2011yaya2007777 发表于 2020-11-7 10:41
终于搞明白了,是启动 Windows 时只认第一光驱!我的电脑内存小,平时只是测试个小空壳iso,所以老是不能重 ...
我知道uefi有引导服务和运行服务性质的代码、数据。那什么时候引导服务数据被清除?是执行了启动镜像(b->start_imag)服务后,由uefi清除的吗?

boot services 里面有个 ExitBootServices。bootloader或者os kernel调用了这个之后,uefi就释放所有的boot services数据。
这个是在转圈之后调用的,应该在winload.efi里面。
我看grub2好像在引导镜像前释放了自己的内存。W大好像没有什么动作。

没有吧。uefi下grub2都是要通过boot services申请内存的,反正到系统启动的时候uefi就会自己放掉。
回复

使用道具 举报

发表于 2020-11-7 11:59:21 | 显示全部楼层
sunsea 发表于 2020-11-7 10:45
第一个问题盲猜是UEFI只告诉Windows这块内存没人用了,然后Windows把它加入可用内存列表分配使用,仅此而 ...

我觉得yaya想弄清楚的是,如果不加--mem,
根据slot找到【镜像所在的】【磁盘位置】,然后直接【读写磁盘】

svbus是怎么把bios下的磁盘和windows下的磁盘对上号的?
比如 (hd0,1)/xxx.vhd,是怎么对应到 E:\xxx.vhd 的。

点评

好的,我下午晚上再看看,争取写个分析帖子出来。  详情 回复 发表于 2020-11-7 12:00
回复

使用道具 举报

发表于 2020-11-7 11:59:41 来自手机 | 显示全部楼层
2011yaya2007777 发表于 2020-11-7 11:14
你已经说明白了,两种情况都可以挂载。不过第二种情况比较复杂,不像BIOS环境0x80就是第一块硬盘,在UEFI ...

先复制吧,我过会回宿舍再阅读一下代码看看具体它怎么找硬盘的。
回复

使用道具 举报

发表于 2020-11-7 12:00:38 来自手机 | 显示全部楼层
wintoflash 发表于 2020-11-7 11:59
我觉得yaya想弄清楚的是,如果不加--mem,

svbus是怎么把bios下的磁盘和windows下的磁盘对上号的?

好的,我下午晚上再看看,争取写个分析帖子出来。
回复

使用道具 举报

发表于 2020-11-7 12:18:57 | 显示全部楼层
将原版win10pe iso解压到FAT32分区的优盘,可以启动

然后将/EFI/Boot/bootx64.efi改名为/EFI/Boot/winpe.efi使用GRUB4DOS for UEFI无法引导

菜单:
title winpe
chainloader /EFI/Boot/winpe.efi

提示Press any key to continue...

求教怎么回事?
回复

使用道具 举报

发表于 2020-11-7 12:42:00 | 显示全部楼层
恭喜,终于支持EFI启动了,开始搞起来
回复

使用道具 举报

发表于 2020-11-7 14:45:41 | 显示全部楼层
2011yaya2007777 发表于 2020-11-7 11:05
之所以没有尽快上传代码,一是还有些已知遗留问题需要处理,还要清除众多的内部调试代码。二是不知道怎么 ...

你要是不会操作,要不先把代码传给我,我研究一下。
回复

使用道具 举报

发表于 2020-11-7 17:09:16 | 显示全部楼层
本帖最后由 sunsea 于 2020-11-7 17:13 编辑

  1.         // get list of disk class devices
  2.         Status = IoGetDeviceInterfaces(&GUID_DEVINTERFACE_DISK,NULL,0,&SymbolicLinkList);
  3.         if(!NT_SUCCESS(Status))
  4.         {
  5.                 return Status;
  6.         }

  7.         // allocate memory for read buffer
  8.         // the minimum buffer size should be 2048 bytes for one CD/DVD-ROM sector
  9.         size = 0x800;
  10.         buf = (PUCHAR)ExAllocatePoolWithTag(PagedPool,size,SVBUS_POOL_TAG);
  11.         if(buf == NULL)
  12.         {
  13.                 return STATUS_INSUFFICIENT_RESOURCES;
  14.         }

  15.         // do this for every disk in the Unicode string list
  16.         for(p = SymbolicLinkList; *p != UNICODE_NULL; p += len)
  17.         {
  18.                 // do not check our own SVBus, this can BSOD with the error "System Thread Exception not handled" if we send IRP_MJ_READ in IoCallDriver of ReadWritePhysicalDisk
  19.                 /*lint -save -e585 Warning 585: The sequence (??\) is not a valid Trigraph sequence */
  20.                 if(RtlCompareMemory(p,L"\\??\\SVBus",(SIZE_T)0x12) != 0x12)
  21.                 /*lint -restore */
  22.                 {
  23.                         // initialize device name unicode string
  24.                         RtlInitUnicodeString(&deviceNameUnicodeString,p);

  25.                         // get a pointer to the top object in the named device object's stack and a pointer to the corresponding file object
  26.                         Status = IoGetDeviceObjectPointer(&deviceNameUnicodeString,FILE_ALL_ACCESS,&FileObject,&FileDeviceObject);
  27.                         if(NT_SUCCESS(Status))
  28.                         {
  29.                                 // CDROM
  30.                                 if(DeviceExtension->Disk.VirtualDeviceType == CDROM)
  31.                                 {
  32.                                         // read possible CD001 location of virtual ISO file on physical disk
  33.                                         ByteOffset.QuadPart = (LONGLONG)DeviceExtension->Disk.ImageStartOffsetInBytes + 0x8000; //算出镜像文件首地址,然后求出特征标记所在地址
  34.                                 }
  35.                                 // HDD and FLOPPY
  36.                                 else
  37.                                 {
  38.                                         // read possible MBR location of virtual hard disk file on physical disk
  39.                                         ByteOffset.QuadPart = (LONGLONG)DeviceExtension->Disk.ImageStartOffsetInBytes;//算出镜像文件首地址,然后求出特征标记所在地址
  40.                                 }

  41.                                 // zero read buffer memory
  42.                                 RtlZeroMemory(buf,size);

  43.                                 // read / write physical disk
  44.                                 Status = ReadWritePhysicalDisk(FileDeviceObject,FileObject,IRP_MJ_READ,buf,(ULONG)size,&ByteOffset);
  45.                                 if(NT_SUCCESS(Status))
  46.                                 {
  47.                                         // CDROM
  48.                                         if(DeviceExtension->Disk.VirtualDeviceType == CDROM)
  49.                                         {
  50.                                                 // check for string "CD001"
  51.                                                 if(buf[1] == 'C' && buf[2] == 'D' && buf[3] == '0' && buf[4] == '0' && buf[5] == '1') //读写,检查标记,对就给过
  52.                                                 {
  53.                                                         // we have found a valid CDROM ISO, save file object and file device object
  54.                                                         DeviceExtension->Disk.FileObject = FileObject;
  55.                                                         DeviceExtension->Disk.FileDeviceObject = FileDeviceObject;
  56.                                                         // free read buffer memory
  57.                                                         ExFreePoolWithTag(buf,SVBUS_POOL_TAG);
  58.                                                         // free list of disks
  59.                                                         ExFreePool(SymbolicLinkList);
  60.                                                         return STATUS_SUCCESS;
  61.                                                 }
  62.                                         }
  63.                                         // HDD and FLOPPY
  64.                                         else if(DeviceExtension->Disk.VirtualDeviceType == HDD || DeviceExtension->Disk.VirtualDeviceType == FLOPPY)
  65.                                         {
  66.                                                 // check for last 2 bytes of a valid MBR
  67.                                                 if(buf[510] == 0x55 && buf[511] == 0xAA) //读写,检查标记,对就给过
  68.                                                 {
  69.                                                         // we have found a valid MBR, save file object and file device object
  70.                                                         DeviceExtension->Disk.FileObject = FileObject;
  71.                                                         DeviceExtension->Disk.FileDeviceObject = FileDeviceObject;
  72.                                                         // free read buffer memory
  73.                                                         ExFreePoolWithTag(buf,SVBUS_POOL_TAG);
  74.                                                         // free list of disks
  75.                                                         ExFreePool(SymbolicLinkList);
  76.                                                         return STATUS_SUCCESS;
  77.                                                 }
  78.                                         }
  79.                                 }

  80.                                 // we have not found a CDROM ISO or an MBR
  81.                                 // dereference the file object, this will also indirectly dereference the device object
  82.                                 ObDereferenceObject(FileObject);
  83.                         }
  84.                 }

  85.                 // get Unicode string length of physical disk
  86.                 // add 2 bytes for Unicode terminating null and continue with the next physical disk in the list
  87.                 len = wcslen(p) + 1;
  88.         }
复制代码

SVBus作者思路就两部:
1,算出镜像文件应该所在物理磁盘上的位置
2,根据位置,逐个检查物理磁盘,读指定位置,看有没有特征标记,有就给过,不再检查

跟那些0x80 0x81没有任何关系……这个思路我只能说牛逼,用最小的代码量覆盖了99%的情况……毕竟两个磁盘上同一位置都有有效标记很罕见……也意味着这个方案应该是可以移植到UEFI下的……

点评

这还真是简单粗暴。 那map信息里面的CHS什么的也用不到吧,只要文件在磁盘上的扇区号或者内存地址信息就行了。  详情 回复 发表于 2020-11-7 19:37
回复

使用道具 举报

发表于 2020-11-7 19:37:53 | 显示全部楼层
sunsea 发表于 2020-11-7 17:09
SVBus作者思路就两部:
1,算出镜像文件应该所在物理磁盘上的位置
2,根据位置,逐个检查物理磁盘,读 ...

这还真是简单粗暴。
那map信息里面的CHS什么的也用不到吧,只要文件在磁盘上的扇区号或者内存地址信息就行了。

点评

似乎还是用了,因为Windows会询问这些磁盘参数,所以Slots里是啥SVBus就填的啥。  详情 回复 发表于 2020-11-7 20:09
回复

使用道具 举报

发表于 2020-11-7 20:09:11 | 显示全部楼层
wintoflash 发表于 2020-11-7 19:37
这还真是简单粗暴。
那map信息里面的CHS什么的也用不到吧,只要文件在磁盘上的扇区号或者内存地址信息就 ...

似乎还是用了,因为Windows会询问这些磁盘参数,所以Slots里是啥SVBus就填的啥。
回复

使用道具 举报

发表于 2020-11-8 00:47:19 | 显示全部楼层
liuzhaoyzz 发表于 2020-11-6 13:29
title /EFI/Microsoft/Boot/bootmgfw.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw.efi
chainloa ...

感谢指导,现在提示:
(hd0,0)
Press any key to continue...

menu.lst写的是:
timeout 55
default 0
font /GRUB/unifont.hex.gz

title /EFI/Microsoft/Boot/bootmgfw1.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw1.efi
chainloader /EFI/Microsoft/Boot/bootmgfw1.efi
回复

使用道具 举报

发表于 2020-11-8 00:49:17 | 显示全部楼层
hyde777 发表于 2020-11-7 12:18
将原版win10pe iso解压到 FAT32分区的优盘,可以启动

然后将/EFI/Boot/bootx64.efi改名为/EFI/Boot/winp ...

同问Press any key to continue...
我启动bootmfw也是这样
回复

使用道具 举报

发表于 2020-11-8 10:55:15 | 显示全部楼层
本帖最后由 2011whp 于 2020-11-8 11:31 编辑

sunsea的系统虚拟总线驱动(svbus)搞的怎么样了,期待中
好像 直接找文件,
希望g4e,在这里留下的标准的 标识变量,并公布出来,最好不是一个ISO,而是总线集合变量
让其它引导也 照样做,形成标准,有利于RAMOS,同时也有利于周边开发
GUID 就用 sunsea建议的 {621F0DF7-B6BB-4334-B16B-3C8AFC883B3A}


回复

使用道具 举报

 楼主| 发表于 2020-11-8 11:48:14 | 显示全部楼层
似乎还是用了,因为Windows会询问这些磁盘参数,所以Slots里是啥SVBus就填的啥

我想了解SVBus使用插槽的情况,可否上传源代码?
回复

使用道具 举报

发表于 2020-11-8 12:35:46 | 显示全部楼层
本帖最后由 sunsea 于 2020-11-8 12:43 编辑
2011yaya2007777 发表于 2020-11-8 11:48
我想了解SVBus使用插槽的情况,可否上传源代码?

https://sourceforge.net/projects/svbus/
在这里直接下载,程序包里就有源代码。
搜索关键词是slots。有什么内核相关的函数看不懂可以问我。

摘录一些:

  1.         DeviceExtension->Disk.DiskGeometry.TracksPerCylinder = DriverExtension->slot[i].max_head + 1;
  2.         DeviceExtension->Disk.DiskGeometry.SectorsPerTrack = DriverExtension->slot[i].to_sector;
  3.         DeviceExtension->Disk.DiskGeometry.BytesPerSector = DeviceExtension->Disk.SectorSize;
  4.         DeviceExtension->Disk.DiskGeometry.Cylinders.QuadPart = (LONGLONG)((DeviceExtension->Disk.ImageSizeInLBAs / DeviceExtension->Disk.DiskGeometry.TracksPerCylinder) / DeviceExtension->Disk.DiskGeometry.SectorsPerTrack);
复制代码
↑CHS直接引用slot


  1.         if(DriverExtension->slot[i].from_cdrom == 1)
  2.         {
  3.                 // set device type and characteristics to CDROM
  4.                 DeviceType = FILE_DEVICE_CD_ROM;
  5.                 DeviceCharacteristics = FILE_REMOVABLE_MEDIA | FILE_READ_ONLY_DEVICE | FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
  6.         }
  7.         // HDD and FLOPPY
  8.         // from_cdrom == 0
  9.         else
  10.         {
  11.                 // FLOPPY
  12.                 if(DriverExtension->slot[i].from_drive < 0x80)
  13.                 {
  14.                         // set device type and characteristics to FLOPPY
  15.                         DeviceType = FILE_DEVICE_DISK;
  16.                         DeviceCharacteristics = FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE | FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
  17.                 }
  18.                 // HDD
  19.                 else
  20.                 {
  21.                         // set device type and characteristics to HDD
  22.                         DeviceType = FILE_DEVICE_DISK;
  23.                         DeviceCharacteristics = FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
  24.                 }
  25.         }
复制代码

↑根据from_drive判断类型。

  1.         // RAM image
  2.         if(DriverExtension->slot[i].to_drive == 0xFF)
  3.         {
  4.                 // set image type to RAM and copy image type string
  5.                 DeviceExtension->Disk.ImageType = RAM;
  6.                 swprintf(DeviceExtension->Disk.wszImageType,L"RAM");
  7.         }
  8.         // DISK image
  9.         else
  10.         {
  11.                 // set image type to DISK and copy image type string
  12.                 DeviceExtension->Disk.ImageType = DISK;
  13.                 swprintf(DeviceExtension->Disk.wszImageType,L"Disk");
  14.         }
复制代码

↑根据to_drive判断镜像所在位置。



  1.                         // do not subtract one sector for the VHD image footer, because we have a floppy image
  2.                         DeviceExtension->Disk.ImageSizeInLBAs = DriverExtension->slot[i].sector_count;
复制代码

↑计算磁盘长度。

  1.         // calculate image start offset in bytes
  2.         // start sector is always based on 512 byte sectors of the HDD
  3.         DeviceExtension->Disk.ImageStartOffsetInBytes = DriverExtension->slot[i].start_sector * 512;
复制代码
↑计算在磁盘上的起始地址。

其他参数好像没用,不过为了保持结构一致和地址不变的话还是保留吧?反正也不占多少空间。
回复

使用道具 举报

 楼主| 发表于 2020-11-8 13:03:11 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-11-8 13:04 编辑
在这里直接下载,程序包里就有源代码

谢谢了。主要是我认为在 UEFI 环境下,chs 参数无用,插槽的 chs 位置被其他参数占用。看来换得做些调整。

那个网站打不开!
回复

使用道具 举报

发表于 2020-11-8 13:11:22 | 显示全部楼层
2011yaya2007777 发表于 2020-11-8 13:03
谢谢了。主要是我认为在 UEFI 环境下,chs 参数无用,插槽的 chs 位置被其他参数占用。看来换得做些调整 ...

Here。里面的SVBus/src文件夹。
SVBus_V1.2_20200428.rar (66.76 KB, 下载次数: 15)
回复

使用道具 举报

发表于 2020-11-8 13:52:15 | 显示全部楼层
终于支持 UEFI 了,太好了!
回复

使用道具 举报

发表于 2020-11-8 14:49:14 | 显示全部楼层
liuzhaoyzz 发表于 2020-10-30 16:07
其实我一直在想能否和BIOS下的grub4dos共用一套菜单,比如MBR磁盘,根目录下有一个menu.lst,BIOS ...

我也想共用一套菜单,建议还是尽量兼容原有的版本命令。

另外,这个版本,搜索菜单并不是默认从根目录开始的:我的机上,EFI分区里有GRUB目录的MENU.LST文件,根目录下也有,结果启动后使用的是GRUB目录下的,而非根目录下的。
回复

使用道具 举报

发表于 2020-11-8 15:30:57 | 显示全部楼层
有阴也有阳 发表于 2020-11-1 00:15
提一个建议,能否把支持UEFI启动的menu.lst菜单的位置设置成EFI/grub/menu.lst,

而原来只支持B ...

附议!这样即使不能同一套菜单,也不至于混乱了。
回复

使用道具 举报

发表于 2020-11-8 18:17:42 | 显示全部楼层
下载了一楼的20201029版本试了下,发现不支持 LZMA 压缩格式、map --mem 不支持 --top 参数。还有,使用 chainloader /bootmgr 提示“cannot load image”,出错信息是“Invalid or unsupported executable format”。使用 chainloader /efi/microsoft/boot/bootmgfw.efi 命令,在输入 boot 后会返回到 grub> 命令行格式。手中有支持传统或/和 EFI 启动的 PE 镜像,没有一个能够启动的。

我是在真机上试的,G5400 CPU + H110主板,BIOS 设置可以双启动,平时默认传统方式启动,测试 G4D 时按 F11 选择 EFI 启动。一个 MBR 格式 120GB SSD 硬盘,分为安装非EFI的WIN7系统分区和工具数据两个区,无 EFI 分区,G4D 识别为 (hd1);另有一个 4TB 机械硬盘,分三个分区,其中第一个分区是 MSR,第二三分区是EFI启动的WIN10系统分区和数据分区,第四个分区是 EFI 分区,G4D识别为 (hd0,3),而 G4D 文件就放在这分区中。


现在感觉连 Windows 都启动不了,一点实用性都没有啊,哪里出错了?

点评

“测试 G4D 时按 F11 选择 EFI 启动” ---- 问题可能就出在这里。 yaya的这个版本G4D,我测试的结果,貌似需要纯UEFI环境 (BIOS/UEFI设置里---选择UEFI OS/关闭安全启动/关闭CSM)。 按Fn键从快捷启动菜单中选U  详情 回复 发表于 2020-11-8 20:51
回复

使用道具 举报

 楼主| 发表于 2020-11-8 18:57:40 | 显示全部楼层
现在没有 --top 这个参数。
chainloader 只能加载 .efi 文件,或者光盘,硬盘。
如果你使用 bootmgfw.efi (或者名称不同,但是内容相同)启动的, 则不能再加载它。
发现不支持 LZMA 压缩格式

应当支持,但是我没有测试。
回复

使用道具 举报

 楼主| 发表于 2020-11-8 19:00:15 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-11-9 07:59 编辑

W大,我 --mem 使用的是 GRUB_EFI_LOADER_DATA,这个不知道会不会被释放?

对于分配页,分配池,我有些疑惑,不知道他们的区别,什么时候使用哪一个?
回复

使用道具 举报

发表于 2020-11-8 20:51:38 | 显示全部楼层
xianglang 发表于 2020-11-8 18:17
下载了一楼的20201029版本试了下,发现不支持 LZMA 压缩格式、map --mem 不支持 --top 参数。还有,使用 ch ...

“测试 G4D 时按 F11 选择 EFI 启动”  ---- 问题可能就出在这里。

yaya的这个版本G4D,我测试的结果,貌似需要纯UEFI环境
(BIOS/UEFI设置里---选择UEFI OS/关闭安全启动/关闭CSM)。
按Fn键从快捷启动菜单中选UEFI是不行的,那样选择的话,
G4D会直接进入命令行状态。
回复

使用道具 举报

发表于 2020-11-8 21:09:29 | 显示全部楼层
本帖最后由 wuwuzz 于 2020-11-8 21:10 编辑

一个小插曲,关于CHS。

我认为,CHS不可或缺。从流出的BIOS/UEFI源代码来看:

在BIOS下
即使引导软件不用CHS,不代表BIOS不用。BIOS在U盘枚举时,(尚未进入引导阶段时),
即开始计算U盘逻辑CHS参数(并计算完毕),等待调用(例如等待用户调用INT 13 Fn8)。

在UEFI下,参见
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=421614

===========
关于windows,记得很久以前,MS的知识库里,谈到NT处理MBR时,有关于
CHS处理方面的内容,时间久远,记不太清了。但有一点,我记得清楚,
实在搞不定硬盘CHS的准确性时,终极办法就是以物理(固件)CHS为基准。

U盘也是同样的道理,BIOS/UEFI计算的基础,就是U盘物理(固件)CHS。

点评

很好奇一个问题,保留CHS除了兼容旧软件之外的意义在哪里?难道有固件或者软件到现在了线性寻址也给不出正确结果?  详情 回复 发表于 2020-11-9 01:14
回复

使用道具 举报

发表于 2020-11-9 01:14:08 来自手机 | 显示全部楼层
wuwuzz 发表于 2020-11-8 21:09
一个小插曲,关于CHS。

我认为,CHS不可或缺。从流出的BIOS/UEFI源代码来看:

很好奇一个问题,保留CHS除了兼容旧软件之外的意义在哪里?难道有固件或者软件到现在了线性寻址也给不出正确结果?

点评

是的,兼容老标准这个原因是确定无疑的。只要INT13还在,CHS就如影相随。  详情 回复 发表于 2020-11-9 09:23
回复

使用道具 举报

发表于 2020-11-9 09:23:48 | 显示全部楼层
本帖最后由 wuwuzz 于 2020-11-9 09:26 编辑
sunsea 发表于 2020-11-9 01:14
很好奇一个问题,保留CHS除了兼容旧软件之外的意义在哪里?难道有固件或者软件到现在了线性寻址也给不出 ...

是的,兼容老标准这个原因是确定无疑的。只要INT13还在,CHS就如影相随。
从代码上看,到了UEFI,似乎也没能把CHS完全剔除掉,历史的遗产(包袱)
太多了。

点评

可还行……那为什么不统一H255S63然后内部转成线性地址呢……还是有老的/不规范固件给不出正确结果还是咋滴……  详情 回复 发表于 2020-11-9 09:41
回复

使用道具 举报

发表于 2020-11-9 09:41:59 来自手机 | 显示全部楼层
wuwuzz 发表于 2020-11-9 09:23
是的,兼容老标准这个原因是确定无疑的。只要INT13还在,CHS就如影相随。
从代码上看,到了UEFI,似乎也 ...

可还行……那为什么不统一H255S63然后内部转成线性地址呢……还是有老的/不规范固件给不出正确结果还是咋滴……

点评

U盘(USB存储设备)内部都是转成LBA访问。 就目前知道的情况,磁盘类设备有很多种(FDD、ZIP、HDD),HS不会一样的... 而新版UEFI又新增了usb key这种(由于没有对应版本的代码可看,所以不了解它是怎么个算法)  详情 回复 发表于 2020-11-9 10:25
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-28 21:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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