PCIe 장치는 다중 플랫폼 및 아키텍처에서 사용하도록 설계되었습니까?

PCIe 장치는 다중 플랫폼 및 아키텍처에서 사용하도록 설계되었습니까?

일부 PCIe 장치에는 장치를 초기화하는 프로그램을 저장하는 "PCI 확장 ROM" 또는 "PCI 옵션 ROM"이 포함되어 있습니다.

이제 일반적으로 x86 시스템에서 사용되는 PCIe RAID 컨트롤러가 있다고 가정해 보겠습니다. 이제 ARM 시스템에 연결하면 PCIe 장치가 초기화되지 않습니까? 즉, 대부분의 PCIe 장치는 x86에 특정합니까?

답변1

ARM 아키텍처의 PCI 옵션 ROM과 관련된 문제는 다음과 같습니다.

  • x86 어셈블리로 작성된 옵션 ROM은 ARM CPU에서 이해할 수 없습니다.
  • PC BIOS에 의해 실행되는 옵션 ROM(예: ROM은 0x55AA체크섬 및 추가 정보로 시작하고 몇 바이트로 시작함)은 VGA 하드웨어, Intel CPU I/O 포트 등과 같은 PC 아키텍처 하위 수준 세부 정보를 가정합니다.
  • 전체 BIOS 개념은 x86 CPU 및 PC 아키텍처와 밀접하게 결합되어 있으며 어떤 ARM 시스템에도 사용되지 않았습니다.

지금 ...

  • UEFI, BIOS 후속 버전은 x86 이외의 CPU에서 사용되도록 만들어졌습니다.

  • 위의 문제에 대한 해결책은 다음과 같습니다.EFI 바이트 코드- UEFI의 런타임에 의해 해석되어 코드 CPU를 독립적으로 만드는 바이트코드입니다.

  • UEFI를 사용하는 ARM 시스템은 비교적 새로운 시스템입니다(Surface RT가 유일한 시스템일 수도 있습니다). 대부분의 ARM 시스템은 CFE, U-Boot 또는 PC BIOS처럼 작동하지 않는 기타 부팅 펌웨어를 사용합니다.

이제 ARM 시스템에 연결하면 PCIe 장치가 초기화되지 않습니까?

ARM 시스템이 UEFI를 사용하지 않는 한 기회조차 없었을 것입니다. 그렇다면 시스템이 부팅 시 중단될 수 있습니다. EBC는 부팅 ROM 펌웨어에서 널리 사용되지 않습니다.

부팅 ROM은 작동하지 않지만 나중에 부팅되는 OS는 여전히 하드웨어를 제대로 인식하고 사용할 수 있습니다.


부트 ROM의 기능은 무엇입니까?

이전 UEFI 이전 BIOS는 x86 인터럽트 메커니즘을 통해 API를 구현했습니다. 프로그램은 다양한 x86 레지스터를 매개변수로 설정한 다음 x86 INT명령어를 실행해야 합니다.

INTx86 CPU가 테이블의 주소를 조회하고 제어권을 해당 주소로 전송하게 합니다.소프트웨어 인터럽트- 하드웨어는 CPU에도 연결된 인터럽트 컨트롤러와 통신하여 이러한 일이 발생할 수 있습니다.

옵션 ROM을 처리하기 전에 BIOS는 BIOS로 돌아가 API 기능을 수행하는 다양한 주소에 이 테이블을 채웁니다.

MS-DOS는 원래 기능을 BIOS에 의존하여 테이블을 광범위하게 사용합니다.아식입력/영형출력에스시스템. 다른 운영 체제는 일단 제어권을 갖게 되면 BIOS 호출을 사용하지 않고 하드웨어 구동을 위해 자체 드라이버와 메커니즘을 사용합니다.

이 인터럽트 테이블은 RAM에 있으므로 수정될 수 있습니다. 옵션 ROM은 인터럽트 테이블에 "연결"하여 특정 인터럽트의 주소를 ROM의 항목에 덮어쓰고 BIOS API 호출이 옵션 ROM으로 먼저 이동하도록 만들 수 있습니다.

BIOS가 자체적으로 사용하는 BIOS API 호출 중 하나는 13h디스크 장치에서 섹터를 읽는 것입니다. OS(MS-DOS도 포함)를 부팅하려면 하드 드라이브에서 섹터 0을 로드해야 합니다.

BIOS는 플로피 및 IDE 장치와 통신하는 방법을 알고 있지만 그 외에는 아무것도 없습니다. SCSI 카드에는 다시 쓰거나 "후크"할 수 있는 옵션 ROM이 있으며 13h이를 통해 SCSI 드라이브에서 부팅할 수 있습니다. 운영 체제가 MS-DOS인 경우 MS-DOS는 13h디스크 작업에 사용되므로 SCSI 드라이브와 함께 작동할 수 있습니다.

네트워크 부팅은 옵션 ROM이 사용되는 또 다른 상황입니다.

그렇다면 드라이버가 이 문제를 대신 처리하도록 설계할 수 있습니까?

그렇습니다. 그렇습니다. BIOS 옵션 ROM은 실제로 OS 부팅과 선택적으로 구성 메뉴만 지원합니다("RAID 구성으로 들어가려면 Ctrl-A를 누르십시오"는 옵션 ROM에 있으며 BIOS가 초기화 코드를 호출하는 지점에서 표시됩니다).

IIRC Linux는 장치 열거를 다시 처리하며 x86 BIOS의 정보를 거의 무시합니다.

Windows도 그렇게 합니다. x86 BIOS(및 x86 리얼 모드)는 MS-DOS 지원이 가능한 한 계속 중단되었습니다.

답변2

온보드 펌웨어가 있는 대부분의 PCIe 장치는 x86 전용입니다.
온보드 펌웨어는 Intel 호환 환경과 함께 작동하도록 설계되었습니다.

다른 아키텍처용으로 만들어진 장치가 있습니다. 주로 GPU, 스토리지/레이드 및 네트워크 카드입니다. 이들 중 일부는 펌웨어를 플래싱하여 한 아키텍처에서 다른 아키텍처로 변경할 수도 있습니다. 다른 것들은 이중 펌웨어이며 필요에 따라 아키텍처 간에 전환할 수 있습니다.
심지어 UEFI 환경에서 부팅할 때 해당 아키텍처에 적합한 펌웨어를 로드할 수 있는 일부 RAID 컨트롤러도 본 적이 있습니다.
이들 중 대부분은 데이터 센터 등급이며 매우 비쌉니다. 일반 사용자가 야생에서 접할 수 있는 것은 아닙니다.

온보드 펌웨어가 없는 장치(또는 더 잘 말하면 호스트 시스템과 상호 작용하지 않는 온보드 펌웨어)의 경우 드라이버가 있는 모든 아키텍처에서 작동할 수 있습니다.

답변3

OptionROM에는 여러 코드 이미지가 있을 수 있습니다. 확장 ROM

UEFI 사양에는 이러한 다중 이미지 ROM의 목적이 무엇인지에 대한 몇 가지 설명이 있습니다.

The following is a list of the image combinations that may be placed in a PCI option
ROM. This is not an exhaustive list. Instead, it provides what will likely be the most common PCI option
ROM layouts. EFI complaint system firmware must work with all of these PCI option ROM layouts, plus
any other layouts that are possible within the PCI Firmware Specification. The format of a Legacy Option
ROM image is defined in the PCI Firmware Specification.
• Legacy Option ROM image
• IA-32 UEFI driver
• x64 UEFI driver
• AArch32 UEFI driver
• AArch64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver
• Legacy Option ROM image + x64 UEFI driver + AArch64 UEFI driver
• x64 UEFI driver + AArch64 UEFI driver
• Itanium Processor Family UEFI driver
• EBC Driver
In addition to combinations of UEFI drivers with different processor binding, it is also possible to include
multiple drivers of different function but the same processor binding.

(https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf)

보시다시피 OptionROM은 다양한 아키텍처에 대한 이미지를 가질 수 있습니다. 예를 들어 PCI 장치에는 ARM 및 x86 모두에 대한 코드 이미지가 있을 수 있습니다.

시스템 펌웨어는 올바른 머신 유형을 찾기 위해 코드 이미지 헤더 구조를 구문 분석할 수 있습니다.

기계 유형

하지만 이 필드는 edk2에 정의되어 있지만: https://github.com/tianocore/edk2/blob/0ecdcb6142037dd1cdd08660a2349960bcf0270a/MdePkg/Include/IndustryStandard/Pci22.h#L845 실제로 사용되지는 않는 것 같습니다. https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Bus/Pci/PciBusDxe/PciOptionRomSupport.c

업데이트:

이 가이드를 확인하세요https://www.workofard.com/2020/12/aarch64-option-roms-for-amd-gpus/

AMD AARCH64 Gop 드라이버를 PCI 그래픽 카드 OptionROM에 또 다른 코드 이미지로 추가하여 AArch64 시스템에서 부팅 시 그래픽 카드가 작동하도록 하는 방법을 설명합니다.

관련 정보