Windows 使用MSVC工具生成裸机二进制文件的过程是什么?

Windows 使用MSVC工具生成裸机二进制文件的过程是什么?,windows,visual-studio,arm64,firmware,bare-metal,Windows,Visual Studio,Arm64,Firmware,Bare Metal,使用MSVC工具生成裸机二进制文件的过程是什么? 在GNULAND中,您cc编译或as将源代码组装成目标文件,ld将目标文件链接到ELF(使用链接器脚本),然后objcopy将ELF的相关部分作为“固件二进制文件”导出。我想做同样的事情,但只使用MSVC提供的工具 我一直在使用以下ARM64startup.s进行测试: AREA .text, CODE, READONLY start LDR w1, =0xDEADBEEF B . END 假设只需使用0xDEADBEEF加载X1寄存器

使用MSVC工具生成裸机二进制文件的过程是什么?

在GNULAND中,您
cc
编译或
as
将源代码组装成目标文件,
ld
将目标文件链接到ELF(使用链接器脚本),然后
objcopy
将ELF的相关部分作为“固件二进制文件”导出。我想做同样的事情,但只使用MSVC提供的工具

我一直在使用以下ARM64
startup.s进行测试:

 AREA .text, CODE, READONLY
start
 LDR w1, =0xDEADBEEF
 B .
 END
假设只需使用0xDEADBEEF加载X1寄存器的低32位,然后进行自旋。要组装我运行的代码,请执行以下操作:

armasm64.exe startup.s
我猜如果我有一个
peripherals.c
源文件,我需要将
startup.s
peripherals.c
链接到一个可执行文件(COFF?、PE?)中。最后,我需要剥离任何COFF/PE头,以便ARM MCU可以在加载时执行代码。

免责声明:我不在我的专业范围内,在阅读一些Microsoft文档后,我根据使用MSVC工具进行的一些测试提出了一个答案,在问题提出三天后,还没有人提出答案。我希望这一答案将引发更多知情的答案,以便我可以愉快地收回它

“使用MSVC工具生成裸机二进制文件的过程是什么?”这个问题的答案很可能是:“没有”

aarch64 pe.asm

 AREA .text, CODE, READONLY
 EXPORT start
start
 LDR w1, =0xDEADBEEF
 B .
 END
(需要使用
EXPORT
指令公开符号“start”,以便由链接器解析)

装配:

armasm64.exe aarch64-pe.asm
现在,aarch64(版本14.28.29334.0)的链接器仅支持有限的目标子系统列表:

BOOT_APPLICATION,
CONSOLE,
WINDOWS,
NATIVE,
POSIX,
EFI_APPLICATION, EFI_BOOT_SERVICE_DRIVER, EFI_ROM, EFI_RUNTIME_DRIVER
从Microsoft和EFI文档来看,似乎所有这些子系统都需要能够理解
PECOFF
格式的加载程序,或者在
BOOT\u应用程序
子系统的情况下能够运行到
BCD WMI提供程序
环境中

没有所谓的“裸金属”子系统。 当尝试使用
0x0000000040000000
作为基址链接每个子系统的aarch64-pe.obj,但
EFI_ROM
时,链接器退出,显示相同错误,并抱怨起始地址不能小于4GiB:

D:\opt\msvc\arm64>for %I in (BOOT_APPLICATION CONSOLE WINDOWS NATIVE POSIX EFI_APPLICATION EFI_BOOT_SERVICE_DRIVER EFI_ROM EFI_RUNTIME_DRIVER) do link /entry:start /BASE:0x0000000040000000 /subsystem:%I aarch64-pe.obj

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:BOOT_APPLICATION aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:CONSOLE aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:WINDOWS aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:NATIVE aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:POSIX aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_APPLICATION aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_BOOT_SERVICE_DRIVER aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_ROM aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : warning LNK4075: ignoring '/BASE' due to '/SUBSYSTEM:EFI_ROM' specification

D:\opt\msvc\arm64>link /entry:start /BASE:0x0000000040000000 /subsystem:EFI_RUNTIME_DRIVER aarch64-pe.obj
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1355: invalid base address 0x40000000; ARM64 image cannot have base address below 4GB
这可能是裸机嵌入式系统的一个问题,或者这可能需要一个MMU可用,并且已经由。。。从小于4GiB的起始地址禁用MMU开始的裸机程序

对aarch64-pe.efi运行
dumpbin.exe
时,基址似乎被设置为
0000000 180000000
,因为
ldr
指令位于
0x0000000180001000
,并且文件类型被设置为
DLL

dumpbin.exe  /disasm aarch64-pe.efi
File Type: DLL

  0000000180001000: 18000041  ldr         w1,0000000180001008
  0000000180001004: 14000000  b           0000000180001004
  0000000180001008: DEADBEEF

  Summary

        1000 .rdata
        1000 .text
当对链接器以
0x0000000100000000
为基址生成的可执行文件执行
dumpbin.exe
时,文件类型一致为
可执行图像

甚至,
dumpbin.exe
似乎也不提供将生成的可执行文件转换为标准格式的功能,例如
s-record
intel hex


因此,我的结论是,MSVC工具本身就不允许构建aarch64裸机应用程序。

您希望能够在Windows下开发/编译,还是真的希望使用Microsoft arm64汇编程序/链接器?请注意,可用的支持可能要少得多。例如,为了回答您的问题,我试图找到从何处下载armasm64.exe,但没有结果……我真的很想使用MSVC工具链。我从“MSVC V142- VS 2019 C++ AMR64构建工具(V1428)”中获得ARMAS64.EXE,它在VS2019的各个组件的特性安装屏幕中找到。我知道微软现在支持ARM和物联网设备,所以我想也许VisualStudio构建工具现在应该能够支持裸机开发。我花了好几个小时试图强迫MSVC工具链模仿我从GNU经验中了解到的东西,但我开始想,也许Windows开发人员会有更好的思维方式来知道这是否可行。@Frant。。。关于“请注意,可用的支持可能要少得多。”。。。这就是我如此依赖的原因没问题,只是想确定你的需求是什么。我想我早在第一次支持arm的时候就尝试过使用microsoft工具,那时候是个死胡同。当时我也不知道那么多。这仅仅是那些爬山的人中的一个,因为有惩罚还是有真正的目标/期望?可能更适合microsoft论坛或直接与microsoft合作。这是非常棒的信息!谢谢你查到这一切。我正在查看哪些状态:“当设置/DYNAMICBASE:NO选项时,操作系统首先尝试在其指定的…地址加载程序。如果没有足够的空间,系统将重新定位程序。要防止重新定位,请使用/FIXED选项。”奇怪的是,它不会让你覆盖基址。当我今晚有时间的时候,我会玩覆盖基址的游戏。。。您是否有记录4GiB限制的参考资料?如果没有文件证明不具备此功能的原因,我将向VS开发者社区提出功能请求。我没有参考资料,我只是在每次使用小于4GB的基址时收到
ARM64映像的基址不能低于4GB
错误消息。根据,64位可执行文件的默认基址是
0x140000000
。因为
操作系统首先尝试在其指定或默认基址加载程序。如果没有足够的可用空间,系统将重新定位pr