有一句话, 是福尔摩斯的名言“排除一切不可能的,剩下的即使再不可能,那也是真相”。我很多次在《名侦探柯南》上看到这句话,在 Debug方面也快成为我的座右铭了,只是中文读起来逻辑上不是很严谨,原文是: When you have eliminated the impossibles,whatever remains,however improbable,must be the truth.
这次,在调试中又遇到了这样的事情。
我编写一个程序,只是简单的把1K大小的内存值写入到一个文件中,但是我惊奇的发现,对内存写入不同值,打开之后的结果和期望会有不同。
先上源代码
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <Protocol/SimpleFileSystem.h> #include <Library/MemoryAllocationLib.h> extern EFI_BOOT_SERVICES *gBS; extern EFI_SYSTEM_TABLE *gST; extern EFI_RUNTIME_SERVICES *gRT; int EFIAPI main ( IN int Argc, IN CHAR16 **Argv ) { UINTN FileSize=1024; EFI_STATUS Status; EFI_FILE_PROTOCOL *Root; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem; EFI_FILE_PROTOCOL *FileHandle=0; UINTN *HandleBuffer; Status = gBS->LocateProtocol( &gEfiSimpleFileSystemProtocolGuid, NULL, (VOID **)&SimpleFileSystem); if (EFI_ERROR(Status)) { Print(L"Cannot find EFI_SIMPLE_FILE_SYSTEM_PROTOCOL \r\n"); return Status; } Status = SimpleFileSystem->OpenVolume(SimpleFileSystem,&Root); if (EFI_ERROR(Status)) { Print(L"OpenVolume error \r\n"); return Status; } Status = Root -> Open(Root, &FileHandle, (CHAR16 *) L"wre.bin", EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0); if (EFI_ERROR(Status) || (FileHandle==0)) { Print(L"Open error \r\n"); return Status; } HandleBuffer = AllocateZeroPool(FileSize); if (HandleBuffer == NULL) { Print(L"Not enough memory!\n"); return Status; } *(HandleBuffer) =1; *(HandleBuffer+1)=2; *(HandleBuffer+2)=3; *(HandleBuffer+3)=4; Print(L"%d\n",(FileSize-4)/4); Print(L"%d\n",sizeof(UINTN)); Print(L"%d\n",sizeof(UINT32)); Print(L"%x\n",HandleBuffer); Print(L"%x\n",HandleBuffer+1); Status = FileHandle -> Write(FileHandle, &FileSize, HandleBuffer); Print(L"Write Done \r\n"); FreePool(HandleBuffer); Status = FileHandle -> Close (FileHandle); return EFI_SUCCESS; }
运行结果会生成 wre.bin, 我用 Notepad++ 打开之后看到的结果是下面,看起来是按照 WORD 写入的而不是我期望的UINT32
而如果把 *(HandleBuffer) =1; 这行修改为 *(HandleBuffer) =0x1111 1111;
打开同样的文件看到的是下面的结果,很明显这才是我期望的:
真正的原因是我用的 Notepad++ 有问题,如果我换一款十六进制编辑软件即可看到正确的结果。比如, HHD Hex Editor Noe。
下面是用 Beyond Compare 比较两次生成文件,查看是否有差别
由此完全可以看出,二者没有差别,我遇到的奇怪现象完全是查看工具导致的。
看到这里,你完全可以和我一起默念“排除一切不可能的,剩下的即使再不可能,那也是真相”。