我的全部工程在Gitee(UEFIPascalOS: UEFI Pascal OS(基于UEFI的Pascal写的操作系统)的源码仓库,现在仅作为展示使用,作为爱好项目,没有实际用途 (gitee.com))上
现在我正在解决一个比较棘手的问题,也就是如下面所示的错误:
InstallProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B E96E3C0
Loading driver at 0x0000DFA0000 EntryPoint=0x0000DFA0204
InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF EA78798
ProtectUefiImageCommon - 0xE96E3C0
- 0x000000000DFA0000 - 0x0000000000007050
PROGRESS CODE: V03058001 I0
CRMD 0xB0
PRMD 0x4
ECFG 0x800
ESTAT 0x480000
ERA 0xDFA16A0
BADV 0x8000000000000000
BADI 0x29C001AC
PC 0x00000DFA16A0
这个错误已经由xen0n大佬解释过了,我定位了一下问题,发现问题出在FPC生成的汇编代码里面,里面有个st.d $t0,$t1,0没有办法执行,问题出在我自己写的efi_initialize函数里面(这条报错的汇编就在我这个函数里面),直接报错,无论禁止优化还是去掉-Ur其效果都是一样的,请问各位大佬有办法解决鄙人的这个问题么,不胜感激哈
efi_initialize函数是这么写的:
procedure efi_initialize(InputImageHandle:efi_handle;InputSystemTable:Pefi_system_table);[public,alias:'EFI_INITIALIZE'];
begin
ParentImageHandle:=InputImageHandle; GlobalSystemTable:=InputSystemTable;
end;
我的主函数是这么写的(一直到第一个函数报错):
program uefiloader;
{$MODE FPC}
uses uefi,binarybase,bootconfig,graphics;
function efi_main(ImageHandle:efi_handle;systemtable:Pefi_system_table):efi_status;{$ifdef cpux86_64}MS_ABI_Default;{$endif}{$ifdef cpui386}cdecl;{$endif}[public,alias:'_start'];
var {For checking elf file}
sfsp:Pefi_simple_file_system_protocol;
fp:Pefi_file_protocol;
efsl:efi_file_system_list;
i,j,count,procindex:natuint;
status:efi_status;
finfo:efi_file_info;
finfosize:natuint;
proccontent:Pointer;
procsize:natuint;
partstr:PWideChar;
gpl:efi_graphics_list;
isgraphics:boolean;
loaderscreenconfig:screen_config;
{For elf structure}
header:elf64_header;
program_headers:^elf64_program_header;
LowAddress,HighAddress:qword;
PageCount:qword;
KernelRelocateBase:qword;
RelocateOffset:qword;
ZeroStart:^qword;
SourceStart,DestStart:^byte;
KernelEntry:Pointer;
bool:array[1..4] of boolean;
{For loading elf files}
initparam:Psys_parameter_item;
param:sys_parameter;
func:sys_parameter_function;
funcandparam:sys_parameter_function_and_parameter;
res:Pointer;
{For memory initializtion}
memorymap:efi_memory_map;
memoryavailable:efi_memory_result;
addressoffset:natuint;
allocaddress:natuint;
begin
{Initialize uefi environment}
efi_initialize(ImageHandle,systemtable);
请问本论坛大佬有没有什么思路和鄙人交流下的?
另外我使用了自己做的elf2efi转换了elf文件到efi文件(这个工具的源码就在我给的链接里面),由于技术原因,这个工具的作用只是把elf头换成pe头,里面的代码是不动的,就是改变了一下代码的绝对位置,相对位置不变。